diff options
Diffstat (limited to 'oox/inc/oox')
215 files changed, 32837 insertions, 0 deletions
diff --git a/oox/inc/oox/core/binarycodec.hxx b/oox/inc/oox/core/binarycodec.hxx new file mode 100644 index 000000000000..8abafffa2481 --- /dev/null +++ b/oox/inc/oox/core/binarycodec.hxx @@ -0,0 +1,292 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_BINARYCODEC_HXX +#define OOX_CORE_BINARYCODEC_HXX + +#include <rtl/cipher.h> +#include <rtl/digest.h> + +namespace oox { class AttributeList; } + +namespace oox { +namespace core { + +// ============================================================================ + +class CodecHelper +{ +public: + /** Returns the password hash if it is in the required 16-bit limit. */ + static sal_uInt16 getPasswordHash( const AttributeList& rAttribs, sal_Int32 nElement ); + +private: + CodecHelper(); + ~CodecHelper(); +}; + +// ============================================================================ + +/** Encodes and decodes data from/to protected MS Office documents. + + Implements a simple XOR encoding/decoding algorithm used in MS Office + versions up to MSO 95. + */ +class BinaryCodec_XOR +{ +public: + /** Enumerates codec types supported by this XOR codec implementation. */ + enum CodecType + { + CODEC_WORD, /// MS Word XOR codec. + CODEC_EXCEL /// MS Excel XOR codec. + }; + +public: + /** Default constructor. + + Two-step construction in conjunction with the initKey() and verifyKey() + functions allows to try to initialize with different passwords (e.g. + built-in default password used for Excel workbook protection). + */ + explicit BinaryCodec_XOR( CodecType eCodecType ); + + ~BinaryCodec_XOR(); + + /** Initializes the algorithm with the specified password. + + @param pnPassData + Character array containing the password. Must be zero terminated, + which results in a maximum length of 15 characters. + */ + void initKey( const sal_uInt8 pnPassData[ 16 ] ); + + /** Verifies the validity of the password using the passed key and hash. + + @precond + The codec must be initialized with the initKey() function before + this function can be used. + + @param nKey + Password key value read from the file. + @param nHash + Password hash value read from the file. + + @return + True = test was successful. + */ + bool verifyKey( sal_uInt16 nKey, sal_uInt16 nHash ) const; + + /** Reinitializes the codec to start a new memory block. + + Resets the internal key offset to 0. + + @precond + The codec must be initialized with the initKey() function before + this function can be used. + */ + void startBlock(); + + /** Decodes a block of memory. + + @precond + The codec must be initialized with the initKey() function before + this function can be used. + + @param pnDestData + Destination buffer. Will contain the decrypted data afterwards. + @param pnSrcData + Encrypted data block. + @param nBytes + Size of the passed data blocks. pnDestData and pnSrcData must be of + this size. + + @return + True = decoding was successful (no error occured). + */ + bool decode( + sal_uInt8* pnDestData, + const sal_uInt8* pnSrcData, + sal_Int32 nBytes ); + + /** Lets the cipher skip a specific amount of bytes. + + This function sets the cipher to the same state as if the specified + amount of data has been decoded with one or more calls of decode(). + + @precond + The codec must be initialized with the initKey() function before + this function can be used. + + @param nBytes + Number of bytes to be skipped (cipher "seeks" forward). + + @return + True = skip was successful (no error occured). + */ + bool skip( sal_Int32 nBytes ); + + // static ----------------------------------------------------------------- + + /** Calculates the 16-bit hash value for the given password. + + The password data may be longer than 16 bytes. The array does not need + to be terminated with a null byte (but it can without invalidating the + result). + */ + static sal_uInt16 getHash( const sal_uInt8* pnPassData, sal_Int32 nSize ); + +private: + CodecType meCodecType; /// Codec type. + sal_uInt8 mpnKey[ 16 ]; /// Encryption key. + sal_Int32 mnOffset; /// Key offset. + sal_uInt16 mnBaseKey; /// Base key from password. + sal_uInt16 mnHash; /// Hash value from password. +}; + +// ============================================================================ + +/** Encodes and decodes data from protected MSO 97+ documents. + + This is a wrapper class around low level cryptographic functions from RTL. + Implementation is based on the wvDecrypt package by Caolan McNamara: + http://www.csn.ul.ie/~caolan/docs/wvDecrypt.html + */ +class BinaryCodec_RCF +{ +public: + /** Default constructor. + + Two-step construction in conjunction with the initKey() and verifyKey() + functions allows to try to initialize with different passwords (e.g. + built-in default password used for Excel workbook protection). + */ + explicit BinaryCodec_RCF(); + + ~BinaryCodec_RCF(); + + /** Initializes the algorithm with the specified password and document ID. + + @param pnPassData + Unicode character array containing the password. Must be zero + terminated, which results in a maximum length of 15 characters. + @param pnSalt + Random salt data block read from or written to the file. + */ + void initKey( + const sal_uInt16 pnPassData[ 16 ], + const sal_uInt8 pnSalt[ 16 ] ); + + /** Verifies the validity of the password using the passed salt data. + + @precond + The codec must be initialized with the initKey() function before + this function can be used. + + @param pnVerifier + Verifier block read from the file. + @param pnVerifierHash + Verifier hash read from the file. + + @return + True = test was successful. + */ + bool verifyKey( + const sal_uInt8 pnVerifier[ 16 ], + const sal_uInt8 pnVerifierHash[ 16 ] ); + + /** Rekeys the codec using the specified counter. + + After reading a specific amount of data the cipher algorithm needs to + be rekeyed using a counter that counts the data blocks. + + The block size is for example 512 bytes for MS Word files and 1024 + bytes for MS Excel files. + + @precond + The codec must be initialized with the initKey() function before + this function can be used. + + @param nCounter + Block counter used to rekey the cipher. + */ + bool startBlock( sal_Int32 nCounter ); + + /** Decodes a block of memory. + + @see rtl_cipher_decode() + + @precond + The codec must be initialized with the initKey() function before + this function can be used. + + @param pnDestData + Destination buffer. Will contain the decrypted data afterwards. + @param pnSrcData + Encrypted data block. + @param nBytes + Size of the passed data blocks. pnDestData and pnSrcData must be of + this size. + + @return + True = decoding was successful (no error occured). + */ + bool decode( + sal_uInt8* pnDestData, + const sal_uInt8* pnSrcData, + sal_Int32 nBytes ); + + /** Lets the cipher skip a specific amount of bytes. + + This function sets the cipher to the same state as if the specified + amount of data has been decoded with one or more calls of decode(). + + @precond + The codec must be initialized with the initKey() function before + this function can be used. + + @param nBytes + Number of bytes to be skipped (cipher "seeks" forward). + + @return + True = skip was successful (no error occured). + */ + bool skip( sal_Int32 nBytes ); + +private: + rtlCipher mhCipher; + rtlDigest mhDigest; + sal_uInt8 mpnDigestValue[ RTL_DIGEST_LENGTH_MD5 ]; +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/binaryfilterbase.hxx b/oox/inc/oox/core/binaryfilterbase.hxx new file mode 100644 index 000000000000..bf249cdfab9b --- /dev/null +++ b/oox/inc/oox/core/binaryfilterbase.hxx @@ -0,0 +1,62 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_BINARYFILTERBASE_HXX +#define OOX_CORE_BINARYFILTERBASE_HXX + +#include <rtl/ref.hxx> +#include "oox/core/filterbase.hxx" + +namespace oox { +namespace core { + +// ============================================================================ + +class BinaryFilterBase : public FilterBase +{ +public: + explicit BinaryFilterBase( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxGlobalFactory ); + + virtual ~BinaryFilterBase(); + +private: + virtual StorageRef implCreateStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream ) const; + virtual StorageRef implCreateStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const; +}; + +typedef ::rtl::Reference< BinaryFilterBase > BinaryFilterRef; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/contexthandler.hxx b/oox/inc/oox/core/contexthandler.hxx new file mode 100644 index 000000000000..dd9ac686ff46 --- /dev/null +++ b/oox/inc/oox/core/contexthandler.hxx @@ -0,0 +1,117 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_CONTEXTHANDLER_HXX +#define OOX_CORE_CONTEXTHANDLER_HXX + +#include <boost/shared_ptr.hpp> +#include <rtl/ref.hxx> +#include <cppuhelper/implbase1.hxx> +#include <com/sun/star/xml/sax/XFastContextHandler.hpp> + +namespace com { namespace sun { namespace star { + namespace xml { namespace sax { class XLocator; } } +} } } + +namespace oox { class RecordInputStream; } + +namespace oox { +namespace core { + +class XmlFilterBase; +class FragmentHandler; +struct Relation; +class Relations; + +// ============================================================================ + +class ContextHandler; +typedef ::rtl::Reference< ContextHandler > ContextHandlerRef; + +struct FragmentBaseData; +typedef ::boost::shared_ptr< FragmentBaseData > FragmentBaseDataRef; + +typedef ::cppu::WeakImplHelper1< ::com::sun::star::xml::sax::XFastContextHandler > ContextHandlerImplBase; + +class ContextHandler : public ContextHandlerImplBase +{ +public: + explicit ContextHandler( ContextHandler& rParent ); + virtual ~ContextHandler(); + + /** Returns the filter instance. */ + XmlFilterBase& getFilter() const; + /** Returns the relations of the current fragment. */ + const Relations& getRelations() const; + /** Returns the full path of the current fragment. */ + const ::rtl::OUString& getFragmentPath() const; + + /** Returns the full fragment path for the target of the passed relation. */ + ::rtl::OUString getFragmentPathFromRelation( const Relation& rRelation ) const; + /** Returns the full fragment path for the passed relation identifier. */ + ::rtl::OUString getFragmentPathFromRelId( const ::rtl::OUString& rRelId ) const; + /** Returns the full fragment path for the first relation of the passed type. */ + ::rtl::OUString getFragmentPathFromFirstType( const ::rtl::OUString& rType ) const; + + // com.sun.star.xml.sax.XFastContextHandler interface --------------------- + + virtual void SAL_CALL startFastElement( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL startUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createUnknownChildContext( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL processingInstruction( const ::rtl::OUString& aTarget, const ::rtl::OUString& aData ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + // record context interface ----------------------------------------------- + + virtual ContextHandlerRef createRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void startRecord( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void endRecord( sal_Int32 nRecId ); + +protected: + /** Helper constructor for the FragmentHandler. */ + explicit ContextHandler( const FragmentBaseDataRef& rxBaseData ); + + void implSetLocator( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator >& rxLocator ); + +private: + ContextHandler& operator=( const ContextHandler& ); + +private: + FragmentBaseDataRef mxBaseData; /// Base data of the fragment. +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/contexthandler2.hxx b/oox/inc/oox/core/contexthandler2.hxx new file mode 100644 index 000000000000..48f11c962e38 --- /dev/null +++ b/oox/inc/oox/core/contexthandler2.hxx @@ -0,0 +1,253 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_CONTEXTHANDLER2_HXX +#define OOX_CORE_CONTEXTHANDLER2_HXX + +#include <vector> +#include <boost/shared_ptr.hpp> +#include "tokens.hxx" +#include "oox/helper/attributelist.hxx" +#include "oox/helper/recordinputstream.hxx" +#include "oox/core/contexthandler.hxx" +#include "oox/core/namespaces.hxx" + +namespace oox { +namespace core { + +// ============================================================================ + +struct ContextInfo; + +/** Helper class that provides a context identifier stack. + + Fragment handlers and context handlers derived from this helper class will + track the identifiers of the current context in a stack. The idea is to use + the same instance of a fragment handler or context handler to process + several nested elements in an XML stream. For that, the abstract function + onCreateContext() has to return 'true' for the passed element. + + Derived classes have to implement the createFastChildContext(), + startFastElement(), characters(), and endFastElement() functions from the + com.sun.star.xml.sax.XFastContextHandler interface by simply forwarding + them to the respective implCreateChildContext(), implStartCurrentContext(), + implCharacters(), and implEndCurrentContext() functions of this helper. The + new abstract functions have to be implemented according to the elements to + be processed. + + Similarly, for binary import, derived classes have to forward the + createRecordContext(), startRecord(), and endRecord() functions from the + ContextHandler class to the implCreateRecordContext(), implStartRecord(), + and implEndRecord() functions of this helper. + */ +class ContextHandler2Helper +{ +public: + explicit ContextHandler2Helper( bool bEnableTrimSpace ); + explicit ContextHandler2Helper( const ContextHandler2Helper& rParent ); + virtual ~ContextHandler2Helper(); + + virtual void SAL_CALL acquire() throw() = 0; + virtual void SAL_CALL release() throw() = 0; + + virtual ContextHandler& queryContextHandler() = 0; + + // interface -------------------------------------------------------------- + + /** Will be called if a new context can be created for the passed element. + + Usually 'true' should be returned to improve performance by reusing the + same instance to process several elements. Used by OOXML import only. + */ + virtual ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) = 0; + + /** Will be called if a new context element has been started. + + The current element identifier can be accessed by using + getCurrentContext() or isCurrentContext(). Used by OOXML import only. + */ + virtual void onStartElement( const AttributeList& rAttribs ) = 0; + + /** Will be called if the current context element is about to be left. + + The current element identifier can be accessed by using + getCurrentContext() or isCurrentContext(). Used by OOXML import only. + + @param rChars The characters collected in this element. + */ + virtual void onEndElement( const ::rtl::OUString& rChars ) = 0; + + /** Will be called if a new context can be created for the passed element. + + Usually 'true' should be returned to improve performance by reusing the + same instance to process several elements. Used by OOBIN import only. + */ + virtual ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) = 0; + + /** Will be called if a new record in a binary stream has been started. + + The current record identifier can be accessed by using + getCurrentContext() or isCurrentContext(). Used by OOBIN import only. + */ + virtual void onStartRecord( RecordInputStream& rStrm ) = 0; + + /** Will be called if the current context record is about to be left. + + The current record identifier can be accessed by using + getCurrentContext() or isCurrentContext(). Used by OOBIN import only. + */ + virtual void onEndRecord() = 0; + + // helpers ---------------------------------------------------------------- + + /** Returns the element identifier of the current topmost context. */ + sal_Int32 getCurrentElement() const; + + /** Returns true, if nElement contains the current topmost context. */ + inline bool isCurrentElement( sal_Int32 nElement ) const + { return getCurrentElement() == nElement; } + + /** Returns true, if either nElement1 or nElement2 contain the current topmost context. */ + inline bool isCurrentElement( sal_Int32 nElement1, sal_Int32 nElement2 ) const + { return isCurrentElement( nElement1 ) || isCurrentElement( nElement2 ); } + + /** Returns the element identifier of the specified parent context. */ + sal_Int32 getPreviousElement( sal_Int32 nCountBack = 1 ) const; + + /** Returns the element identifier of the specified parent context. */ + inline sal_Int32 isPreviousElement( sal_Int32 nElement, sal_Int32 nCountBack = 1 ) const + { return getPreviousElement( nCountBack ) == nElement; } + + /** Returns true, if the current element is the root element. */ + bool isRootElement() const; + + // implementation --------------------------------------------------------- + +protected: + /** Must be called from createFastChildContext() in derived classes. */ + ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > + implCreateChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ); + + /** Must be called from startFastElement() in derived classes. */ + void implStartCurrentContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ); + + /** Must be called from characters() in derived classes. */ + void implCharacters( const ::rtl::OUString& rChars ); + + /** Must be called from endFastElement() in derived classes. */ + void implEndCurrentContext( sal_Int32 nElement ); + + /** Must be called from createRecordContext() in derived classes. */ + ContextHandlerRef implCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + + /** Must be called from startRecord() in derived classes. */ + void implStartRecord( sal_Int32 nRecId, RecordInputStream& rStrm ); + + /** Must be called from endRecord() in derived classes. */ + void implEndRecord( sal_Int32 nRecId ); + +private: + ContextHandler2Helper& operator=( const ContextHandler2Helper& ); + + ContextInfo& pushContextInfo( sal_Int32 nElement ); + void popContextInfo(); + void appendCollectedChars(); + +private: + typedef ::std::vector< ContextInfo > ContextStack; + typedef ::boost::shared_ptr< ContextStack > ContextStackRef; + + ContextStackRef mxContextStack; /// Stack of processed contexts. + size_t mnRootStackSize; /// Stack size on construction time. + bool mbEnableTrimSpace; /// True = trim whitespace in characters(). +}; + +// ============================================================================ + +class ContextHandler2 : public ContextHandler, public ContextHandler2Helper +{ +public: + explicit ContextHandler2( ContextHandler2Helper& rParent ); + virtual ~ContextHandler2(); + + // resolve ambiguity from base classes + virtual void SAL_CALL acquire() throw() { ContextHandler::acquire(); } + virtual void SAL_CALL release() throw() { ContextHandler::release(); } + + virtual ContextHandler& queryContextHandler(); + + // com.sun.star.xml.sax.XFastContextHandler interface --------------------- + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL startFastElement( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL characters( const ::rtl::OUString& rChars ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL endFastElement( sal_Int32 nElement ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + // oox.core.ContextHandler interface -------------------------------------- + + virtual ContextHandlerRef createRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void startRecord( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void endRecord( sal_Int32 nRecId ); + + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onStartRecord( RecordInputStream& rStrm ); + virtual void onEndRecord(); +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/fasttokenhandler.hxx b/oox/inc/oox/core/fasttokenhandler.hxx new file mode 100644 index 000000000000..84baccabdc67 --- /dev/null +++ b/oox/inc/oox/core/fasttokenhandler.hxx @@ -0,0 +1,65 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_FASTTOKENHANDLER_HXX +#define OOX_CORE_FASTTOKENHANDLER_HXX + +#include <com/sun/star/xml/sax/XFastTokenHandler.hpp> +#include <cppuhelper/implbase1.hxx> + +namespace oox { class TokenMap; } + +namespace oox { +namespace core { + +// ============================================================================ + +/** Wrapper implementing the com.sun.star.xml.sax.XFastTokenHandler API interface + that provides access to the tokens generated from the internal token name list. + */ +class FastTokenHandler : public ::cppu::WeakImplHelper1< ::com::sun::star::xml::sax::XFastTokenHandler > +{ +public: + explicit FastTokenHandler(); + virtual ~FastTokenHandler(); + + virtual sal_Int32 SAL_CALL getToken( const ::rtl::OUString& rIdentifier ) throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getIdentifier( sal_Int32 nToken ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getUTF8Identifier( sal_Int32 nToken ) throw (::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getTokenFromUTF8( const ::com::sun::star::uno::Sequence< sal_Int8 >& Identifier ) throw (::com::sun::star::uno::RuntimeException); + +private: + const TokenMap& mrTokenMap; /// Reference to global token map singleton. +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/filterbase.hxx b/oox/inc/oox/core/filterbase.hxx new file mode 100644 index 000000000000..b086538db73e --- /dev/null +++ b/oox/inc/oox/core/filterbase.hxx @@ -0,0 +1,302 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_FILTERBASE_HXX +#define OOX_CORE_FILTERBASE_HXX + +#include <memory> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/document/XImporter.hpp> +#include <com/sun/star/document/XExporter.hpp> +#include <com/sun/star/document/XFilter.hpp> +#include <com/sun/star/io/XInputStream.hpp> +#include <com/sun/star/io/XOutputStream.hpp> +#include <com/sun/star/io/XStream.hpp> +#include <cppuhelper/basemutex.hxx> +#include <cppuhelper/implbase5.hxx> +#include "oox/helper/binarystreambase.hxx" +#include "oox/helper/storagebase.hxx" +#include "oox/dllapi.h" + +namespace com { namespace sun { namespace star { + namespace lang { class XMultiServiceFactory; } + namespace awt { struct DeviceInfo; } + namespace frame { class XModel; } + namespace task { class XStatusIndicator; } + namespace task { class XInteractionHandler; } + namespace io { class XInputStream; } + namespace io { class XOutputStream; } + namespace io { class XStream; } + namespace graphic { class XGraphic; } +} } } + +namespace comphelper { + class IDocPasswordVerifier; + class MediaDescriptor; +} + +namespace oox { + class GraphicHelper; + class ModelObjectHelper; +} + +namespace oox { namespace ole { + class OleObjectHelper; +} } + +namespace oox { +namespace core { + +// ============================================================================ + +struct FilterBaseImpl; + +typedef ::cppu::WeakImplHelper5< + ::com::sun::star::lang::XServiceInfo, + ::com::sun::star::lang::XInitialization, + ::com::sun::star::document::XImporter, + ::com::sun::star::document::XExporter, + ::com::sun::star::document::XFilter > + FilterBaseBase; + +class OOX_DLLPUBLIC FilterBase : public FilterBaseBase, public ::cppu::BaseMutex +{ +public: + explicit FilterBase( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxGlobalFactory ); + + virtual ~FilterBase(); + + /** Returns true, if filter is an import filter. */ + bool isImportFilter() const; + /** Returns true, if filter is an export filter. */ + bool isExportFilter() const; + + /** Derived classes implement import of the entire document. */ + virtual bool importDocument() = 0; + + /** Derived classes implement export of the entire document. */ + virtual bool exportDocument() = 0; + + // ------------------------------------------------------------------------ + + /** Returns the specified argument passed through the XInitialization interface. */ + ::com::sun::star::uno::Any getArgument( const ::rtl::OUString& rArgName ) const; + + /** Returns the global service factory passed in the filter constructor (always existing). */ + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& + getGlobalFactory() const; + + /** Returns the media descriptor. */ + ::comphelper::MediaDescriptor& getMediaDescriptor() const; + + /** Returns the document model (always existing). */ + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& + getModel() const; + + /** Returns the service factory provided by the document model (always existing). */ + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& + getModelFactory() const; + + /** Returns the status indicator (may be null). */ + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XStatusIndicator >& + getStatusIndicator() const; + + /** Returns the status interaction handler (may be null). */ + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& + getInteractionHandler() const; + + /** Returns the URL of the imported or exported file. */ + const ::rtl::OUString& getFileUrl() const; + + /** Returns an absolute URL for the passed relative or absolute URL. */ + ::rtl::OUString getAbsoluteUrl( const ::rtl::OUString& rUrl ) const; + + /** Returns the base storage of the imported/exported file. */ + StorageRef getStorage() const; + + /** Opens and returns the specified sub storage from the base storage. + + @param rStorageName + The name of the embedded storage. The name may contain slashes to + open storages from embedded substorages. + @param bCreate + True = create missing sub storages (for export filters). + */ + StorageRef openSubStorage( + const ::rtl::OUString& rStorageName, + bool bCreate ) const; + + /** Opens and returns the specified input stream from the base storage. + + @param rStreamName + The name of the embedded storage stream. The name may contain + slashes to open streams from embedded substorages. If base stream + access has been enabled in the storage, the base stream can be + accessed by passing an empty string as stream name. + */ + ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + openInputStream( const ::rtl::OUString& rStreamName ) const; + + /** Opens and returns the specified output stream from the base storage. + + @param rStreamName + The name of the embedded storage stream. The name may contain + slashes to open streams from embedded substorages. If base stream + access has been enabled in the storage, the base stream can be + accessed by passing an empty string as stream name. + */ + ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + openOutputStream( const ::rtl::OUString& rStreamName ) const; + + /** Commits changes to base storage (and substorages) */ + void commitStorage() const; + + // helpers ---------------------------------------------------------------- + + /** Returns a helper for the handling of graphics and graphic objects. */ + GraphicHelper& getGraphicHelper() const; + + /** Returns a helper with containers for various named drawing objects for + the imported document. */ + ModelObjectHelper& getModelObjectHelper() const; + + /** Returns a helper for the handling of OLE obejcts. */ + ::oox::ole::OleObjectHelper& getOleObjectHelper() const; + + /** Returns information about the output device. */ + const ::com::sun::star::awt::DeviceInfo& getDeviceInfo() const; + /** Converts the passed value from horizontal screen pixels to 1/100 mm. */ + sal_Int32 convertScreenPixelX( double fPixelX ) const; + /** Converts the passed value from vertical screen pixels to 1/100 mm. */ + sal_Int32 convertScreenPixelY( double fPixelY ) const; + + /** Returns a system color specified by the passed XML token identifier. */ + sal_Int32 getSystemColor( sal_Int32 nToken, sal_Int32 nDefaultRgb = API_RGB_TRANSPARENT ) const; + /** Derived classes may implement to resolve a scheme color from the passed XML token identifier. */ + virtual sal_Int32 getSchemeColor( sal_Int32 nToken ) const; + /** Derived classes may implement to resolve a palette index to an RGB color. */ + virtual sal_Int32 getPaletteColor( sal_Int32 nPaletteIdx ) const; + + /** Requests a password from the media descriptor or from the user. On + success, the password will be inserted into the media descriptor. */ + ::rtl::OUString requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ) const; + + /** Imports the raw binary data from the specified stream. + @return True, if the data could be imported from the stream. */ + bool importBinaryData( StreamDataSequence& orDataSeq, const ::rtl::OUString& rStreamName ); + + /** Imports a graphic from the storage stream with the passed path and name. */ + ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > + importEmbeddedGraphic( const ::rtl::OUString& rStreamName ) const; + /** Imports a graphic object from the storage stream with the passed path and name. */ + ::rtl::OUString importEmbeddedGraphicObject( const ::rtl::OUString& rStreamName ) const; + + // com.sun.star.lang.XServiceInfo interface ------------------------------- + + virtual ::rtl::OUString SAL_CALL + getImplementationName() + throw( ::com::sun::star::uno::RuntimeException ); + + virtual sal_Bool SAL_CALL + supportsService( const ::rtl::OUString& rServiceName ) + throw( ::com::sun::star::uno::RuntimeException ); + + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL + getSupportedServiceNames() + throw( ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.lang.XInitialization interface ---------------------------- + + /** Receives user defined arguments. + + @param rArgs + the sequence of arguments passed to the filter. The implementation + expects one or two arguments. The first argument shall be the + com.sun.star.lang.XMultiServiceFactory interface of the global + service factory. The optional second argument may contain a + sequence of com.sun.star.beans.NamedValue objects. The different + filter implemetations may support different arguments. + */ + virtual void SAL_CALL initialize( + const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rArgs ) + throw( ::com::sun::star::uno::Exception, + ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.document.XImporter interface ------------------------------ + + virtual void SAL_CALL setTargetDocument( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& rxDocument ) + throw( ::com::sun::star::lang::IllegalArgumentException, + ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.document.XExporter interface ------------------------------ + + virtual void SAL_CALL setSourceDocument( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& rxDocument ) + throw( ::com::sun::star::lang::IllegalArgumentException, + ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.document.XFilter interface -------------------------------- + + virtual sal_Bool SAL_CALL filter( + const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rMediaDescSeq ) + throw( ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL cancel() + throw( ::com::sun::star::uno::RuntimeException ); + + // ------------------------------------------------------------------------ +protected: + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + implGetInputStream( ::comphelper::MediaDescriptor& rMediaDesc ) const; + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > + implGetOutputStream( ::comphelper::MediaDescriptor& rMediaDesc ) const; + +private: + void setMediaDescriptor( + const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rMediaDescSeq ); + + virtual ::rtl::OUString implGetImplementationName() const = 0; + + virtual StorageRef implCreateStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream ) const = 0; + virtual StorageRef implCreateStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const = 0; + +private: + ::std::auto_ptr< FilterBaseImpl > mxImpl; +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/filterdetect.hxx b/oox/inc/oox/core/filterdetect.hxx new file mode 100644 index 000000000000..e38008305d71 --- /dev/null +++ b/oox/inc/oox/core/filterdetect.hxx @@ -0,0 +1,165 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_FILTERDETECT_HXX +#define OOX_CORE_FILTERDETECT_HXX + +#include <vector> +#include <com/sun/star/document/XExtendedFilterDetection.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp> +#include <cppuhelper/implbase1.hxx> +#include <cppuhelper/implbase2.hxx> +#include "oox/dllapi.h" + +namespace com { namespace sun { namespace star { + namespace io { class XInputStream; } +} } } + +namespace comphelper { class MediaDescriptor; } +namespace oox { class AttributeList; } + +namespace oox { +namespace core { + +// ============================================================================ + +/** Document handler specifically designed for detecting OOXML file formats. + + It takes a reference to the filter string object via its constructor, and + puts the name of the detected filter to it, if it successfully finds one. + */ +class FilterDetectDocHandler : public ::cppu::WeakImplHelper1< ::com::sun::star::xml::sax::XFastDocumentHandler > +{ +public: + explicit FilterDetectDocHandler( ::rtl::OUString& rFilter ); + virtual ~FilterDetectDocHandler(); + + // XFastDocumentHandler + virtual void SAL_CALL startDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setDocumentLocator( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator >& xLocator ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + // XFastContextHandler + virtual void SAL_CALL startFastElement( sal_Int32 nElement, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL startUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endFastElement( sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< XFastContextHandler > SAL_CALL createUnknownChildContext( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL processingInstruction( const ::rtl::OUString& aTarget, const ::rtl::OUString& aData ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + void parseRelationship( const AttributeList& rAttribs ); + + ::rtl::OUString getFilterNameFromContentType( const ::rtl::OUString& rContentType ) const; + void parseContentTypesDefault( const AttributeList& rAttribs ); + void parseContentTypesOverride( const AttributeList& rAttribs ); + +private: + typedef ::std::vector< sal_Int32 > ContextVector; + + ::rtl::OUString& mrFilterName; + ContextVector maContextStack; + ::rtl::OUString maTargetPath; +}; + +// ============================================================================ + +class OOX_DLLPUBLIC FilterDetect : public ::cppu::WeakImplHelper2< ::com::sun::star::document::XExtendedFilterDetection, ::com::sun::star::lang::XServiceInfo > +{ +public: + explicit FilterDetect( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory ); + virtual ~FilterDetect(); + + /** Tries to extract an unencrypted ZIP package from the passed media + descriptor. + + First, this function checks if the input stream provided by the media + descriptor property 'InputStream' contains a ZIP package. If yes, this + stream is returned. + + Second, this function checks if the 'ComponentData' property exists and + contains a sequence of com.sun.star.beans.NamedValue. If yes, a named + value is searched with the name 'DecryptedPackage' and a value of type + com.sun.star.io.XStream. If the input stream provided by this XStream + contains a ZIP package, this input stream is returned. + + Third, this function checks if the input stream of the media descriptor + contains an OLE package. If yes, it checks the existence of the streams + 'EncryptionInfo' and 'EncyptedPackage' and tries to decrypt the package + into a temporary file. This may include requesting a password from the + media descriptor property 'Password' or from the user, using the + interaction handler provided by the descriptor. On success, and if the + decrypted package is a ZIP package, the XStream of the temporary file + is stored in the property 'ComponentData' of the media descriptor and + its input stream is returned. + */ + ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + extractUnencryptedPackage( ::comphelper::MediaDescriptor& rMediaDesc ) const; + + // com.sun.star.lang.XServiceInfo interface ------------------------------- + + virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& rServiceName ) throw( ::com::sun::star::uno::RuntimeException ); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.document.XExtendedFilterDetection interface --------------- + + /** Detects MS Office 2007 file types and supports package decryption. + + The following file types are detected: + - MS Word 2007 XML Document (*.docx, *.docm) + - MS Word 2007 XML Template (*.dotx, *.dotm) + - MS Excel 2007 XML Document (*.xlsx, *.xlsm) + - MS Excel 2007 BIFF12 Document (*.xlsb) + - MS Excel 2007 XML Template (*.xltx, *.xltm) + - MS Powerpoint 2007 XML Document (*.pptx, *.pptm) + - MS Powerpoint 2007 XML Template (*.potx, *.potm) + + If the package is encrypted, the detection tries to decrypt it into a + temporary file. The user may be asked for a password. The XStream + interface of the temporary file will be stored in the 'ComponentData' + property of the passed media descriptor. + */ + virtual ::rtl::OUString SAL_CALL detect( + ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rMediaDescSeq ) + throw( ::com::sun::star::uno::RuntimeException ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxFactory; +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/fragmenthandler.hxx b/oox/inc/oox/core/fragmenthandler.hxx new file mode 100644 index 000000000000..26d2ac540a7a --- /dev/null +++ b/oox/inc/oox/core/fragmenthandler.hxx @@ -0,0 +1,137 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_FRAGMENTHANDLER_HXX +#define OOX_CORE_FRAGMENTHANDLER_HXX + +#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp> +#include <cppuhelper/implbase1.hxx> +#include "oox/core/contexthandler.hxx" +#include "oox/core/relations.hxx" + +namespace com { namespace sun { namespace star { + namespace io { class XInputStream; } +} } } + +namespace oox { +namespace core { + +// ============================================================================ + +/** Base data of a fragment. + + This data is stored in a separate struct to make it accessible in every + child context handler of the fragment. + */ +struct FragmentBaseData +{ + XmlFilterBase& mrFilter; + const ::rtl::OUString maFragmentPath; + ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator > + mxLocator; + RelationsRef mxRelations; + + explicit FragmentBaseData( + XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + RelationsRef xRelations ); +}; + +// ============================================================================ + +/** Describes record identifiers used to create contexts in a binary stream. + + If a record is used to start a new context, usually the record identifier + increased by 1 is used to mark the end of this context, e.g. the Excel + record SHEETDATA == 0x0091 starts the <sheetData> context, and the record + SHEETDATA_END == 0x0092 ends this context. But some records are used to + start a new context, though there is no identifier to end this context, + e.g. the ROW or EXTROW records. These record identifiers can be marked by + setting the mnEndRecId member of this struct to -1. + */ +struct RecordInfo +{ + sal_Int32 mnStartRecId; /// Record identifier for context start. + sal_Int32 mnEndRecId; /// Record identifier for context end, -1 = no record. +}; + +// ============================================================================ + +typedef ::cppu::ImplInheritanceHelper1< ContextHandler, ::com::sun::star::xml::sax::XFastDocumentHandler > FragmentHandlerImplBase; + +class FragmentHandler : public FragmentHandlerImplBase +{ +public: + explicit FragmentHandler( XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath ); + virtual ~FragmentHandler(); + + /** Returns the com.sun.star.xml.sax.XFastContextHandler interface of this context. */ + inline ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > + getFastContextHandler() { return static_cast< ContextHandler* >( this ); } + + // com.sun.star.xml.sax.XFastDocumentHandler interface -------------------- + + virtual void SAL_CALL startDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setDocumentLocator( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator >& rxLocator ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + // com.sun.star.xml.sax.XFastContextHandler interface --------------------- + + virtual void SAL_CALL startFastElement( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL startUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createUnknownChildContext( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL processingInstruction( const ::rtl::OUString& aTarget, const ::rtl::OUString& aData ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + // XML stream handling ---------------------------------------------------- + + /** Opens the fragment stream referred by the own fragment path. Derived + classes may provide specilized stream implementations. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + openFragmentStream() const; + + // binary records --------------------------------------------------------- + + virtual const RecordInfo* getRecordInfos() const; + +protected: + explicit FragmentHandler( XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, RelationsRef xRelations ); +}; + +typedef ::rtl::Reference< FragmentHandler > FragmentHandlerRef; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/fragmenthandler2.hxx b/oox/inc/oox/core/fragmenthandler2.hxx new file mode 100644 index 000000000000..9b864260b853 --- /dev/null +++ b/oox/inc/oox/core/fragmenthandler2.hxx @@ -0,0 +1,115 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_FRAGMENTHANDLER2_HXX +#define OOX_CORE_FRAGMENTHANDLER2_HXX + +#include "oox/core/contexthandler2.hxx" +#include "oox/core/fragmenthandler.hxx" + +namespace oox { +namespace core { + +// ============================================================================ + +class FragmentHandler2 : public FragmentHandler, public ContextHandler2Helper +{ +public: + explicit FragmentHandler2( + XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + bool bEnableTrimSpace = true ); + virtual ~FragmentHandler2(); + + // resolve ambiguity from base classes + virtual void SAL_CALL acquire() throw() { FragmentHandler::acquire(); } + virtual void SAL_CALL release() throw() { FragmentHandler::release(); } + + virtual ContextHandler& queryContextHandler(); + + // com.sun.star.xml.sax.XFastContextHandler interface --------------------- + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL startFastElement( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL characters( const ::rtl::OUString& rChars ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL endFastElement( sal_Int32 nElement ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.xml.sax.XFastDocumentHandler interface -------------------- + + virtual void SAL_CALL startDocument() + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL endDocument() + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::uno::RuntimeException ); + + // oox.core.ContextHandler interface -------------------------------------- + + virtual ContextHandlerRef createRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void startRecord( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void endRecord( sal_Int32 nRecId ); + + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onStartRecord( RecordInputStream& rStrm ); + virtual void onEndRecord(); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual void initializeImport(); + virtual void finalizeImport(); +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/recordparser.hxx b/oox/inc/oox/core/recordparser.hxx new file mode 100644 index 000000000000..e499195c52f8 --- /dev/null +++ b/oox/inc/oox/core/recordparser.hxx @@ -0,0 +1,98 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_RECORDPARSER_HXX +#define OOX_CORE_RECORDPARSER_HXX + +#include <map> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/io/IOException.hpp> +#include <com/sun/star/xml/sax/SAXException.hpp> +#include <rtl/ref.hxx> +#include "oox/helper/binaryinputstream.hxx" + +namespace oox { +namespace core { + +class FragmentHandler; +struct RecordInfo; + +namespace prv { class Locator; } +namespace prv { class ContextStack; } + +// ============================================================================ + +struct RecordInputSource +{ + BinaryInputStreamRef mxInStream; + ::rtl::OUString maPublicId; + ::rtl::OUString maSystemId; +}; + +// ============================================================================ + +class RecordParser +{ +public: + explicit RecordParser(); + virtual ~RecordParser(); + + void setFragmentHandler( const ::rtl::Reference< FragmentHandler >& rxHandler ); + + void parseStream( const RecordInputSource& rInputSource ) + throw( ::com::sun::star::xml::sax::SAXException, + ::com::sun::star::io::IOException, + ::com::sun::star::uno::RuntimeException ); + + inline const RecordInputSource& getInputSource() const { return maSource; } + +private: + /** Returns a RecordInfo struct that contains the passed record identifier + as context start identifier. */ + const RecordInfo* getStartRecordInfo( sal_Int32 nRecId ) const; + /** Returns a RecordInfo struct that contains the passed record identifier + as context end identifier. */ + const RecordInfo* getEndRecordInfo( sal_Int32 nRecId ) const; + +private: + typedef ::std::map< sal_Int32, RecordInfo > RecordInfoMap; + + RecordInputSource maSource; + ::rtl::Reference< FragmentHandler > mxHandler; + ::rtl::Reference< prv::Locator > mxLocator; + ::std::auto_ptr< prv::ContextStack > mxStack; + RecordInfoMap maStartMap; + RecordInfoMap maEndMap; +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/core/relations.hxx b/oox/inc/oox/core/relations.hxx new file mode 100644 index 000000000000..4ca8ca3899e7 --- /dev/null +++ b/oox/inc/oox/core/relations.hxx @@ -0,0 +1,102 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_RELATIONS +#define OOX_CORE_RELATIONS + +#include <map> +#include <boost/shared_ptr.hpp> +#include "oox/helper/helper.hxx" + +namespace oox { +namespace core { + +/** Expands to an OUString containing an officeDocument relation type created + from the passed literal(!) ASCII(!) character array. */ +#define CREATE_OFFICEDOC_RELATIONSTYPE( ascii ) \ + CREATE_OUSTRING( "http://schemas.openxmlformats.org/officeDocument/2006/relationships/" ascii ) + +/** Expands to an OUString containing an MS Office specific relation type + created from the passed literal(!) ASCII(!) character array. */ +#define CREATE_MSOFFICE_RELATIONSTYPE( ascii ) \ + CREATE_OUSTRING( "http://schemas.microsoft.com/office/2006/relationships/" ascii ) + +// ============================================================================ + +struct Relation +{ + ::rtl::OUString maId; + ::rtl::OUString maType; + ::rtl::OUString maTarget; + bool mbExternal; + + inline explicit Relation() : mbExternal( false ) {} +}; + +// ============================================================================ + +class Relations; +typedef ::boost::shared_ptr< Relations > RelationsRef; + +class Relations : public ::std::map< ::rtl::OUString, Relation > +{ +public: + explicit Relations( const ::rtl::OUString& rFragmentPath ); + + /** Returns the path of the fragment this relations collection is related to. */ + inline const ::rtl::OUString& getFragmentPath() const { return maFragmentPath; } + + /** Returns the relation with the passed relation identifier. */ + const Relation* getRelationFromRelId( const ::rtl::OUString& rId ) const; + /** Returns the first relation with the passed type. */ + const Relation* getRelationFromFirstType( const ::rtl::OUString& rType ) const; + /** Finds all relations associated with the passed type. */ + RelationsRef getRelationsFromType( const ::rtl::OUString& rType ) const; + + /** Returns the external target of the relation with the passed relation identifier. */ + ::rtl::OUString getExternalTargetFromRelId( const ::rtl::OUString& rRelId ) const; + /** Returns the external target of the first relation with the passed type. */ + ::rtl::OUString getExternalTargetFromFirstType( const ::rtl::OUString& rType ) const; + + /** Returns the full fragment path for the target of the passed relation. */ + ::rtl::OUString getFragmentPathFromRelation( const Relation& rRelation ) const; + /** Returns the full fragment path for the passed relation identifier. */ + ::rtl::OUString getFragmentPathFromRelId( const ::rtl::OUString& rRelId ) const; + /** Returns the full fragment path for the first relation of the passed type. */ + ::rtl::OUString getFragmentPathFromFirstType( const ::rtl::OUString& rType ) const; + +private: + ::rtl::OUString maFragmentPath; +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif // OOX_CORE_RELATIONS + diff --git a/oox/inc/oox/core/relationshandler.hxx b/oox/inc/oox/core/relationshandler.hxx new file mode 100644 index 000000000000..3211888ecc9f --- /dev/null +++ b/oox/inc/oox/core/relationshandler.hxx @@ -0,0 +1,61 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_RELATIONSHANDLER +#define OOX_CORE_RELATIONSHANDLER + +#include "oox/core/fragmenthandler.hxx" + +namespace oox { +namespace core { + +// ============================================================================ + +class RelationsFragment : public FragmentHandler +{ +public: + explicit RelationsFragment( + XmlFilterBase& rFilter, + RelationsRef xRelations ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + RelationsRef mxRelations; +}; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif // OOX_CORE_RELATIONSHANDLER + diff --git a/oox/inc/oox/core/xmlfilterbase.hxx b/oox/inc/oox/core/xmlfilterbase.hxx new file mode 100644 index 000000000000..30efeb0e9440 --- /dev/null +++ b/oox/inc/oox/core/xmlfilterbase.hxx @@ -0,0 +1,225 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_CORE_XMLFILTERBASE_HXX +#define OOX_CORE_XMLFILTERBASE_HXX + +#include <rtl/ref.hxx> +#include <rtl/string.hxx> +#include <rtl/ustring.hxx> +#include "oox/drawingml/table/tablestylelist.hxx" +#include "oox/core/filterbase.hxx" +#include "oox/core/relations.hxx" +#include <oox/dllapi.h> +#include <com/sun/star/text/XTextField.hpp> +#include <com/sun/star/text/XTextCursor.hpp> +#include <com/sun/star/text/XText.hpp> + +namespace com { namespace sun { namespace star { + namespace container { class XNameContainer; } + namespace document { class XDocumentProperties; } + namespace xml { namespace sax { class XLocator; } } + namespace xml { namespace sax { class XFastDocumentHandler; } } +} } } + +namespace oox { namespace drawingml { class Theme; } } +namespace oox { namespace drawingml { namespace chart { class ChartConverter; } } } +namespace oox { namespace vml { class Drawing; } } + +namespace sax_fastparser { + class FastSerializerHelper; + + typedef boost::shared_ptr< FastSerializerHelper > FSHelperPtr; +} + +namespace oox { +namespace core { + +class FragmentHandler; + +struct TextField { + com::sun::star::uno::Reference< com::sun::star::text::XText > xText; + com::sun::star::uno::Reference< com::sun::star::text::XTextCursor > xTextCursor; + com::sun::star::uno::Reference< com::sun::star::text::XTextField > xTextField; +}; +typedef std::vector< TextField > TextFieldStack; + +// ============================================================================ + +struct XmlFilterBaseImpl; + +class OOX_DLLPUBLIC XmlFilterBase : public FilterBase +{ +public: + explicit XmlFilterBase( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxGlobalFactory ); + + virtual ~XmlFilterBase(); + + /** Has to be implemented by each filter, returns the current theme. */ + virtual const ::oox::drawingml::Theme* + getCurrentTheme() const = 0; + + /** Has to be implemented by each filter to return the collection of VML shapes. */ + virtual ::oox::vml::Drawing* getVmlDrawing() = 0; + + /** Has to be implemented by each filter, returns a filter-specific chart + converter object, that should be global per imported document. */ + virtual ::oox::drawingml::chart::ChartConverter& getChartConverter() = 0; + + /** Has to be implemented by each filter to return the table style list. */ + virtual const ::oox::drawingml::table::TableStyleListPtr getTableStyles() = 0; + + // ------------------------------------------------------------------------ + + /** Returns the fragment path from the first relation of the passed type, + used for fragments referred by the root relations. */ + ::rtl::OUString getFragmentPathFromFirstType( const ::rtl::OUString& rType ); + + /** Imports a fragment using the passed fragment handler, which contains + the full path to the fragment stream. + + @return True, if the fragment could be imported. + */ + bool importFragment( const ::rtl::Reference< FragmentHandler >& rxHandler ); + + /** Imports the relations fragment associated with the specified fragment. + + @return The relations collection of the specified fragment. + */ + RelationsRef importRelations( const ::rtl::OUString& rFragmentPath ); + + /** Adds new relation. + + @param rType + Relation type. + + @param rTarget + Relation target. + + @return Added relation Id. + */ + ::rtl::OUString addRelation( const ::rtl::OUString& rType, const ::rtl::OUString& rTarget, bool bExternal = false ); + + /** Adds new relation to part's relations. + + @param rPartName + Part name the relations are related to. The relations will be stored in <rPartName::path>/_rels/<rPartName::name>.rels. + + @param rType + Relation type. + + @param rTarget + Relation target. + + @return Added relation Id. + */ + ::rtl::OUString addRelation( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > xOutputStream, const ::rtl::OUString& rType, const ::rtl::OUString& rTarget, bool bExternal = false ); + + /** Returns a stack of used textfields, used by the pptx importer to replace links to slidepages with rhe real page name */ + TextFieldStack& getTextFieldStack() const; + + /** Opens and returns the specified output stream from the base storage with specified media type. + + @param rStreamName + The name of the embedded storage stream. The name may contain + slashes to open streams from embedded substorages. If base stream + access has been enabled in the storage, the base stream can be + accessed by passing an empty string as stream name. + + @param rMediaType + The media type string, used in [Content_Types].xml stream in base + storage. + + @return The opened output stream. + */ + ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + openFragmentStream( + const ::rtl::OUString& rStreamName, + const ::rtl::OUString& rMediaType ); + + /** Opens specified output stream from the base storage with specified + media type and returns new fast serializer for that stream. + + @param rStreamName + The name of the embedded storage stream. The name may contain + slashes to open streams from embedded substorages. If base stream + access has been enabled in the storage, the base stream can be + accessed by passing an empty string as stream name. + + @param rMediaType + The media type string, used in [Content_Types].xml stream in base + storage. + + @return newly created serializer helper. + */ + ::sax_fastparser::FSHelperPtr + openFragmentStreamWithSerializer( + const ::rtl::OUString& rStreamName, + const ::rtl::OUString& rMediaType ); + + /** Returns new unique ID for exported document. + + @return newly created ID. + */ + inline sal_Int32 GetUniqueId() { return mnMaxDocId++; } + inline ::rtl::OString GetUniqueIdOString() { return ::rtl::OString::valueOf( mnMaxDocId++ ); } + inline ::rtl::OUString GetUniqueIdOUString() { return ::rtl::OUString::valueOf( mnMaxDocId++ ); } + + /** Write the document properties into into the current OPC package. + + @param xProperties The document properties to export. + + @return *this + */ + XmlFilterBase& exportDocumentProperties( ::com::sun::star::uno::Reference< ::com::sun::star::document::XDocumentProperties > xProperties ); + +protected: + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + implGetInputStream( ::comphelper::MediaDescriptor& rMediaDesc ) const; + +private: + virtual StorageRef implCreateStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream ) const; + virtual StorageRef implCreateStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const; + +private: + ::std::auto_ptr< XmlFilterBaseImpl > mxImpl; + sal_Int32 mnRelId; + sal_Int32 mnMaxDocId; +}; + +typedef ::rtl::Reference< XmlFilterBase > XmlFilterRef; + +// ============================================================================ + +} // namespace core +} // namespace oox + +#endif + diff --git a/oox/inc/oox/dllapi.h b/oox/inc/oox/dllapi.h new file mode 100644 index 000000000000..035f11fcf426 --- /dev/null +++ b/oox/inc/oox/dllapi.h @@ -0,0 +1,39 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef INCLUDED_OOX_DLLAPI_H +#define INCLUDED_OOX_DLLAPI_H + +#include "sal/types.h" + +#if defined OOX_DLLIMPLEMENTATION +#define OOX_DLLPUBLIC SAL_DLLPUBLIC_EXPORT +#else +#define OOX_DLLPUBLIC SAL_DLLPUBLIC_IMPORT +#endif + +#endif diff --git a/oox/inc/oox/drawingml/chart/axiscontext.hxx b/oox/inc/oox/drawingml/chart/axiscontext.hxx new file mode 100644 index 000000000000..b80dd2e6f9ef --- /dev/null +++ b/oox/inc/oox/drawingml/chart/axiscontext.hxx @@ -0,0 +1,127 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_AXISCONTEXT_HXX +#define OOX_DRAWINGML_CHART_AXISCONTEXT_HXX + +#include "oox/drawingml/chart/chartcontextbase.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct AxisDispUnitsModel; + +/** Handler for a value axis display units context (c:dispUnits element). + */ +class AxisDispUnitsContext : public ContextBase< AxisDispUnitsModel > +{ +public: + explicit AxisDispUnitsContext( ::oox::core::ContextHandler2Helper& rParent, AxisDispUnitsModel& rModel ); + virtual ~AxisDispUnitsContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct AxisModel; + +/** Base class for axis context handlers (c:catAx, c:dateAx, c:serAx, c:valAx + elements). + */ +class AxisContextBase : public ContextBase< AxisModel > +{ +public: + explicit AxisContextBase( ::oox::core::ContextHandler2Helper& rParent, AxisModel& rModel ); + virtual ~AxisContextBase(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a category axis context (c:catAx element). + */ +class CatAxisContext : public AxisContextBase +{ +public: + explicit CatAxisContext( ::oox::core::ContextHandler2Helper& rParent, AxisModel& rModel ); + virtual ~CatAxisContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a date axis context (c:dateAx element). + */ +class DateAxisContext : public AxisContextBase +{ +public: + explicit DateAxisContext( ::oox::core::ContextHandler2Helper& rParent, AxisModel& rModel ); + virtual ~DateAxisContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a series axis context (c:serAx element). + */ +class SerAxisContext : public AxisContextBase +{ +public: + explicit SerAxisContext( ::oox::core::ContextHandler2Helper& rParent, AxisModel& rModel ); + virtual ~SerAxisContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a value axis context (c:valAx element). + */ +class ValAxisContext : public AxisContextBase +{ +public: + explicit ValAxisContext( ::oox::core::ContextHandler2Helper& rParent, AxisModel& rModel ); + virtual ~ValAxisContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/axisconverter.hxx b/oox/inc/oox/drawingml/chart/axisconverter.hxx new file mode 100644 index 000000000000..4e8f86279133 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/axisconverter.hxx @@ -0,0 +1,80 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_AXISCONVERTER_HXX +#define OOX_DRAWINGML_CHART_AXISCONVERTER_HXX + +#include "oox/drawingml/chart/converterbase.hxx" + +namespace com { namespace sun { namespace star { + namespace chart2 { class XAxis; } + namespace chart2 { class XCoordinateSystem; } +} } } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +const sal_Int32 API_PRIM_AXESSET = 0; +const sal_Int32 API_SECN_AXESSET = 1; + +const sal_Int32 API_X_AXIS = 0; +const sal_Int32 API_Y_AXIS = 1; +const sal_Int32 API_Z_AXIS = 2; + +// ============================================================================ + +struct AxisModel; +class TypeGroupConverter; + +class AxisConverter : public ConverterBase< AxisModel > +{ +public: + explicit AxisConverter( + const ConverterRoot& rParent, + AxisModel& rModel ); + virtual ~AxisConverter(); + + /** Creates a chart2 axis and inserts it into the passed coordinate system. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem >& rxCoordSystem, + TypeGroupConverter& rTypeGroup, + const AxisModel* pCrossingAxis, + sal_Int32 nAxesSetIdx, + sal_Int32 nAxisIdx ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/axismodel.hxx b/oox/inc/oox/drawingml/chart/axismodel.hxx new file mode 100644 index 000000000000..8bab84257eee --- /dev/null +++ b/oox/inc/oox/drawingml/chart/axismodel.hxx @@ -0,0 +1,112 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_AXISMODEL_HXX +#define OOX_DRAWINGML_CHART_AXISMODEL_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/chart/titlemodel.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct AxisDispUnitsModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TextBody > TextBodyRef; + typedef ModelRef< LayoutModel > LayoutRef; + typedef ModelRef< TextModel > TextRef; + + ShapeRef mxShapeProp; /// Label frame formatting. + TextBodyRef mxTextProp; /// Label text formatting. + LayoutRef mxLayout; /// Layout/position of the axis units label. + TextRef mxText; /// Text source of the axis units label. + double mfCustomUnit; /// Custom unit size on value axis. + sal_Int32 mnBuiltInUnit; /// Built-in unit on value axis. + + explicit AxisDispUnitsModel(); + ~AxisDispUnitsModel(); +}; + +// ============================================================================ + +struct AxisModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TextBody > TextBodyRef; + typedef ModelRef< TitleModel > TitleRef; + typedef ModelRef< AxisDispUnitsModel > AxisDispUnitsRef; + + ShapeRef mxShapeProp; /// Axis line formatting. + TextBodyRef mxTextProp; /// Axis label text formatting. + TitleRef mxTitle; /// Axis title. + AxisDispUnitsRef mxDispUnits; /// Axis units label. + ShapeRef mxMajorGridLines; /// Major grid lines formatting. + ShapeRef mxMinorGridLines; /// Minor grid lines formatting. + NumberFormat maNumberFormat; /// Number format for axis tick labels. + OptValue< double > mofCrossesAt; /// Position on this axis where another axis crosses. + OptValue< double > mofMajorUnit; /// Unit for major tick marks on date/value axis. + OptValue< double > mofMinorUnit; /// Unit for minor tick marks on date/value axis. + OptValue< double > mofLogBase; /// Logarithmic base for logarithmic axes. + OptValue< double > mofMax; /// Maximum axis value. + OptValue< double > mofMin; /// Minimum axis value. + sal_Int32 mnAxisId; /// Unique axis identifier. + sal_Int32 mnAxisPos; /// Position of the axis (top/bottom/left/right). + sal_Int32 mnBaseTimeUnit; /// Base time unit shown on a date axis. + sal_Int32 mnCrossAxisId; /// Identifier of a crossing axis. + sal_Int32 mnCrossBetween; /// This value axis crosses between or inside category. + sal_Int32 mnCrossMode; /// Mode this axis crosses another axis (min, max, auto). + sal_Int32 mnLabelAlign; /// Tick mark label alignment. + sal_Int32 mnLabelOffset; /// Tick mark label distance from axis. + sal_Int32 mnMajorTickMark; /// Major tick mark style. + sal_Int32 mnMajorTimeUnit; /// Time unit for major tick marks on date axis. + sal_Int32 mnMinorTickMark; /// Mainor tick mark style. + sal_Int32 mnMinorTimeUnit; /// Time unit for minor tick marks on date axis. + sal_Int32 mnOrientation; /// Axis orientation (value order min to max, or max to min). + sal_Int32 mnTickLabelPos; /// Position of tick mark labels relative to the axis. + sal_Int32 mnTickLabelSkip; /// Number of tick mark labels to skip. + sal_Int32 mnTickMarkSkip; /// Number of tick marks to skip. + sal_Int32 mnTypeId; /// Type identifier of this axis. + bool mbAuto; /// True = automatic axis settings. + bool mbDeleted; /// True = axis has been deleted manually. + bool mbNoMultiLevel; /// True = no multi-level categories supported. + + explicit AxisModel( sal_Int32 nTypeId ); + ~AxisModel(); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/chartcontextbase.hxx b/oox/inc/oox/drawingml/chart/chartcontextbase.hxx new file mode 100644 index 000000000000..470596a5228e --- /dev/null +++ b/oox/inc/oox/drawingml/chart/chartcontextbase.hxx @@ -0,0 +1,87 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_CHARTCONTEXTBASE_HXX +#define OOX_DRAWINGML_CHART_CHARTCONTEXTBASE_HXX + +#include "oox/core/fragmenthandler2.hxx" + +namespace oox { namespace drawingml { class Shape; } } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +template< typename ModelType > +class ContextBase : public ::oox::core::ContextHandler2 +{ +public: + inline explicit ContextBase( ::oox::core::ContextHandler2Helper& rParent, ModelType& rModel ) : + ::oox::core::ContextHandler2( rParent ), mrModel( rModel ) {} + virtual ~ContextBase() {} + +protected: + ModelType& mrModel; +}; + +// ============================================================================ + +template< typename ModelType > +class FragmentBase : public ::oox::core::FragmentHandler2 +{ +public: + explicit FragmentBase( ::oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, ModelType& rModel ) : + ::oox::core::FragmentHandler2( rFilter, rFragmentPath, false ), mrModel( rModel ) {} + virtual ~FragmentBase() {} + +protected: + ModelType& mrModel; +}; + +// ============================================================================ + +/** Help class for all contexts that have only the c:spPr child element. + */ +class ShapePrWrapperContext : public ContextBase< Shape > +{ +public: + explicit ShapePrWrapperContext( ::oox::core::ContextHandler2Helper& rParent, Shape& rModel ); + virtual ~ShapePrWrapperContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/chartconverter.hxx b/oox/inc/oox/drawingml/chart/chartconverter.hxx new file mode 100644 index 000000000000..f9d10388ce13 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/chartconverter.hxx @@ -0,0 +1,111 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_CHARTCONVERTER_HXX +#define OOX_DRAWINGML_CHART_CHARTCONVERTER_HXX + +#include <com/sun/star/uno/Reference.hxx> +#include <oox/dllapi.h> + +namespace com { namespace sun { namespace star { + namespace awt { struct Point; } + namespace awt { struct Size; } + namespace drawing { class XShapes; } + namespace chart2 { class XChartDocument; } + namespace chart2 { namespace data { class XDataProvider; } } + namespace chart2 { namespace data { class XDataSequence; } } +} } } + +namespace oox { namespace core { class XmlFilterBase; } } + +namespace oox { +namespace drawingml { +namespace chart { + +struct ChartSpaceModel; +struct DataSequenceModel; + +// ============================================================================ + +class OOX_DLLPUBLIC ChartConverter +{ +public: + explicit ChartConverter(); + virtual ~ChartConverter(); + + /** Converts the passed OOXML chart model to the passed chart2 document. + + @param rChartModel The filled MSOOXML chart model structure. + + @param rxChartDoc The UNO chart document model to be initialized. + + @param rxExternalPage If null, all embedded shapes will be inserted + into the internal drawing page of the chart document. If not null, + all embedded shapes will be inserted into this shapes collection. + + @param rChartPos The position of the chart shape in its drawing page, + in 1/100 mm. Will be used only, if parameter rxExternalPage is not + null, for correct positioning of the embedded shapes in the + external drawing page. + + @param rChartSize The size of the chart shape in 1/100 mm. Needed for + calculation of position and size of the chart elements (diagram, + titles, legend, etc.) and embedded shapes. + */ + void convertFromModel( + ::oox::core::XmlFilterBase& rFilter, + ChartSpaceModel& rChartModel, + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& rxChartDoc, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxExternalPage, + const ::com::sun::star::awt::Point& rChartPos, + const ::com::sun::star::awt::Size& rChartSize ); + + /** Creates an internal data provider. Derived classes may override this + function to create an external data provider. */ + virtual void createDataProvider( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& rxChartDoc ); + + /** Creates a data sequence from a formula. Dummy implementation. Derived + classes have to override this function to actually parse the formula. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > + createDataSequence( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataProvider >& rxDataProvider, + const DataSequenceModel& rDataSeq ); + +private: + ChartConverter( const ChartConverter& ); + ChartConverter& operator=( const ChartConverter& ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/chartdrawingfragment.hxx b/oox/inc/oox/drawingml/chart/chartdrawingfragment.hxx new file mode 100644 index 000000000000..e38311394046 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/chartdrawingfragment.hxx @@ -0,0 +1,126 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: chartdrawingfragment.hxx,v $ + * + * $Revision: 1.1 $ + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_CHARTDRAWINGFRAGMENT_HXX +#define OOX_DRAWINGML_CHART_CHARTDRAWINGFRAGMENT_HXX + +#include "oox/core/fragmenthandler2.hxx" +#include "oox/drawingml/shape.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +/** Relative shape position in a chart object. */ +struct AnchorPosModel +{ + double mfX; /// X coordinate relative to chart object (0.0 to 1.0). + double mfY; /// Y coordinate relative to chart object (0.0 to 1.0). + + inline explicit AnchorPosModel() : mfX( -1.0 ), mfY( -1.0 ) {} + inline bool isValid() const { return (0.0 <= mfX) && (mfX <= 1.0) && (0.0 <= mfY) && (mfY <= 1.0); } +}; + +// ---------------------------------------------------------------------------- + +/** Absolute shape size in a chart object (in EMUs). */ +struct AnchorSizeModel : public EmuSize +{ + inline explicit AnchorSizeModel() : EmuSize( -1, -1 ) {} + inline bool isValid() const { return (Width >= 0) && (Height >= 0); } +}; + +// ============================================================================ + +/** Contains the position of a shape in the chart object. Supports different + shape anchor modes (absolute, relative). + */ +class ShapeAnchor +{ +public: + explicit ShapeAnchor( bool bRelSize ); + + /** Imports the absolute anchor size from the cdr:ext element. */ + void importExt( const AttributeList& rAttribs ); + /** Sets an the relative anchor position from the cdr:from or cdr:to element. */ + void setPos( sal_Int32 nElement, sal_Int32 nParentContext, const ::rtl::OUString& rValue ); + + /** Calculates the resulting shape anchor in EMUs. */ + ::com::sun::star::awt::Rectangle + calcEmuLocation( const EmuRectangle& rEmuChartRect ) const; + +private: + AnchorPosModel maFrom; /// Top-left position relative to chart object. + AnchorPosModel maTo; /// Bottom-right position relative to chart object. + AnchorSizeModel maSize; /// Shape size, if anchor has absolute size. + bool mbRelSize; /// True = relative size, false = absolute size. +}; + +typedef ::boost::shared_ptr< ShapeAnchor > ShapeAnchorRef; + +// ============================================================================ + +/** Handler for a chart drawing fragment (c:userShapes root element). + */ +class ChartDrawingFragment : public ::oox::core::FragmentHandler2 +{ +public: + explicit ChartDrawingFragment( + ::oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxDrawPage, + const ::com::sun::star::awt::Size& rChartSize, + const ::com::sun::star::awt::Point& rShapesOffset, + bool bOleSupport ); + virtual ~ChartDrawingFragment(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > + mxDrawPage; /// Drawing page of this sheet. + ::oox::drawingml::ShapePtr mxShape; /// Current top-level shape. + ShapeAnchorRef mxAnchor; /// Current anchor of top-level shape. + EmuRectangle maEmuChartRect; /// Position and size of the chart object for embedded shapes (in EMUs). + bool mbOleSupport; /// True = allow to insert OLE objects into the drawing page. +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/chartspaceconverter.hxx b/oox/inc/oox/drawingml/chart/chartspaceconverter.hxx new file mode 100644 index 000000000000..b4c40015f825 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/chartspaceconverter.hxx @@ -0,0 +1,64 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_CHARTSPACECONVERTER_HXX +#define OOX_DRAWINGML_CHART_CHARTSPACECONVERTER_HXX + +#include "oox/drawingml/chart/converterbase.hxx" + +namespace com { namespace sun { namespace star { + namespace drawing { class XShapes; } +} } } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct ChartSpaceModel; + +class ChartSpaceConverter : public ConverterBase< ChartSpaceModel > +{ +public: + explicit ChartSpaceConverter( const ConverterRoot& rParent, ChartSpaceModel& rModel ); + virtual ~ChartSpaceConverter(); + + /** Converts the contained OOXML chart model to a chart2 document. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxExternalPage, + const ::com::sun::star::awt::Point& rChartPos ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/chartspacefragment.hxx b/oox/inc/oox/drawingml/chart/chartspacefragment.hxx new file mode 100644 index 000000000000..898bc2ea15e8 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/chartspacefragment.hxx @@ -0,0 +1,62 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_CHARTSPACEFRAGMENT_HXX +#define OOX_DRAWINGML_CHART_CHARTSPACEFRAGMENT_HXX + +#include "oox/drawingml/chart/chartcontextbase.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct ChartSpaceModel; + +/** Handler for a chart fragment (c:chartSpace root element). + */ +class ChartSpaceFragment : public FragmentBase< ChartSpaceModel > +{ +public: + explicit ChartSpaceFragment( + ::oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + ChartSpaceModel& rModel ); + virtual ~ChartSpaceFragment(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/chartspacemodel.hxx b/oox/inc/oox/drawingml/chart/chartspacemodel.hxx new file mode 100644 index 000000000000..ddfa57fb919c --- /dev/null +++ b/oox/inc/oox/drawingml/chart/chartspacemodel.hxx @@ -0,0 +1,78 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_CHARTSPACEMODEL_HXX +#define OOX_DRAWINGML_CHART_CHARTSPACEMODEL_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/chart/plotareamodel.hxx" +#include "oox/drawingml/chart/titlemodel.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct ChartSpaceModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TextBody > TextBodyRef; + typedef ModelRef< PlotAreaModel > PlotAreaRef; + typedef ModelRef< WallFloorModel > WallFloorRef; + typedef ModelRef< View3DModel > View3DRef; + typedef ModelRef< TitleModel > TitleRef; + typedef ModelRef< LegendModel > LegendRef; + + ShapeRef mxShapeProp; /// Chart frame formatting. + TextBodyRef mxTextProp; /// Global chart text formatting. + PlotAreaRef mxPlotArea; /// Plot area of the chart. + WallFloorRef mxFloor; /// Floor formatting in 3D charts. + WallFloorRef mxBackWall; /// Back wall formatting in 3D charts. + WallFloorRef mxSideWall; /// Side wall formatting in 3D charts. + View3DRef mxView3D; /// 3D settings. + TitleRef mxTitle; /// Chart main title. + LegendRef mxLegend; /// Chart legend. + ::rtl::OUString maDrawingPath; /// Path to drawing fragment with embedded shapes. + sal_Int32 mnDispBlanksAs; /// Mode how to display blank values. + sal_Int32 mnStyle; /// Index to default formatting. + bool mbAutoTitleDel; /// True = automatic title deleted manually. + bool mbPlotVisOnly; /// True = plot visible cells in a sheet only. + bool mbShowLabelsOverMax;/// True = show labels over chart maximum. + + explicit ChartSpaceModel(); + ~ChartSpaceModel(); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/converterbase.hxx b/oox/inc/oox/drawingml/chart/converterbase.hxx new file mode 100644 index 000000000000..23f5a5ff9266 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/converterbase.hxx @@ -0,0 +1,117 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_CONVERTERBASE_HXX +#define OOX_DRAWINGML_CHART_CONVERTERBASE_HXX + +#include "oox/drawingml/chart/chartcontextbase.hxx" +#include "oox/drawingml/chart/objectformatter.hxx" + +namespace com { namespace sun { namespace star { + namespace awt { struct Size; } + namespace lang { class XMultiServiceFactory; } + namespace chart2 { class XChartDocument; } +} } } + +namespace oox { namespace core { + class XmlFilterBase; +} } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +class ChartConverter; +class ObjectFormatter; +struct ChartSpaceModel; +struct ConverterData; + +class ConverterRoot +{ +public: + explicit ConverterRoot( + ::oox::core::XmlFilterBase& rFilter, + ChartConverter& rChartConverter, + const ChartSpaceModel& rChartModel, + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& rxChartDoc, + const ::com::sun::star::awt::Size& rChartSize ); + virtual ~ConverterRoot(); + + /** Creates an instance for the passed service name, using the passed service factory. */ + static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > + createInstance( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::rtl::OUString& rServiceName ); + + /** Creates an instance for the passed service name, using the process service factory. */ + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > + createInstance( const ::rtl::OUString& rServiceName ) const; + +protected: + /** Returns the filter object of the imported/exported document. */ + ::oox::core::XmlFilterBase& getFilter() const; + /** Returns the chart converter. */ + ChartConverter& getChartConverter() const; + /** Returns the API chart document model. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > + getChartDocument() const; + /** Returns the position and size of the chart shape in 1/100 mm. */ + const ::com::sun::star::awt::Size& getChartSize() const; + /** Returns the object formatter. */ + ObjectFormatter& getFormatter() const; + +private: + ::boost::shared_ptr< ConverterData > mxData; +}; + +// ============================================================================ + +template< typename ModelType > +class ConverterBase : public ConverterRoot +{ +public: + inline const ModelType& getModel() const { return mrModel; } + +protected: + inline explicit ConverterBase( const ConverterRoot& rParent, ModelType& rModel ) : + ConverterRoot( rParent ), mrModel( rModel ) {} + virtual ~ConverterBase() {} + +protected: + ModelType& mrModel; +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/datasourcecontext.hxx b/oox/inc/oox/drawingml/chart/datasourcecontext.hxx new file mode 100644 index 000000000000..9b832a0209ab --- /dev/null +++ b/oox/inc/oox/drawingml/chart/datasourcecontext.hxx @@ -0,0 +1,101 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_DATASOURCECONTEXT_HXX +#define OOX_DRAWINGML_CHART_DATASOURCECONTEXT_HXX + +#include "oox/drawingml/chart/chartcontextbase.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct DataSequenceModel; + +typedef ContextBase< DataSequenceModel > DataSequenceContextBase; + +// ============================================================================ + +/** Handler for a double sequence context (c:numLit, c:numRef elements). + */ +class DoubleSequenceContext : public DataSequenceContextBase +{ +public: + explicit DoubleSequenceContext( ::oox::core::ContextHandler2Helper& rParent, DataSequenceModel& rModel ); + virtual ~DoubleSequenceContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + +private: + sal_Int32 mnPtIndex; /// Current data point index. +}; + +// ============================================================================ + +/** Handler for a string sequence context (c:multiLvlStrRef, c:strLit, + c:strRef elements). + */ +class StringSequenceContext : public DataSequenceContextBase +{ +public: + explicit StringSequenceContext( ::oox::core::ContextHandler2Helper& rParent, DataSequenceModel& rModel ); + virtual ~StringSequenceContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + +private: + sal_Int32 mnPtIndex; /// Current data point index. +}; + +// ============================================================================ + +struct DataSourceModel; + +/** Handler for a data source context (c:bubbleSize, c:cat, c:minus, c:plus, + c:val, c:xVal, c:yVal elements). + */ +class DataSourceContext : public ContextBase< DataSourceModel > +{ +public: + explicit DataSourceContext( ::oox::core::ContextHandler2Helper& rParent, DataSourceModel& rModel ); + virtual ~DataSourceContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/datasourceconverter.hxx b/oox/inc/oox/drawingml/chart/datasourceconverter.hxx new file mode 100644 index 000000000000..7cdd6ab4a175 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/datasourceconverter.hxx @@ -0,0 +1,78 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_DATASOURCECONVERTER_HXX +#define OOX_DRAWINGML_CHART_DATASOURCECONVERTER_HXX + +#include "oox/drawingml/chart/converterbase.hxx" + +namespace com { namespace sun { namespace star { + namespace chart2 { namespace data { class XDataSequence; } } +} } } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct DataSequenceModel; + +class DataSequenceConverter : public ConverterBase< DataSequenceModel > +{ +public: + explicit DataSequenceConverter( const ConverterRoot& rParent, DataSequenceModel& rModel ); + virtual ~DataSequenceConverter(); + + /** Creates a data sequence object from the contained formula link. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > + createDataSequence( const ::rtl::OUString& rRole ); +}; + +// ============================================================================ + +struct DataSourceModel; + +class DataSourceConverter : public ConverterBase< DataSourceModel > +{ +public: + explicit DataSourceConverter( const ConverterRoot& rParent, DataSourceModel& rModel ); + virtual ~DataSourceConverter(); + + /** Creates a data sequence object from the contained series data. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > + createDataSequence( const ::rtl::OUString& rRole ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/datasourcemodel.hxx b/oox/inc/oox/drawingml/chart/datasourcemodel.hxx new file mode 100644 index 000000000000..3de2278e5a71 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/datasourcemodel.hxx @@ -0,0 +1,72 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_DATASOURCEMODEL_HXX +#define OOX_DRAWINGML_CHART_DATASOURCEMODEL_HXX + +#include <com/sun/star/uno/Any.hxx> +#include "oox/drawingml/chart/modelbase.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct DataSequenceModel +{ + typedef ::std::map< sal_Int32, ::com::sun::star::uno::Any > AnyMap; + + AnyMap maData; /// Map of values, indexed by point identifier. + ::rtl::OUString maFormula; /// Formula reference, e.g. into a spreadsheet. + ::rtl::OUString maFormatCode; /// Number format for double values. + sal_Int32 mnPointCount; /// Number of points in this series source. + + explicit DataSequenceModel(); + ~DataSequenceModel(); +}; + +// ============================================================================ + +struct DataSourceModel +{ + typedef ModelRef< DataSequenceModel > DataSequenceRef; + + DataSequenceRef mxDataSeq; /// The data sequence or formula link of this source. + + explicit DataSourceModel(); + ~DataSourceModel(); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/modelbase.hxx b/oox/inc/oox/drawingml/chart/modelbase.hxx new file mode 100644 index 000000000000..113d6f686fd1 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/modelbase.hxx @@ -0,0 +1,122 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_MODELBASE_HXX +#define OOX_DRAWINGML_CHART_MODELBASE_HXX + +#include "oox/helper/containerhelper.hxx" +#include "oox/helper/helper.hxx" +#include "tokens.hxx" + +namespace oox { class AttributeList; } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +template< typename ModelType > +class ModelRef : public ::boost::shared_ptr< ModelType > +{ +public: + inline explicit ModelRef() {} + inline ModelRef( const ::boost::shared_ptr< ModelType >& rxModel ) : ::boost::shared_ptr< ModelType >( rxModel ) {} + inline ~ModelRef() {} + + inline bool is() const { return this->get() != 0; } + + inline ModelType& create() { reset( new ModelType ); return **this; } + template< typename Param1Type > + inline ModelType& create( const Param1Type& rParam1 ) { reset( new ModelType( rParam1 ) ); return **this; } + + inline ModelType& getOrCreate() { if( !*this ) reset( new ModelType ); return **this; } + template< typename Param1Type > + inline ModelType& getOrCreate( const Param1Type& rParam1 ) { if( !*this ) reset( new ModelType( rParam1 ) ); return **this; } +}; + +// ============================================================================ + +template< typename ModelType > +class ModelVector : public RefVector< ModelType > +{ +public: + typedef typename RefVector< ModelType >::value_type value_type; + typedef typename RefVector< ModelType >::size_type size_type; + + inline explicit ModelVector() {} + inline ~ModelVector() {} + + inline ModelType& create() { return append( new ModelType ); } + template< typename Param1Type > + inline ModelType& create( const Param1Type& rParam1 ) { return append( new ModelType( rParam1 ) ); } + +private: + inline ModelType& append( ModelType* pModel ) { this->push_back( value_type( pModel ) ); return *pModel; } +}; + +// ============================================================================ + +template< typename KeyType, typename ModelType > +class ModelMap : public RefMap< KeyType, ModelType > +{ +public: + typedef typename RefMap< KeyType, ModelType >::key_type key_type; + typedef typename RefMap< KeyType, ModelType >::mapped_type mapped_type; + typedef typename RefMap< KeyType, ModelType >::value_type value_type; + + inline explicit ModelMap() {} + inline ~ModelMap() {} + + inline ModelType& create( KeyType eKey ) { return insert( eKey, new ModelType ); } + template< typename Param1Type > + inline ModelType& create( KeyType eKey, const Param1Type& rParam1 ) { return insert( eKey, new ModelType( rParam1 ) ); } + +private: + inline ModelType& insert( KeyType eKey, ModelType* pModel ) { (*this)[ eKey ].reset( pModel ); return *pModel; } +}; + +// ============================================================================ + +struct NumberFormat +{ + ::rtl::OUString maFormatCode; /// Number format code. + bool mbSourceLinked; /// True = number format linked to source data. + + explicit NumberFormat(); + + void setAttributes( const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/objectformatter.hxx b/oox/inc/oox/drawingml/chart/objectformatter.hxx new file mode 100644 index 000000000000..9f83a6bc0391 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/objectformatter.hxx @@ -0,0 +1,173 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_OBJECTFORMATTER_HXX +#define OOX_DRAWINGML_CHART_OBJECTFORMATTER_HXX + +#include "oox/helper/containerhelper.hxx" +#include "oox/helper/propertyset.hxx" +#include "oox/drawingml/drawingmltypes.hxx" +#include "oox/drawingml/chart/modelbase.hxx" + +namespace com { namespace sun { namespace star { + namespace chart2 { class XChartDocument; } +} } } + +namespace oox { namespace core { class XmlFilterBase; } } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +/** Enumerates different object types for specific automatic formatting behaviour. */ +enum ObjectType +{ + OBJECTTYPE_CHARTSPACE, /// Chart background. + OBJECTTYPE_CHARTTITLE, /// Chart title. + OBJECTTYPE_LEGEND, /// Legend. + OBJECTTYPE_PLOTAREA2D, /// Plot area containing axes and data series in 2D charts. + OBJECTTYPE_PLOTAREA3D, /// Plot area containing axes and data series in 3D charts. + OBJECTTYPE_WALL, /// Background and side wall in 3D charts. + OBJECTTYPE_FLOOR, /// Floor in 3D charts. + OBJECTTYPE_AXIS, /// Axis line, labels, tick marks. + OBJECTTYPE_AXISTITLE, /// Axis title. + OBJECTTYPE_AXISUNIT, /// Axis unit label. + OBJECTTYPE_MAJORGRIDLINE, /// Axis major grid line. + OBJECTTYPE_MINORGRIDLINE, /// Axis minor grid line. + OBJECTTYPE_LINEARSERIES2D, /// Linear series in 2D line/radarline/scatter charts. + OBJECTTYPE_FILLEDSERIES2D, /// Filled series in 2D bar/area/radararea/bubble/pie/surface charts. + OBJECTTYPE_FILLEDSERIES3D, /// Filled series in 3D charts. + OBJECTTYPE_DATALABEL, /// Labels for data points. + OBJECTTYPE_TRENDLINE, /// Data series trend line. + OBJECTTYPE_TRENDLINELABEL, /// Trend line label. + OBJECTTYPE_ERRORBAR, /// Data series error indicator line. + OBJECTTYPE_SERLINE, /// Data point connector lines. + OBJECTTYPE_LEADERLINE, /// Leader lines between pie slice and data label. + OBJECTTYPE_DROPLINE, /// Drop lines between data points and X axis. + OBJECTTYPE_HILOLINE, /// High/low lines in line/stock charts. + OBJECTTYPE_UPBAR, /// Up-bar in line/stock charts. + OBJECTTYPE_DOWNBAR, /// Down-bar in line/stock charts. + OBJECTTYPE_DATATABLE /// Data table. +}; + +// ============================================================================ + +struct ChartSpaceModel; +struct ObjectFormatterData; +struct PictureOptionsModel; + +class ObjectFormatter +{ +public: + explicit ObjectFormatter( + const ::oox::core::XmlFilterBase& rFilter, + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& rxChartDoc, + const ChartSpaceModel& rChartSpace ); + ~ObjectFormatter(); + + /** Sets the maximum series index used for color cycling/fading. */ + void setMaxSeriesIndex( sal_Int32 nMaxSeriesIdx ); + /** Returns the current maximum series index used for color cycling/fading. */ + sal_Int32 getMaxSeriesIndex() const; + + /** Sets frame formatting properties to the passed property set. */ + void convertFrameFormatting( + PropertySet& rPropSet, + const ModelRef< Shape >& rxShapeProp, + ObjectType eObjType, + sal_Int32 nSeriesIdx = -1 ); + + /** Sets frame formatting properties to the passed property set. */ + void convertFrameFormatting( + PropertySet& rPropSet, + const ModelRef< Shape >& rxShapeProp, + const PictureOptionsModel& rPicOptions, + ObjectType eObjType, + sal_Int32 nSeriesIdx = -1 ); + + /** Sets text formatting properties to the passed property set. */ + void convertTextFormatting( + PropertySet& rPropSet, + const ModelRef< TextBody >& rxTextProp, + ObjectType eObjType ); + + /** Sets frame/text formatting properties to the passed property set. */ + void convertFormatting( + PropertySet& rPropSet, + const ModelRef< Shape >& rxShapeProp, + const ModelRef< TextBody >& rxTextProp, + ObjectType eObjType ); + + /** Sets text formatting properties to the passed property set. */ + void convertTextFormatting( + PropertySet& rPropSet, + const TextCharacterProperties& rTextProps, + ObjectType eObjType ); + + /** Sets text rotation properties to the passed property set. */ + void convertTextRotation( + PropertySet& rPropSet, + const ModelRef< TextBody >& rxTextProp, + bool bSupportsStacked ); + + /** Sets number format properties to the passed property set. */ + void convertNumberFormat( + PropertySet& rPropSet, + const NumberFormat& rNumberFormat, + bool bPercentFormat = false ); + + /** Sets automatic line properties to the passed property set. */ + void convertAutomaticLine( + PropertySet& rPropSet, + ObjectType eObjType, + sal_Int32 nSeriesIdx = -1 ); + + /** Sets automatic fill properties to the passed property set. */ + void convertAutomaticFill( + PropertySet& rPropSet, + ObjectType eObjType, + sal_Int32 nSeriesIdx = -1 ); + + /** Returns true, if the passed shape properties have automatic line mode. */ + static bool isAutomaticLine( const ModelRef< Shape >& rxShapeProp ); + /** Returns true, if the passed shape properties have automatic fill mode. */ + static bool isAutomaticFill( const ModelRef< Shape >& rxShapeProp ); + +private: + ::boost::shared_ptr< ObjectFormatterData > mxData; +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/plotareacontext.hxx b/oox/inc/oox/drawingml/chart/plotareacontext.hxx new file mode 100644 index 000000000000..75ebed545956 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/plotareacontext.hxx @@ -0,0 +1,90 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_PLOTAREACONTEXT_HXX +#define OOX_DRAWINGML_CHART_PLOTAREACONTEXT_HXX + +#include "oox/drawingml/chart/chartcontextbase.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct View3DModel; + +/** Handler for a chart plot area context (c:plotArea element). + */ +class View3DContext : public ContextBase< View3DModel > +{ +public: + explicit View3DContext( ::oox::core::ContextHandler2Helper& rParent, View3DModel& rModel ); + virtual ~View3DContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct WallFloorModel; + +/** Handler for a chart wall/floor context (c:backWall, c:floor, c:sideWall + elements). + */ +class WallFloorContext : public ContextBase< WallFloorModel > +{ +public: + explicit WallFloorContext( ::oox::core::ContextHandler2Helper& rParent, WallFloorModel& rModel ); + virtual ~WallFloorContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct PlotAreaModel; + +/** Handler for a chart plot area context (c:plotArea element). + */ +class PlotAreaContext : public ContextBase< PlotAreaModel > +{ +public: + explicit PlotAreaContext( ::oox::core::ContextHandler2Helper& rParent, PlotAreaModel& rModel ); + virtual ~PlotAreaContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/plotareaconverter.hxx b/oox/inc/oox/drawingml/chart/plotareaconverter.hxx new file mode 100644 index 000000000000..b2583b2e57a1 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/plotareaconverter.hxx @@ -0,0 +1,107 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_PLOTAREACONVERTER_HXX +#define OOX_DRAWINGML_CHART_PLOTAREACONVERTER_HXX + +#include "oox/drawingml/chart/converterbase.hxx" + +namespace com { namespace sun { namespace star { + namespace chart2 { class XDiagram; } +} } } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct View3DModel; +class TypeGroupConverter; + +class View3DConverter : public ConverterBase< View3DModel > +{ +public: + explicit View3DConverter( const ConverterRoot& rParent, View3DModel& rModel ); + virtual ~View3DConverter(); + + /** Converts the OOXML plot area model to a chart2 diagram. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >& rxDiagram, + TypeGroupConverter& rTypeGroup ); +}; + +// ============================================================================ + +struct WallFloorModel; + +class WallFloorConverter : public ConverterBase< WallFloorModel > +{ +public: + explicit WallFloorConverter( const ConverterRoot& rParent, WallFloorModel& rModel ); + virtual ~WallFloorConverter(); + + /** Converts the OOXML wall/floor model to a chart2 diagram. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >& rxDiagram, + ObjectType eObjType ); +}; + +// ============================================================================ + +struct PlotAreaModel; + +class PlotAreaConverter : public ConverterBase< PlotAreaModel > +{ +public: + explicit PlotAreaConverter( const ConverterRoot& rParent, PlotAreaModel& rModel ); + virtual ~PlotAreaConverter(); + + /** Converts the OOXML plot area model to a chart2 diagram. */ + void convertFromModel( View3DModel& rView3DModel ); + + /** Returns the automatic chart title if the chart contains only one series. */ + inline const ::rtl::OUString& getAutomaticTitle() const { return maAutoTitle; } + /** Returns true, if the chart is three-dimensional. */ + inline bool is3dChart() const { return mb3dChart; } + /** Returns true, if chart type supports wall and floor format in 3D mode. */ + inline bool isWall3dChart() const { return mbWall3dChart; } + +private: + ::rtl::OUString maAutoTitle; + bool mb3dChart; + bool mbWall3dChart; +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/plotareamodel.hxx b/oox/inc/oox/drawingml/chart/plotareamodel.hxx new file mode 100644 index 000000000000..2dfe1c33f4e3 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/plotareamodel.hxx @@ -0,0 +1,95 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_PLOTAREAMODEL_HXX +#define OOX_DRAWINGML_CHART_PLOTAREAMODEL_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/chart/axismodel.hxx" +#include "oox/drawingml/chart/seriesmodel.hxx" +#include "oox/drawingml/chart/titlemodel.hxx" +#include "oox/drawingml/chart/typegroupmodel.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct View3DModel +{ + OptValue< sal_Int32 > monHeightPercent; /// Height of the 3D view, relative to chart width. + OptValue< sal_Int32 > monRotationX; /// Horizontal rotation in degrees. + OptValue< sal_Int32 > monRotationY; /// Vertical rotation in degrees. + sal_Int32 mnDepthPercent; /// Depth of the 3D view, relative to chart width. + sal_Int32 mnPerspective; /// Eye distance to the 3D objects. + bool mbRightAngled; /// True = right-angled axes in 3D view. + + explicit View3DModel(); + ~View3DModel(); +}; + +// ============================================================================ + +struct WallFloorModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< PictureOptionsModel > PictureOptionsRef; + + ShapeRef mxShapeProp; /// Wall/floor frame formatting. + PictureOptionsRef mxPicOptions; /// Fill bitmap settings. + + explicit WallFloorModel(); + ~WallFloorModel(); +}; + +// ============================================================================ + +struct PlotAreaModel +{ + typedef ModelVector< TypeGroupModel > TypeGroupVector; + typedef ModelVector< AxisModel > AxisVector; + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< LayoutModel > LayoutRef; + + TypeGroupVector maTypeGroups; /// All chart type groups contained in the chart. + AxisVector maAxes; /// All axes contained in the chart. + ShapeRef mxShapeProp; /// Plot area frame formatting. + LayoutRef mxLayout; /// Layout/position of the plot area. + + explicit PlotAreaModel(); + ~PlotAreaModel(); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/seriescontext.hxx b/oox/inc/oox/drawingml/chart/seriescontext.hxx new file mode 100644 index 000000000000..024e9754781c --- /dev/null +++ b/oox/inc/oox/drawingml/chart/seriescontext.hxx @@ -0,0 +1,273 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_SERIESCONTEXT_HXX +#define OOX_DRAWINGML_CHART_SERIESCONTEXT_HXX + +#include "oox/drawingml/chart/chartcontextbase.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct DataLabelModel; + +/** Handler for a chart data point label context (c:dLbl element). + */ +class DataLabelContext : public ContextBase< DataLabelModel > +{ +public: + explicit DataLabelContext( ::oox::core::ContextHandler2Helper& rParent, DataLabelModel& rModel ); + virtual ~DataLabelContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); +}; + +// ============================================================================ + +struct DataLabelsModel; + +/** Handler for a chart data point label context (c:dLbl element). + */ +class DataLabelsContext : public ContextBase< DataLabelsModel > +{ +public: + explicit DataLabelsContext( ::oox::core::ContextHandler2Helper& rParent, DataLabelsModel& rModel ); + virtual ~DataLabelsContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); +}; + +// ============================================================================ + +struct PictureOptionsModel; + +/** Handler for fill bitmap settings (c:pictureOptions element). + */ +class PictureOptionsContext : public ContextBase< PictureOptionsModel > +{ +public: + explicit PictureOptionsContext( ::oox::core::ContextHandler2Helper& rParent, PictureOptionsModel& rModel ); + virtual ~PictureOptionsContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct ErrorBarModel; + +/** Handler for a series error bar context (c:errBars element). + */ +class ErrorBarContext : public ContextBase< ErrorBarModel > +{ +public: + explicit ErrorBarContext( ::oox::core::ContextHandler2Helper& rParent, ErrorBarModel& rModel ); + virtual ~ErrorBarContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct TrendlineLabelModel; + +/** Handler for a series trendline label context (c:trendlineLbl element). + */ +class TrendlineLabelContext : public ContextBase< TrendlineLabelModel > +{ +public: + explicit TrendlineLabelContext( ::oox::core::ContextHandler2Helper& rParent, TrendlineLabelModel& rModel ); + virtual ~TrendlineLabelContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct TrendlineModel; + +/** Handler for a series trendline context (c:trendline element). + */ +class TrendlineContext : public ContextBase< TrendlineModel > +{ +public: + explicit TrendlineContext( ::oox::core::ContextHandler2Helper& rParent, TrendlineModel& rModel ); + virtual ~TrendlineContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); +}; + +// ============================================================================ + +struct DataPointModel; + +/** Handler for a chart data point context (c:dPt element). + */ +class DataPointContext : public ContextBase< DataPointModel > +{ +public: + explicit DataPointContext( ::oox::core::ContextHandler2Helper& rParent, DataPointModel& rModel ); + virtual ~DataPointContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct SeriesModel; + +/** Handler base class for chart data series contexts (c:ser element). + */ +class SeriesContextBase : public ContextBase< SeriesModel > +{ +public: + explicit SeriesContextBase( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~SeriesContextBase(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a data series context for area chart types (c:ser element). + */ +class AreaSeriesContext : public SeriesContextBase +{ +public: + explicit AreaSeriesContext( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~AreaSeriesContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a data series context for bar chart types (c:ser element). + */ +class BarSeriesContext : public SeriesContextBase +{ +public: + explicit BarSeriesContext( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~BarSeriesContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a data series context for bubble chart types (c:ser element). + */ +class BubbleSeriesContext : public SeriesContextBase +{ +public: + explicit BubbleSeriesContext( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~BubbleSeriesContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a data series context for line and stock chart types (c:ser + element). + */ +class LineSeriesContext : public SeriesContextBase +{ +public: + explicit LineSeriesContext( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~LineSeriesContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a data series context for pie and doughnut chart types (c:ser + element). + */ +class PieSeriesContext : public SeriesContextBase +{ +public: + explicit PieSeriesContext( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~PieSeriesContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a data series context for radar chart types (c:ser element). + */ +class RadarSeriesContext : public SeriesContextBase +{ +public: + explicit RadarSeriesContext( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~RadarSeriesContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a data series context for scatter chart types (c:ser element). + */ +class ScatterSeriesContext : public SeriesContextBase +{ +public: + explicit ScatterSeriesContext( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~ScatterSeriesContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for a data series context for scatter chart types (c:ser element). + */ +class SurfaceSeriesContext : public SeriesContextBase +{ +public: + explicit SurfaceSeriesContext( ::oox::core::ContextHandler2Helper& rParent, SeriesModel& rModel ); + virtual ~SurfaceSeriesContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/seriesconverter.hxx b/oox/inc/oox/drawingml/chart/seriesconverter.hxx new file mode 100644 index 000000000000..7f6a08655b17 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/seriesconverter.hxx @@ -0,0 +1,162 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_SERIESCONVERTER_HXX +#define OOX_DRAWINGML_CHART_SERIESCONVERTER_HXX + +#include "oox/drawingml/chart/converterbase.hxx" +#include "oox/drawingml/chart/seriesmodel.hxx" + +namespace com { namespace sun { namespace star { + namespace chart2 { class XDataSeries; } + namespace chart2 { namespace data { class XLabeledDataSequence; } } +} } } + +namespace oox { +namespace drawingml { +namespace chart { + +class TypeGroupConverter; + +// #i66858# enable this when Chart2 supports smoothed lines per data series +#define OOX_CHART_SMOOTHED_PER_SERIES 0 + +// ============================================================================ + +class DataLabelConverter : public ConverterBase< DataLabelModel > +{ +public: + explicit DataLabelConverter( const ConverterRoot& rParent, DataLabelModel& rModel ); + virtual ~DataLabelConverter(); + + /** Converts OOXML data label settings for the passed data point. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >& rxDataSeries, + const TypeGroupConverter& rTypeGroup ); + + /** Conversion helper for data series and data points. */ + static void convertLabelFormatting( + PropertySet& rPropSet, + ObjectFormatter& rFormatter, + const DataLabelModelBase& rDataLabel, + const TypeGroupConverter& rTypeGroup, + bool bDataSeriesLabel ); +}; + +// ============================================================================ + +class DataLabelsConverter : public ConverterBase< DataLabelsModel > +{ +public: + explicit DataLabelsConverter( const ConverterRoot& rParent, DataLabelsModel& rModel ); + virtual ~DataLabelsConverter(); + + /** Converts OOXML data label settings for the passed data series. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >& rxDataSeries, + const TypeGroupConverter& rTypeGroup ); +}; + +// ============================================================================ + +class ErrorBarConverter : public ConverterBase< ErrorBarModel > +{ +public: + explicit ErrorBarConverter( const ConverterRoot& rParent, ErrorBarModel& rModel ); + virtual ~ErrorBarConverter(); + + /** Converts an OOXML errorbar and inserts it into the passed data series. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >& rxDataSeries ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > + createLabeledDataSequence( ErrorBarModel::SourceType eSourceType ); +}; + +// ============================================================================ + +class TrendlineConverter : public ConverterBase< TrendlineModel > +{ +public: + explicit TrendlineConverter( const ConverterRoot& rParent, TrendlineModel& rModel ); + virtual ~TrendlineConverter(); + + /** Converts an OOXML trendline and inserts it into the passed data series. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >& rxDataSeries ); +}; + +// ============================================================================ + +class DataPointConverter : public ConverterBase< DataPointModel > +{ +public: + explicit DataPointConverter( const ConverterRoot& rParent, DataPointModel& rModel ); + virtual ~DataPointConverter(); + + /** Converts settings for a data point in the passed series. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >& rxDataSeries, + const TypeGroupConverter& rTypeGroup, + const SeriesModel& rSeries ); +}; + +// ============================================================================ + +class SeriesConverter : public ConverterBase< SeriesModel > +{ +public: + explicit SeriesConverter( const ConverterRoot& rParent, SeriesModel& rModel ); + virtual ~SeriesConverter(); + + /** Creates a labeled data sequence object from category data link. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > + createCategorySequence( const ::rtl::OUString& rRole ); + /** Creates a labeled data sequence object from value data link. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > + createValueSequence( const ::rtl::OUString& rRole ); + /** Creates a data series object with initialized source links. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > + createDataSeries( const TypeGroupConverter& rTypeGroup, bool bVaryColorsByPoint ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > + createLabeledDataSequence( + SeriesModel::SourceType eSourceType, + const ::rtl::OUString& rRole, + bool bUseTextLabel ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/seriesmodel.hxx b/oox/inc/oox/drawingml/chart/seriesmodel.hxx new file mode 100644 index 000000000000..2b72eb0f2bcf --- /dev/null +++ b/oox/inc/oox/drawingml/chart/seriesmodel.hxx @@ -0,0 +1,244 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_SERIESMODEL_HXX +#define OOX_DRAWINGML_CHART_SERIESMODEL_HXX + +#include "oox/drawingml/chart/datasourcemodel.hxx" +#include "oox/drawingml/chart/titlemodel.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct DataLabelModelBase +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TextBody > TextBodyRef; + + ShapeRef mxShapeProp; /// Data label frame formatting. + TextBodyRef mxTextProp; /// Data label text formatting. + NumberFormat maNumberFormat; /// Number format for numeric data labels. + OptValue< ::rtl::OUString > moaSeparator;/// Separator between label components. + OptValue< sal_Int32 > monLabelPos; /// Data label position. + OptValue< bool > mobShowBubbleSize; /// True = show size of bubbles in bubble charts. + OptValue< bool > mobShowCatName; /// True = show category name of data points. + OptValue< bool > mobShowLegendKey; /// True = show legend key of data series. + OptValue< bool > mobShowPercent; /// True = show percentual value in pie/doughnut charts. + OptValue< bool > mobShowSerName; /// True = show series name. + OptValue< bool > mobShowVal; /// True = show data point value. + bool mbDeleted; /// True = data label(s) deleted. + + explicit DataLabelModelBase(); + ~DataLabelModelBase(); +}; + +// ============================================================================ + +struct DataLabelModel : public DataLabelModelBase +{ + typedef ModelRef< LayoutModel > LayoutRef; + typedef ModelRef< TextModel > TextRef; + + LayoutRef mxLayout; /// Layout/position of the data point label frame. + TextRef mxText; /// Manual or linked text for this data point label. + sal_Int32 mnIndex; /// Data point index for this data label. + + explicit DataLabelModel(); + ~DataLabelModel(); +}; + +// ============================================================================ + +struct DataLabelsModel : public DataLabelModelBase +{ + typedef ModelVector< DataLabelModel > DataLabelVector; + typedef ModelRef< Shape > ShapeRef; + + DataLabelVector maPointLabels; /// Settings for individual data point labels. + ShapeRef mxLeaderLines; /// Formatting of connector lines between data points and labels. + bool mbShowLeaderLines; /// True = show connector lines between data points and labels. + + explicit DataLabelsModel(); + ~DataLabelsModel(); +}; + +// ============================================================================ + +struct PictureOptionsModel +{ + double mfStackUnit; /// Bitmap stacking unit. + sal_Int32 mnPictureFormat; /// Bitmap mode (stretch/tile). + bool mbApplyToFront; /// True = draw picture at front/back side of 3D data points. + bool mbApplyToSides; /// True = draw picture at left/right side of 3D data points. + bool mbApplyToEnd; /// True = draw picture at top/bottom side of 3D data points. + + explicit PictureOptionsModel(); + ~PictureOptionsModel(); +}; + +// ============================================================================ + +struct ErrorBarModel +{ + enum SourceType + { + PLUS, /// Plus error bar values. + MINUS /// Minus error bar values. + }; + + typedef ModelMap< SourceType, DataSourceModel > DataSourceMap; + typedef ModelRef< Shape > ShapeRef; + + DataSourceMap maSources; /// Source ranges for manual error bar values. + ShapeRef mxShapeProp; /// Error line formatting. + double mfValue; /// Fixed value for several error bar types. + sal_Int32 mnDirection; /// Direction of the error bars (x/y). + sal_Int32 mnTypeId; /// Type of the error bars (plus/minus/both). + sal_Int32 mnValueType; /// Type of the values. + bool mbNoEndCap; /// True = no end cap at error bar lines. + + explicit ErrorBarModel(); + ~ErrorBarModel(); +}; + +// ============================================================================ + +struct TrendlineLabelModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TextBody > TextBodyRef; + typedef ModelRef< LayoutModel > LayoutRef; + typedef ModelRef< TextModel > TextRef; + + ShapeRef mxShapeProp; /// Label frame formatting. + TextBodyRef mxTextProp; /// Label text formatting. + LayoutRef mxLayout; /// Layout/position of the frame. + TextRef mxText; /// Text source of the label. + NumberFormat maNumberFormat; /// Number format for coefficients. + + explicit TrendlineLabelModel(); + ~TrendlineLabelModel(); +}; + +// ============================================================================ + +struct TrendlineModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TrendlineLabelModel > TrendlineLabelRef; + + ShapeRef mxShapeProp; /// Trendline formatting. + TrendlineLabelRef mxLabel; /// Trendline label text object. + ::rtl::OUString maName; /// User-defined name of the trendline. + OptValue< double > mfBackward; /// Size of trendline before first data point. + OptValue< double > mfForward; /// Size of trendline behind last data point. + OptValue< double > mfIntercept; /// Crossing point with Y axis. + sal_Int32 mnOrder; /// Polynomial order in range [2, 6]. + sal_Int32 mnPeriod; /// Moving average period in range [2, 255]. + sal_Int32 mnTypeId; /// Type of the trendline. + bool mbDispEquation; /// True = show equation of the trendline. + bool mbDispRSquared; /// True = show R-squared of the trendline. + + explicit TrendlineModel(); + ~TrendlineModel(); +}; + +// ============================================================================ + +struct DataPointModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< PictureOptionsModel > PictureOptionsRef; + + ShapeRef mxShapeProp; /// Data point formatting. + PictureOptionsRef mxPicOptions; /// Fill bitmap settings. + ShapeRef mxMarkerProp; /// Data point marker formatting. + OptValue< sal_Int32 > monExplosion; /// Pie slice moved from pie center. + OptValue< sal_Int32 > monMarkerSize; /// Size of the series line marker (2...72). + OptValue< sal_Int32 > monMarkerSymbol; /// Series line marker symbol. + OptValue< bool > mobBubble3d; /// True = show bubbles with 3D shade. + sal_Int32 mnIndex; /// Unique data point index. + bool mbInvertNeg; /// True = invert negative data points (not derived from series!). + + explicit DataPointModel(); + ~DataPointModel(); +}; + +// ============================================================================ + +struct SeriesModel +{ + enum SourceType + { + CATEGORIES, /// Data point categories. + VALUES, /// Data point values. + POINTS /// Data point size (e.g. bubble size in bubble charts). + }; + + typedef ModelMap< SourceType, DataSourceModel > DataSourceMap; + typedef ModelVector< ErrorBarModel > ErrorBarVector; + typedef ModelVector< TrendlineModel > TrendlineVector; + typedef ModelVector< DataPointModel > DataPointVector; + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< PictureOptionsModel > PictureOptionsRef; + typedef ModelRef< TextModel > TextRef; + typedef ModelRef< DataLabelsModel > DataLabelsRef; + + DataSourceMap maSources; /// Series source ranges. + ErrorBarVector maErrorBars; /// All error bars of this series. + TrendlineVector maTrendlines; /// All trendlines of this series. + DataPointVector maPoints; /// Explicit formatted data points. + ShapeRef mxShapeProp; /// Series formatting. + PictureOptionsRef mxPicOptions; /// Fill bitmap settings. + ShapeRef mxMarkerProp; /// Data point marker formatting. + TextRef mxText; /// Series title source. + DataLabelsRef mxLabels; /// Data point label settings for all points. + OptValue< sal_Int32 > monShape; /// 3D bar shape type. + sal_Int32 mnExplosion; /// Pie slice moved from pie center. + sal_Int32 mnIndex; /// Series index used for automatic formatting. + sal_Int32 mnMarkerSize; /// Size of the series line marker (2...72). + sal_Int32 mnMarkerSymbol; /// Series line marker symbol. + sal_Int32 mnOrder; /// Series order. + bool mbBubble3d; /// True = show bubbles with 3D shade. + bool mbInvertNeg; /// True = invert negative data points. + bool mbSmooth; /// True = smooth series line. + + explicit SeriesModel(); + ~SeriesModel(); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/titlecontext.hxx b/oox/inc/oox/drawingml/chart/titlecontext.hxx new file mode 100644 index 000000000000..b5743cc78f42 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/titlecontext.hxx @@ -0,0 +1,105 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_TITLECONTEXT_HXX +#define OOX_DRAWINGML_CHART_TITLECONTEXT_HXX + +#include "oox/drawingml/chart/chartcontextbase.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct LayoutModel; + +/** Handler for a chart layout context (c:layout element). + */ +class LayoutContext : public ContextBase< LayoutModel > +{ +public: + explicit LayoutContext( ::oox::core::ContextHandler2Helper& rParent, LayoutModel& rModel ); + virtual ~LayoutContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct TextModel; + +/** Handler for a chart text context (c:tx element). + */ +class TextContext : public ContextBase< TextModel > +{ +public: + explicit TextContext( ::oox::core::ContextHandler2Helper& rParent, TextModel& rModel ); + virtual ~TextContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); +}; + +// ============================================================================ + +struct TitleModel; + +/** Handler for a chart title context (c:title element). + */ +class TitleContext : public ContextBase< TitleModel > +{ +public: + explicit TitleContext( ::oox::core::ContextHandler2Helper& rParent, TitleModel& rModel ); + virtual ~TitleContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct LegendModel; + +/** Handler for a chart legend context (c:legend element). + */ +class LegendContext : public ContextBase< LegendModel > +{ +public: + explicit LegendContext( ::oox::core::ContextHandler2Helper& rParent, LegendModel& rModel ); + virtual ~LegendContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/titleconverter.hxx b/oox/inc/oox/drawingml/chart/titleconverter.hxx new file mode 100644 index 000000000000..d1fcfcfcfebc --- /dev/null +++ b/oox/inc/oox/drawingml/chart/titleconverter.hxx @@ -0,0 +1,112 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_TITLECONVERTER_HXX +#define OOX_DRAWINGML_CHART_TITLECONVERTER_HXX + +#include "oox/drawingml/chart/converterbase.hxx" + +namespace com { namespace sun { namespace star { + namespace chart2 { class XDiagram; } + namespace chart2 { class XFormattedString; } + namespace chart2 { class XTitled; } + namespace chart2 { namespace data { class XDataSequence; } } +} } } + +namespace oox { namespace drawingml { struct TextCharacterProperties; } } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct TextModel; + +class TextConverter : public ConverterBase< TextModel > +{ +public: + explicit TextConverter( const ConverterRoot& rParent, TextModel& rModel ); + virtual ~TextConverter(); + + /** Creates a data sequence object from the contained text data. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > + createDataSequence( const ::rtl::OUString& rRole ); + /** Creates a sequence of formatted string objects. */ + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XFormattedString > > + createStringSequence( + const ::rtl::OUString& rDefaultText, + const ModelRef< TextBody >& rxTextProp, + ObjectType eObjType ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XFormattedString > + appendFormattedString( + ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XFormattedString > >& orStringVec, + const ::rtl::OUString& rString, + bool bAddNewLine ) const; +}; + +// ============================================================================ + +struct TitleModel; + +class TitleConverter : public ConverterBase< TitleModel > +{ +public: + explicit TitleConverter( const ConverterRoot& rParent, TitleModel& rModel ); + virtual ~TitleConverter(); + + /** Creates a title text object and attaches it at the passed interface. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XTitled >& rxTitled, + const ::rtl::OUString& rAutoTitle, ObjectType eObjType ); +}; + +// ============================================================================ + +struct LegendModel; + +class LegendConverter : public ConverterBase< LegendModel > +{ +public: + explicit LegendConverter( const ConverterRoot& rParent, LegendModel& rModel ); + virtual ~LegendConverter(); + + /** Creates a legend object and attaches it at the passed diagram. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >& rxDiagram ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/titlemodel.hxx b/oox/inc/oox/drawingml/chart/titlemodel.hxx new file mode 100644 index 000000000000..f5d46957b450 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/titlemodel.hxx @@ -0,0 +1,114 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_TITLEMODEL_HXX +#define OOX_DRAWINGML_CHART_TITLEMODEL_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/chart/datasourcemodel.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct LayoutModel +{ + double mfX; /// Left position of this object. + double mfY; /// Top position of this object. + double mfW; /// Width of this object. + double mfH; /// Height of this object. + sal_Int32 mnXMode; /// Mode for left position. + sal_Int32 mnYMode; /// Mode for top position. + sal_Int32 mnWMode; /// Mode for width. + sal_Int32 mnHMode; /// Mode for height. + sal_Int32 mnTarget; /// Layout target for plot area. + + explicit LayoutModel(); + ~LayoutModel(); +}; + +// ============================================================================ + +struct TextModel +{ + typedef ModelRef< DataSequenceModel > DataSequenceRef; + typedef ModelRef< TextBody > TextBodyRef; + + DataSequenceRef mxDataSeq; /// The string data or formula link of this text. + TextBodyRef mxTextBody; /// Rich-formatted literal text (for title objects only). + + explicit TextModel(); + ~TextModel(); +}; + +// ============================================================================ + +struct TitleModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TextBody > TextBodyRef; + typedef ModelRef< LayoutModel > LayoutRef; + typedef ModelRef< TextModel > TextRef; + + ShapeRef mxShapeProp; /// Title shape formatting. + TextBodyRef mxTextProp; /// Title text formatting. + LayoutRef mxLayout; /// Layout/position of the frame. + TextRef mxText; /// Text source of the title. + bool mbOverlay; /// True = title may overlay other objects. + + explicit TitleModel(); + ~TitleModel(); +}; + +// ============================================================================ + +struct LegendModel +{ + typedef ModelRef< Shape > ShapeRef; + typedef ModelRef< TextBody > TextBodyRef; + typedef ModelRef< LayoutModel > LayoutRef; + + ShapeRef mxShapeProp; /// Legend shape formatting. + TextBodyRef mxTextProp; /// Legend text formatting. + LayoutRef mxLayout; /// Layout/position of the legend. + sal_Int32 mnPosition; /// Legend position. + bool mbOverlay; /// True = legend may overlay other objects. + + explicit LegendModel(); + ~LegendModel(); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/typegroupcontext.hxx b/oox/inc/oox/drawingml/chart/typegroupcontext.hxx new file mode 100644 index 000000000000..aa5f2a47c4a0 --- /dev/null +++ b/oox/inc/oox/drawingml/chart/typegroupcontext.hxx @@ -0,0 +1,171 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_TYPEGROUPCONTEXT_HXX +#define OOX_DRAWINGML_CHART_TYPEGROUPCONTEXT_HXX + +#include "oox/drawingml/chart/chartcontextbase.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct UpDownBarsModel; + +/** Handler for an up/down bars context (c:upDownBars element). + */ +class UpDownBarsContext : public ContextBase< UpDownBarsModel > +{ +public: + explicit UpDownBarsContext( ::oox::core::ContextHandler2Helper& rParent, UpDownBarsModel& rModel ); + virtual ~UpDownBarsContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +struct TypeGroupModel; +typedef ContextBase< TypeGroupModel > TypeGroupContextBase; + +// ============================================================================ + +/** Handler for area type group contexts (c:area3DChart, c:areaChart elements). + */ +class AreaTypeGroupContext : public TypeGroupContextBase +{ +public: + explicit AreaTypeGroupContext( ::oox::core::ContextHandler2Helper& rParent, TypeGroupModel& rModel ); + virtual ~AreaTypeGroupContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for bar type group contexts (c:bar3DChart, c:barChart elements). + */ +class BarTypeGroupContext : public TypeGroupContextBase +{ +public: + explicit BarTypeGroupContext( ::oox::core::ContextHandler2Helper& rParent, TypeGroupModel& rModel ); + virtual ~BarTypeGroupContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for bubble type group context (c:bubbleChart element). + */ +class BubbleTypeGroupContext : public TypeGroupContextBase +{ +public: + explicit BubbleTypeGroupContext( ::oox::core::ContextHandler2Helper& rParent, TypeGroupModel& rModel ); + virtual ~BubbleTypeGroupContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for line type group contexts (c:line3DChart, c:lineChart, + c:stockChart elements). + */ +class LineTypeGroupContext : public TypeGroupContextBase +{ +public: + explicit LineTypeGroupContext( ::oox::core::ContextHandler2Helper& rParent, TypeGroupModel& rModel ); + virtual ~LineTypeGroupContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for pie type group contexts (c:doughnutChart, c:ofPieChart, + c:pie3DChart, c:pieChart elements). + */ +class PieTypeGroupContext : public TypeGroupContextBase +{ +public: + explicit PieTypeGroupContext( ::oox::core::ContextHandler2Helper& rParent, TypeGroupModel& rModel ); + virtual ~PieTypeGroupContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for radar type group context (c:radarChart element). + */ +class RadarTypeGroupContext : public TypeGroupContextBase +{ +public: + explicit RadarTypeGroupContext( ::oox::core::ContextHandler2Helper& rParent, TypeGroupModel& rModel ); + virtual ~RadarTypeGroupContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for scatter type group context (c:scatterChart element). + */ +class ScatterTypeGroupContext : public TypeGroupContextBase +{ +public: + explicit ScatterTypeGroupContext( ::oox::core::ContextHandler2Helper& rParent, TypeGroupModel& rModel ); + virtual ~ScatterTypeGroupContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +/** Handler for surface type group contexts (c:surface3DChart, c:surfaceChart + elements). + */ +class SurfaceTypeGroupContext : public TypeGroupContextBase +{ +public: + explicit SurfaceTypeGroupContext( ::oox::core::ContextHandler2Helper& rParent, TypeGroupModel& rModel ); + virtual ~SurfaceTypeGroupContext(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/typegroupconverter.hxx b/oox/inc/oox/drawingml/chart/typegroupconverter.hxx new file mode 100644 index 000000000000..46018696baef --- /dev/null +++ b/oox/inc/oox/drawingml/chart/typegroupconverter.hxx @@ -0,0 +1,205 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_TYPEGROUPCONVERTER_HXX +#define OOX_DRAWINGML_CHART_TYPEGROUPCONVERTER_HXX + +#include "oox/drawingml/chart/converterbase.hxx" + +namespace com { namespace sun { namespace star { + namespace chart2 { class XChartType; } + namespace chart2 { class XCoordinateSystem; } + namespace chart2 { class XDataSeries; } + namespace chart2 { class XDiagram; } + namespace chart2 { namespace data { class XLabeledDataSequence; } } +} } } + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +/** Enumerates different chart types. */ +enum TypeId +{ + TYPEID_BAR, /// Vertical bar chart. + TYPEID_HORBAR, /// Horizontal bar chart. + TYPEID_LINE, /// Line chart. + TYPEID_AREA, /// Area chart. + TYPEID_STOCK, /// Stock chart. + TYPEID_RADARLINE, /// Linear radar chart. + TYPEID_RADARAREA, /// Filled radar chart. + TYPEID_PIE, /// Pie chart. + TYPEID_DOUGHNUT, /// Doughnut (ring) chart. + TYPEID_OFPIE, /// Pie-to-pie or pie-to-bar chart. + TYPEID_SCATTER, /// Scatter (XY) chart. + TYPEID_BUBBLE, /// Bubble chart. + TYPEID_SURFACE, /// Surface chart. + TYPEID_UNKNOWN /// Default for unknown chart types. +}; + +// ---------------------------------------------------------------------------- + +/** Enumerates different categories of similar chart types. */ +enum TypeCategory +{ + TYPECATEGORY_BAR, /// Bar charts (horizontal or vertical). + TYPECATEGORY_LINE, /// Line charts (line, area, stock charts). + TYPECATEGORY_RADAR, /// Radar charts (linear or filled). + TYPECATEGORY_PIE, /// Pie and donut charts. + TYPECATEGORY_SCATTER, /// Scatter and bubble charts. + TYPECATEGORY_SURFACE /// Surface charts. +}; + +// ---------------------------------------------------------------------------- + +/** Enumerates modes for varying point colors in a series. */ +enum VarPointMode +{ + VARPOINTMODE_NONE, /// No varied colors supported. + VARPOINTMODE_SINGLE, /// Only supported, if type group contains only one series. + VARPOINTMODE_MULTI /// Supported for multiple series in a chart type group. +}; + +// ============================================================================ + +/** Contains info for a chart type related to the OpenOffice.org chart module. */ +struct TypeGroupInfo +{ + TypeId meTypeId; /// Unique chart type identifier. + TypeCategory meTypeCategory; /// Category this chart type belongs to. + const sal_Char* mpcServiceName; /// Service name of the type. + VarPointMode meVarPointMode; /// Mode for varying point colors. + sal_Int32 mnDefLabelPos; /// Default data label position (API constant). + bool mbCombinable2d; /// True = types can be combined in one axes set. + bool mbSupports3d; /// True = 3D type allowed, false = only 2D type. + bool mbPolarCoordSystem; /// True = polar, false = cartesian. + bool mbSeriesIsFrame2d; /// True = 2D type series with area formatting. + bool mbSingleSeriesVis; /// True = only first series visible (e.g. pie charts). + bool mbCategoryAxis; /// True = X axis contains categories. + bool mbSwappedAxesSet; /// True = X axis and Y axis are swapped. + bool mbSupportsStacking; /// True = data points can be stacked on each other. + bool mbReverseSeries; /// True = insert unstacked series in reverse order. + bool mbTicksBetweenCateg; /// True = X axis ticks between categories. + bool mbPictureOptions; /// True = bitmaps support options from c:pictureOptions. +}; + +// ============================================================================ + +struct UpDownBarsModel; + +class UpDownBarsConverter : public ConverterBase< UpDownBarsModel > +{ +public: + explicit UpDownBarsConverter( const ConverterRoot& rParent, UpDownBarsModel& rModel ); + virtual ~UpDownBarsConverter(); + + /** Converts the OOXML up/down bars. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType >& rxChartType ); +}; + +// ============================================================================ + +struct TypeGroupModel; +struct View3DModel; + +class TypeGroupConverter : public ConverterBase< TypeGroupModel > +{ +public: + explicit TypeGroupConverter( const ConverterRoot& rParent, TypeGroupModel& rModel ); + virtual ~TypeGroupConverter(); + + /** Returns the type info struct that describes this chart type group. */ + inline const TypeGroupInfo& getTypeInfo() const { return maTypeInfo; } + + /** Returns true, if the series in this chart type group are stacked on each other (no percentage). */ + bool isStacked() const; + /** Returns true, if the series in this chart type group are stacked on each other as percentage. */ + bool isPercent() const; + /** Returns true, if the chart is three-dimensional. */ + bool is3dChart() const; + /** Returns true, if chart type supports wall and floor format in 3D mode. */ + bool isWall3dChart() const; + /** Returns true, if the series in this chart type group are ordered on the Z axis. */ + bool isDeep3dChart() const; + + /** Returns true, if this chart type supports area formatting for its series. */ + bool isSeriesFrameFormat() const; + /** Returns the object type for a series depending on the chart type. */ + ObjectType getSeriesObjectType() const; + + /** Returns true, if this chart type has to reverse its series order. */ + bool isReverseSeries() const; + /** Returns series title, if the chart type group contains only one single series. */ + ::rtl::OUString getSingleSeriesTitle() const; + + /** Creates a coordinate system according to the contained chart type. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem > + createCoordinateSystem(); + /** Creates a labeled data sequence object for axis categories. */ + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence > + createCategorySequence(); + + /** Converts the OOXML type group model into a chart2 coordinate system. */ + void convertFromModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >& rxDiagram, + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem >& rxCoordSystem, + sal_Int32 nAxesSetIdx, bool bSupportsVaryColorsByPoint ); + + /** Sets the passed OOXML marker style at the passed property set. */ + void convertMarker( PropertySet& rPropSet, sal_Int32 nOoxSymbol, sal_Int32 nOoxSize ) const; + /** Sets the passed OOXML line smoothing at the passed property set. */ + void convertLineSmooth( PropertySet& rPropSet, bool bOoxSmooth ) const; + /** Sets the passed OOXML bar 3D geometry at the passed property set. */ + void convertBarGeometry( PropertySet& rPropSet, sal_Int32 nOoxShape ) const; + /** Sets the passed OOXML pie rotation at the passed property set. */ + void convertPieRotation( PropertySet& rPropSet, sal_Int32 nOoxAngle ) const; + /** Sets the passed OOXML pie explosion at the passed property set. */ + void convertPieExplosion( PropertySet& rPropSet, sal_Int32 nOoxExplosion ) const; + +private: + /** Inserts the passed series into the chart type. Adds additional properties to the series. */ + void insertDataSeries( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType >& rxChartType, + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >& rxSeries, + sal_Int32 nAxesSetIdx ); + +private: + TypeGroupInfo maTypeInfo; /// Extended type info for contained chart type model. + bool mb3dChart; /// True = type is a 3D chart type. +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/chart/typegroupmodel.hxx b/oox/inc/oox/drawingml/chart/typegroupmodel.hxx new file mode 100644 index 000000000000..b51b8e5d4a7c --- /dev/null +++ b/oox/inc/oox/drawingml/chart/typegroupmodel.hxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CHART_TYPEGROUPMODEL_HXX +#define OOX_DRAWINGML_CHART_TYPEGROUPMODEL_HXX + +#include "oox/drawingml/chart/seriesmodel.hxx" + +namespace oox { +namespace drawingml { +namespace chart { + +// ============================================================================ + +struct UpDownBarsModel +{ + typedef ModelRef< Shape > ShapeRef; + + ShapeRef mxDownBars; /// Formatting of down bars. + ShapeRef mxUpBars; /// Formatting of up bars. + sal_Int32 mnGapWidth; /// Space between up/down bars. + + explicit UpDownBarsModel(); + ~UpDownBarsModel(); +}; + +// ============================================================================ + +struct TypeGroupModel +{ + typedef ModelVector< SeriesModel > SeriesVector; + typedef ::std::vector< sal_Int32 > AxisIdVector; + typedef ModelRef< DataLabelsModel > DataLabelsRef; + typedef ModelRef< UpDownBarsModel > UpDownBarsRef; + typedef ModelRef< Shape > ShapeRef; + + SeriesVector maSeries; /// Series attached to this chart type group. + AxisIdVector maAxisIds; /// List of axis identifiers used by this chart type. + DataLabelsRef mxLabels; /// Data point label settings for all series. + UpDownBarsRef mxUpDownBars; /// Up/down bars in stock charts. + ShapeRef mxSerLines; /// Connector lines in stacked bar charts. + ShapeRef mxDropLines; /// Drop lines connecting data points with X axis. + ShapeRef mxHiLowLines; /// High/low lines connecting lowest and highest data points. + double mfSplitPos; /// Threshold value in pie-to charts. + sal_Int32 mnBarDir; /// Bar direction in bar charts (vertical/horizontal). + sal_Int32 mnBubbleScale; /// Relative scaling of bubble size (percent). + sal_Int32 mnFirstAngle; /// Rotation angle of first slice in pie charts. + sal_Int32 mnGapDepth; /// Space between series in deep 3D charts. + sal_Int32 mnGapWidth; /// Space between bars in bar charts, or space in pie-to charts. + sal_Int32 mnGrouping; /// Series grouping mode. + sal_Int32 mnHoleSize; /// Hole size in doughnut charts. + sal_Int32 mnOfPieType; /// Pie-to-pie or pie-to-bar chart. + sal_Int32 mnOverlap; /// Bar overlap per category (2D bar charts only). + sal_Int32 mnRadarStyle; /// Type of radar chart (lines, markers, filled). + sal_Int32 mnScatterStyle; /// Type of scatter chart (lines, markers, smooth). + sal_Int32 mnSecondPieSize; /// relative size of second pie/bar in pie-to charts (percent). + sal_Int32 mnShape; /// 3D bar shape type. + sal_Int32 mnSizeRepresents; /// Bubble size represents area or width. + sal_Int32 mnSplitType; /// Split type in pie-to charts. + sal_Int32 mnTypeId; /// Chart type identifier. + bool mbBubble3d; /// True = show bubbles with 3D shade. + bool mbShowMarker; /// True = show point markers in line charts. + bool mbShowNegBubbles; /// True = show absolute value of negative bubbles. + bool mbSmooth; /// True = smooth lines in line charts. + bool mbVaryColors; /// True = different automatic colors for each point. + bool mbWireframe; /// True = wireframe surface chart, false = filled surface chart. + + explicit TypeGroupModel( sal_Int32 nTypeId ); + ~TypeGroupModel(); +}; + +// ============================================================================ + +} // namespace chart +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/clrscheme.hxx b/oox/inc/oox/drawingml/clrscheme.hxx new file mode 100644 index 000000000000..22eab1a892a1 --- /dev/null +++ b/oox/inc/oox/drawingml/clrscheme.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CLRSCHEME_HXX +#define OOX_DRAWINGML_CLRSCHEME_HXX + +#include <boost/shared_ptr.hpp> +#include <map> +#include <vector> +#include "oox/core/namespaces.hxx" +#include "oox/drawingml/color.hxx" + +namespace oox { namespace drawingml { + +class ClrMap +{ + std::map < sal_Int32, sal_Int32 > maClrMap; + +public: + + sal_Bool getColorMap( sal_Int32& nClrToken ); + void setColorMap( sal_Int32 nClrToken, sal_Int32 nMappedClrToken ); +}; + +typedef boost::shared_ptr< ClrMap > ClrMapPtr; + +class ClrScheme +{ + std::map < sal_Int32, sal_Int32 > maClrScheme; + +public: + + ClrScheme(); + ~ClrScheme(); + + sal_Bool getColor( sal_Int32 nSchemeClrToken, sal_Int32& rColor ) const; + void setColor( sal_Int32 nSchemeClrToken, sal_Int32 nColor ); +}; + +typedef boost::shared_ptr< ClrScheme > ClrSchemePtr; + +} } + +#endif // OOX_DRAWINGML_CLRSCHEME_HXX diff --git a/oox/inc/oox/drawingml/clrschemecontext.hxx b/oox/inc/oox/drawingml/clrschemecontext.hxx new file mode 100644 index 000000000000..2ecc588716e0 --- /dev/null +++ b/oox/inc/oox/drawingml/clrschemecontext.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CLRSCHEMECONTEXT_HXX +#define OOX_DRAWINGML_CLRSCHEMECONTEXT_HXX + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/clrscheme.hxx" +#include "oox/drawingml/color.hxx" +#include "oox/drawingml/colorchoicecontext.hxx" + +namespace oox { namespace drawingml { + +class clrMapContext : public oox::core::ContextHandler +{ +public: + clrMapContext( ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, ClrMap& rClrMap ); +}; + +class clrSchemeColorContext : private Color, public ColorContext +{ +public: + clrSchemeColorContext( ::oox::core::ContextHandler& rParent, ClrScheme& rClrScheme, sal_Int32 nColorToken ); + virtual ~clrSchemeColorContext(); + +private: + ClrScheme& mrClrScheme; + sal_Int32 mnColorToken; +}; + +class clrSchemeContext : public oox::core::ContextHandler +{ +public: + clrSchemeContext( ::oox::core::ContextHandler& rParent, ClrScheme& rClrScheme ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + ClrScheme& mrClrScheme; +}; + +} } + +#endif // OOX_DRAWINGML_CLRSCHEMECONTEXT_HXX diff --git a/oox/inc/oox/drawingml/color.hxx b/oox/inc/oox/drawingml/color.hxx new file mode 100644 index 000000000000..830959b77db9 --- /dev/null +++ b/oox/inc/oox/drawingml/color.hxx @@ -0,0 +1,150 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_COLOR_HXX +#define OOX_DRAWINGML_COLOR_HXX + +#include <vector> +#include <boost/shared_ptr.hpp> +#include <sal/types.h> +#include <rtl/instance.hxx> +#include <rtl/ustring.hxx> +#include "oox/helper/helper.hxx" + +namespace oox { namespace core { class FilterBase; } } + +namespace oox { +namespace drawingml { + +// ============================================================================ + +class Color +{ +public: + Color(); + ~Color(); + + /** Returns the RGB value for the passed DrawingML color token, or nDefaultRgb on error. */ + static sal_Int32 getDmlPresetColor( sal_Int32 nToken, sal_Int32 nDefaultRgb ); + /** Returns the RGB value for the passed VML color token, or nDefaultRgb on error. */ + static sal_Int32 getVmlPresetColor( sal_Int32 nToken, sal_Int32 nDefaultRgb ); + + /** Sets the color to unused state. */ + void setUnused(); + /** Sets an RGB value (hexadecimal RRGGBB) from the a:srgbClr element. */ + void setSrgbClr( sal_Int32 nRgb ); + /** Sets the percentual RGB values from the a:scrgbClr element. */ + void setScrgbClr( sal_Int32 nR, sal_Int32 nG, sal_Int32 nB ); + /** Sets the HSL values from the a:hslClr element. */ + void setHslClr( sal_Int32 nHue, sal_Int32 nSat, sal_Int32 nLum ); + /** Sets a predefined color from the a:prstClr element. */ + void setPrstClr( sal_Int32 nToken ); + /** Sets a scheme color from the a:schemeClr element. */ + void setSchemeClr( sal_Int32 nToken ); + /** Sets a system color from the a:sysClr element. */ + void setSysClr( sal_Int32 nToken, sal_Int32 nLastRgb ); + /** Sets a palette color index. */ + void setPaletteClr( sal_Int32 nPaletteIdx ); + + /** Inserts the passed color transformation. */ + void addTransformation( sal_Int32 nElement, sal_Int32 nValue = -1 ); + /** Inserts Chart specific color tint (-1.0...0.0 = shade, 0.0...1.0 = tint). */ + void addChartTintTransformation( double fTint ); + /** Inserts Excel specific color tint (-1.0...0.0 = shade, 0.0...1.0 = tint). */ + void addExcelTintTransformation( double fTint ); + /** Removes all color transformations. */ + void clearTransformations(); + /** Removes transparence from the color. */ + void clearTransparence(); + + /** Overwrites this color with the passed color, if it is used. */ + inline void assignIfUsed( const Color& rColor ) { if( rColor.isUsed() ) *this = rColor; } + + /** Returns true, if the color is initialized. */ + bool isUsed() const { return meMode != COLOR_UNUSED; } + /** Returns true, if the color is a placeholder color in theme style lists. */ + bool isPlaceHolder() const { return meMode == COLOR_PH; } + /** Returns the final RGB color value. + @param nPhClr Actual color for the phClr placeholder color used in theme style lists. */ + sal_Int32 getColor( const ::oox::core::FilterBase& rFilter, sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const; + + /** Returns true, if the color has a transparence set. */ + bool hasTransparence() const; + /** Returns the transparence of the color (0 = opaque, 100 = full transparent). */ + sal_Int16 getTransparence() const; + +private: + /** Internal helper for getColor(). */ + void setResolvedRgb( sal_Int32 nRgb ) const; + + /** Converts the color components to RGB values. */ + void toRgb() const; + /** Converts the color components to CRGB values (gamma corrected percentage). */ + void toCrgb() const; + /** Converts the color components to HSL values. */ + void toHsl() const; + +private: + enum ColorMode + { + COLOR_UNUSED, /// Color is not used, or undefined. + COLOR_RGB, /// Absolute RGB (r/g/b: 0...255). + COLOR_CRGB, /// Relative RGB (r/g/b: 0...100000). + COLOR_HSL, /// HSL (hue: 0...21600000, sat/lum: 0...100000). + COLOR_SCHEME, /// Color from scheme. + COLOR_PALETTE, /// Color from application defined palette. + COLOR_SYSTEM, /// Color from system palette. + COLOR_PH, /// Placeholder color in theme style lists. + COLOR_FINAL /// Finalized RGB color. + }; + + struct Transformation + { + sal_Int32 mnToken; + sal_Int32 mnValue; + + explicit Transformation( sal_Int32 nToken, sal_Int32 nValue ) : mnToken( nToken ), mnValue( nValue ) {} + }; + typedef ::std::vector< Transformation > TransformVec; + + mutable ColorMode meMode; /// Current color mode. + mutable TransformVec maTransforms; /// Color transformations. + mutable sal_Int32 mnC1; /// Red, red%, hue, scheme token, palette index, system token, or final RGB. + mutable sal_Int32 mnC2; /// Green, green%, saturation, or system default RGB. + mutable sal_Int32 mnC3; /// Blue, blue%, or luminance. + sal_Int32 mnAlpha; /// Alpha value (color opacity). +}; + +typedef boost::shared_ptr< Color > ColorPtr; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/colorchoicecontext.hxx b/oox/inc/oox/drawingml/colorchoicecontext.hxx new file mode 100644 index 000000000000..8b42a2e74c15 --- /dev/null +++ b/oox/inc/oox/drawingml/colorchoicecontext.hxx @@ -0,0 +1,87 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_COLORCHOICECONTEXT_HXX +#define OOX_DRAWINGML_COLORCHOICECONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { +namespace drawingml { + +class Color; + +// ============================================================================ + +/** Context handler for the different color value elements (a:scrgbClr, + a:srgbClr, a:hslClr, a:sysClr, a:schemeClr, a:prstClr). */ +class ColorValueContext : public ::oox::core::ContextHandler +{ +public: + explicit ColorValueContext( ::oox::core::ContextHandler& rParent, Color& rColor ); + + virtual void SAL_CALL startFastElement( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + Color& mrColor; +}; + +// ============================================================================ + +/** Context handler for elements that *contain* a color value element + (a:scrgbClr, a:srgbClr, a:hslClr, a:sysClr, a:schemeClr, a:prstClr). */ +class ColorContext : public ::oox::core::ContextHandler +{ +public: + explicit ColorContext( ::oox::core::ContextHandler& rParent, Color& rColor ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + Color& mrColor; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/connectorshapecontext.hxx b/oox/inc/oox/drawingml/connectorshapecontext.hxx new file mode 100644 index 000000000000..f20624c55efc --- /dev/null +++ b/oox/inc/oox/drawingml/connectorshapecontext.hxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CONNECTORSHAPECONTEXT_HXX +#define OOX_DRAWINGML_CONNECTORSHAPECONTEXT_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/shapecontext.hxx" + +namespace oox { namespace drawingml { + +class ConnectorShapeContext : public ShapeContext +{ +public: + ConnectorShapeContext( ::oox::core::ContextHandler& rParent, ShapePtr pMasterShapePtr, ShapePtr pGroupShapePtr ); + virtual ~ConnectorShapeContext(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); +}; + +} } + +#endif // OOX_DRAWINGML_CONNECTORSHAPECONTEXT_HXX diff --git a/oox/inc/oox/drawingml/customshapegeometry.hxx b/oox/inc/oox/drawingml/customshapegeometry.hxx new file mode 100644 index 000000000000..4fec38cf09eb --- /dev/null +++ b/oox/inc/oox/drawingml/customshapegeometry.hxx @@ -0,0 +1,77 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CUSTOMSHAPEGEOMETRY_HXX +#define OOX_DRAWINGML_CUSTOMSHAPEGEOMETRY_HXX + +#include <com/sun/star/beans/XPropertySet.hpp> +#include "oox/helper/propertymap.hxx" +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/shape.hxx" + +namespace oox { namespace drawingml { + + +// --------------------------------------------------------------------- +// CT_CustomGeometry2D +class CustomShapeGeometryContext : public ::oox::core::ContextHandler +{ +public: + CustomShapeGeometryContext( ::oox::core::ContextHandler& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, CustomShapeProperties& rCustomShapeProperties ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 aElementToken, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + CustomShapeProperties& mrCustomShapeProperties; +}; + +// --------------------------------------------------------------------- +// CT_PresetGeometry2D +class PresetShapeGeometryContext : public ::oox::core::ContextHandler +{ +public: + PresetShapeGeometryContext( ::oox::core::ContextHandler& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, CustomShapeProperties& rCustomShapeProperties ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 aElementToken, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + CustomShapeProperties& mrCustomShapeProperties; +}; + +// --------------------------------------------------------------------- +// CT_PresetTextShape +class PresetTextShapeContext : public ::oox::core::ContextHandler +{ +public: + PresetTextShapeContext( ::oox::core::ContextHandler& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, CustomShapeProperties& rCustomShapeProperties ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 aElementToken, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + CustomShapeProperties& mrCustomShapeProperties; +}; + +} } + +#endif // OOX_DRAWINGML_CUSTOMSHAPEGEOMETRY_HXX diff --git a/oox/inc/oox/drawingml/customshapeproperties.hxx b/oox/inc/oox/drawingml/customshapeproperties.hxx new file mode 100644 index 000000000000..4e4b82cd5acd --- /dev/null +++ b/oox/inc/oox/drawingml/customshapeproperties.hxx @@ -0,0 +1,89 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CUSTOMSHAPEPROPERTIES_HXX +#define OOX_DRAWINGML_CUSTOMSHAPEPROPERTIES_HXX + +#include "oox/helper/propertymap.hxx" +#include "oox/drawingml/color.hxx" +#include <com/sun/star/graphic/XGraphic.hpp> +#include <boost/shared_ptr.hpp> +#include "tokens.hxx" +#include <vector> +#include <map> +#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp> +#include <com/sun/star/drawing/EnhancedCustomShapeParameterType.hpp> +#include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp> +#include <com/sun/star/drawing/EnhancedCustomShapeGluePointType.hpp> +#include <com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp> +#include <com/sun/star/drawing/EnhancedCustomShapeTextFrame.hpp> +#include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp> +#include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp> +#ifndef __com_sun_star_beans_PropertyValues_hpp__ +#include <com/sun/star/beans/PropertyValues.hpp> +#endif +#include <com/sun/star/drawing/ProjectionMode.hpp> +#include <com/sun/star/drawing/XShape.hpp> + +namespace oox { namespace drawingml { + +class CustomShapeProperties; + +typedef boost::shared_ptr< CustomShapeProperties > CustomShapePropertiesPtr; + +struct CustomShapeGuide +{ + rtl::OUString maName; + rtl::OUString maFormula; +}; + +class CustomShapeProperties +{ +public: + + CustomShapeProperties(); + virtual ~CustomShapeProperties(); + + void apply( const CustomShapePropertiesPtr& ); + void pushToPropSet( const ::oox::core::FilterBase& rFilterBase, + const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > & xPropSet, + const ::com::sun::star::uno::Reference < ::com::sun::star::drawing::XShape > & xShape) const; + + void setShapePresetType( const rtl::OUString& rShapePresetType ){ maShapePresetType = rShapePresetType; }; + std::vector< CustomShapeGuide >& getAdjustmentValues(){ return maAdjustmentValues; }; + + double getValue( const std::vector< CustomShapeGuide >&, sal_uInt32 nIndex ) const; + +private: + + rtl::OUString maShapePresetType; + std::vector< CustomShapeGuide > maAdjustmentValues; +}; + +} } + +#endif // OOX_DRAWINGML_CUSTOMSHAPEPROPERTIES_HXX diff --git a/oox/inc/oox/drawingml/diagram/datamodelcontext.hxx b/oox/inc/oox/drawingml/diagram/datamodelcontext.hxx new file mode 100644 index 000000000000..a09f7b100e2e --- /dev/null +++ b/oox/inc/oox/drawingml/diagram/datamodelcontext.hxx @@ -0,0 +1,54 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_SHAPECONTEXT_HXX +#define OOX_DRAWINGML_SHAPECONTEXT_HXX + +#include <com/sun/star/drawing/XShapes.hpp> + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/diagram/diagram.hxx" + +namespace oox { namespace drawingml { + +// CT_DataModel +class DataModelContext : public ::oox::core::ContextHandler +{ +public: + DataModelContext( ::oox::core::ContextHandler& rParent, const DiagramDataPtr & pDataModelPtr ); + virtual ~DataModelContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + DiagramDataPtr mpDataModel; +}; + +} } + +#endif // OOX_DRAWINGML_SHAPEGROUPCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/diagram/diagram.hxx b/oox/inc/oox/drawingml/diagram/diagram.hxx new file mode 100644 index 000000000000..f9c74246e558 --- /dev/null +++ b/oox/inc/oox/drawingml/diagram/diagram.hxx @@ -0,0 +1,256 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + + +#ifndef OOX_DRAWINGML_DIAGRAM_HXX +#define OOX_DRAWINGML_DIAGRAM_HXX + +#include <vector> +#include <boost/shared_ptr.hpp> +#include <boost/enable_shared_from_this.hpp> +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/diagram/diagramlayoutatoms.hxx" + +namespace oox { namespace drawingml { + +namespace dgm { + +/** A Connection + */ +class Connection +{ +public: + Connection() + : mnType( 0 ) + , mnSourceOrder( 0 ) + , mnDestOrder( 0 ) + { + } + + void dump(); + + sal_Int32 mnType; + ::rtl::OUString msModelId; + ::rtl::OUString msSourceId; + ::rtl::OUString msDestId; + ::rtl::OUString msParTransId; + ::rtl::OUString msPresId; + ::rtl::OUString msSibTransId; + sal_Int32 mnSourceOrder; + sal_Int32 mnDestOrder; + +}; + +typedef boost::shared_ptr< Connection > ConnectionPtr; +typedef std::vector< ConnectionPtr > Connections; + +class Point; + +typedef boost::shared_ptr< Point > PointPtr; +typedef std::vector< PointPtr > Points; +/** A point + */ +class Point +{ +public: + Point(); + ShapePtr & getShape( ) + { return mpShape; } + + void setCnxId( const ::rtl::OUString & sCnxId ) + { msCnxId = sCnxId; } + void setModelId( const ::rtl::OUString & sModelId ); + const ::rtl::OUString & getModelId() const + { return msModelId; } + void setType( const sal_Int32 nType ) + { mnType = nType; } + sal_Int32 getType() const + { return mnType; } + + void dump(); +private: + ShapePtr mpShape; + ::rtl::OUString msCnxId; + ::rtl::OUString msModelId; + sal_Int32 mnType; +}; + + +class PointsTree; +typedef boost::shared_ptr< PointsTree > PointsTreePtr; + +/** a points tree node */ +class PointsTree + : public boost::enable_shared_from_this< PointsTree > +{ +public: + typedef std::vector< PointsTreePtr > Childrens; + PointsTree() + {}; + PointsTree( const PointPtr & pPoint ) + : mpNode( pPoint ) + { } + bool addChild( const PointsTreePtr & pChild ); + const PointPtr & getPoint() const + { return mpNode; } + PointsTreePtr getParent() const; + Childrens::const_iterator beginChild() const + { return maChildrens.begin(); } + Childrens::const_iterator endChild() const + { return maChildrens.end(); } +private: + PointPtr mpNode; + boost::weak_ptr< PointsTree > mpParent; + Childrens maChildrens; +}; + +} + +//////////////////// + +class DiagramData +{ +public: + + DiagramData(); + FillPropertiesPtr & getFillProperties() + { return mpFillProperties; } + dgm::Connections & getConnections() + { return maConnections; } + dgm::Points & getPoints() + { return maPoints; } + void dump(); +private: + FillPropertiesPtr mpFillProperties; + dgm::Connections maConnections; + dgm::Points maPoints; +}; + +typedef boost::shared_ptr< DiagramData > DiagramDataPtr; + + + +//////////////////// + +class DiagramLayout +{ +public: + void setDefStyle( const ::rtl::OUString & sDefStyle ) + { msDefStyle = sDefStyle; } + void setMinVer( const ::rtl::OUString & sMinVer ) + { msMinVer = sMinVer; } + void setUniqueId( const ::rtl::OUString & sUniqueId ) + { msUniqueId = sUniqueId; } + const ::rtl::OUString & getUniqueId() + { return msUniqueId; } + void setTitle( const ::rtl::OUString & sTitle ) + { msTitle = sTitle; } + void setDesc( const ::rtl::OUString & sDesc ) + { msDesc = sDesc; } + + LayoutNodePtr & getNode() + { return mpNode; } + const LayoutNodePtr & getNode() const + { return mpNode; } + DiagramDataPtr & getSampData() + { return mpSampData; } + const DiagramDataPtr & getSampData() const + { return mpSampData; } + DiagramDataPtr & getStyleData() + { return mpStyleData; } + const DiagramDataPtr & getStyleData() const + { return mpStyleData; } + + void layout( const dgm::PointsTreePtr & pTree, const com::sun::star::awt::Point & pt ); +private: + ::rtl::OUString msDefStyle; + ::rtl::OUString msMinVer; + ::rtl::OUString msUniqueId; + + ::rtl::OUString msTitle; + ::rtl::OUString msDesc; + LayoutNodePtr mpNode; + DiagramDataPtr mpSampData; + DiagramDataPtr mpStyleData; + // TODO + // catLst + // clrData +}; + +typedef boost::shared_ptr< DiagramLayout > DiagramLayoutPtr; + +/////////////////////// + +class DiagramQStyles +{ + +}; + +typedef boost::shared_ptr< DiagramQStyles > DiagramQStylesPtr; + +/////////////////////// + +class DiagramColors +{ + +}; + +typedef boost::shared_ptr< DiagramColors > DiagramColorsPtr; + +/////////////////////// + +class Diagram +{ +public: + void setData( const DiagramDataPtr & ); + void setLayout( const DiagramLayoutPtr & ); + DiagramLayoutPtr getLayout() const + { + return mpLayout; + } + void setQStyles( const DiagramQStylesPtr & ); + void setColors( const DiagramColorsPtr & ); + + void addTo( const ShapePtr & pShape ); + ::rtl::OUString getLayoutId() const; +private: + void build( ); + DiagramDataPtr mpData; + DiagramLayoutPtr mpLayout; + DiagramQStylesPtr mpQStyles; + DiagramColorsPtr mpColors; + std::map< ::rtl::OUString, ShapePtr > maShapeMap; + dgm::PointsTreePtr mpRoot; +}; + + +typedef boost::shared_ptr< Diagram > DiagramPtr; + +} } + +#endif diff --git a/oox/inc/oox/drawingml/diagram/diagramfragmenthandler.hxx b/oox/inc/oox/drawingml/diagram/diagramfragmenthandler.hxx new file mode 100644 index 000000000000..f9fd32dc71d6 --- /dev/null +++ b/oox/inc/oox/drawingml/diagram/diagramfragmenthandler.hxx @@ -0,0 +1,100 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_DIAGRAMFRAGMENTHANDLER +#define OOX_DRAWINGML_DIAGRAMFRAGMENTHANDLER + +#include "oox/core/fragmenthandler.hxx" +#include "oox/drawingml/diagram/diagram.hxx" + +namespace oox { namespace drawingml { + + +class DiagramDataFragmentHandler : public ::oox::core::FragmentHandler +{ +public: + DiagramDataFragmentHandler( oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramDataPtr pDataPtr ) throw(); + virtual ~DiagramDataFragmentHandler() throw(); + + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + DiagramDataPtr mpDataPtr; +}; + + + +class DiagramLayoutFragmentHandler : public ::oox::core::FragmentHandler +{ +public: + DiagramLayoutFragmentHandler( oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramLayoutPtr pDataPtr ) throw(); + virtual ~DiagramLayoutFragmentHandler() throw(); + + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + DiagramLayoutPtr mpDataPtr; +}; + +class DiagramQStylesFragmentHandler : public ::oox::core::FragmentHandler +{ +public: + DiagramQStylesFragmentHandler( oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramQStylesPtr pDataPtr ) throw(); + virtual ~DiagramQStylesFragmentHandler() throw(); + + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + DiagramQStylesPtr mpDataPtr; +}; + + +class DiagramColorsFragmentHandler : public ::oox::core::FragmentHandler +{ +public: + DiagramColorsFragmentHandler( ::oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramColorsPtr pDataPtr ) throw(); + virtual ~DiagramColorsFragmentHandler() throw(); + + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + DiagramColorsPtr mpDataPtr; +}; + +} } + + +#endif diff --git a/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx b/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx new file mode 100644 index 000000000000..7df2deddfa83 --- /dev/null +++ b/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx @@ -0,0 +1,209 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + + + + +#ifndef OOX_DRAWINGML_DIAGRAMLAYOUTATOMS_HXX +#define OOX_DRAWINGML_DIAGRAMLAYOUTATOMS_HXX + +#include <map> +#include <string> + +#include <boost/shared_ptr.hpp> +#include <boost/array.hpp> + +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/xml/sax/XFastAttributeList.hpp> + +#include "oox/drawingml/shape.hxx" + + +namespace oox { namespace drawingml { + + +// AG_IteratorAttributes +class IteratorAttr +{ +public: + IteratorAttr(); + + // not sure this belong here, but wth + void loadFromXAttr( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); + +private: + sal_Int32 mnAxis; + sal_Int32 mnCnt; + sal_Bool mbHideLastTrans; + sal_Int32 mnPtType; + sal_Int32 mnSt; + sal_Int32 mnStep; +}; + +class ConditionAttr +{ +public: + ConditionAttr(); + + // not sure this belong here, but wth + void loadFromXAttr( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); + +private: + sal_Int32 mnFunc; + sal_Int32 mnArg; + sal_Int32 mnOp; + ::rtl::OUString msVal; +}; + +class LayoutAtom; + +typedef boost::shared_ptr< LayoutAtom > LayoutAtomPtr; + +/** abstract Atom for the layout */ +class LayoutAtom +{ +public: + virtual ~LayoutAtom() + {} + // TODO change signature to the proper one + virtual void processAtom() = 0; + void setName( const ::rtl::OUString & sName ) + { msName = sName; } + void addChild( const LayoutAtomPtr & pNode ) + { mpChildNodes.push_back( pNode ); } + + // dump for debug + virtual void dump(int level = 0); +protected: + std::vector< LayoutAtomPtr > mpChildNodes; + ::rtl::OUString msName; +}; + +class AlgAtom + : public LayoutAtom +{ +public: + virtual ~AlgAtom() + {} + typedef std::map< std::string, ::com::sun::star::uno::Any > ParamMap; + + virtual void processAtom() + {} +private: + ParamMap mParams; +}; + + +class ForEachAtom + : public LayoutAtom +{ +public: + virtual ~ForEachAtom() + {} + + IteratorAttr & iterator() + { return maIter; } + virtual void processAtom(); +private: + IteratorAttr maIter; +}; + +typedef boost::shared_ptr< ForEachAtom > ForEachAtomPtr; + + +class ConditionAtom + : public LayoutAtom +{ +public: + ConditionAtom( bool bElse = false ) + : LayoutAtom( ) + , mbElse( bElse ) + {} + virtual ~ConditionAtom() + {} + bool test(); + virtual void processAtom() + {} + IteratorAttr & iterator() + { return maIter; } + ConditionAttr & cond() + { return maCond; } +private: + bool mbElse; + IteratorAttr maIter; + ConditionAttr maCond; +}; + +typedef boost::shared_ptr< ConditionAtom > ConditionAtomPtr; + + +/** "choose" statements. Atoms will be tested in order. */ +class ChooseAtom + : public LayoutAtom +{ +public: + virtual ~ChooseAtom() + {} + virtual void processAtom(); +}; + +class LayoutNode + : public LayoutAtom +{ +public: + enum { + VAR_animLvl = 0, + VAR_animOne, + VAR_bulletEnabled, + VAR_chMax, + VAR_chPref, + VAR_dir, + VAR_hierBranch, + VAR_orgChart, + VAR_resizeHandles + }; + // we know that the array is of fixed size + // the use of Any allow having empty values + typedef boost::array< ::com::sun::star::uno::Any, 9 > VarMap; + + virtual ~LayoutNode() + {} + virtual void processAtom() + {} + VarMap & variables() + { return mVariables; } +private: + VarMap mVariables; + std::vector< ShapePtr > mpShapes; +}; + +typedef boost::shared_ptr< LayoutNode > LayoutNodePtr; + +} } + +#endif diff --git a/oox/inc/oox/drawingml/drawingmltypes.hxx b/oox/inc/oox/drawingml/drawingmltypes.hxx new file mode 100644 index 000000000000..ed4367e63857 --- /dev/null +++ b/oox/inc/oox/drawingml/drawingmltypes.hxx @@ -0,0 +1,184 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TYPES_HXX +#define OOX_DRAWINGML_TYPES_HXX + +#include <boost/shared_ptr.hpp> +#include <com/sun/star/style/TabAlign.hpp> +#include <com/sun/star/geometry/IntegerRectangle2D.hpp> +#include <com/sun/star/awt/Point.hpp> +#include <com/sun/star/awt/Size.hpp> +#include <com/sun/star/xml/sax/XFastAttributeList.hpp> + +namespace oox { +namespace drawingml { + +// ============================================================================ + +const sal_Int32 PER_PERCENT = 1000; +const sal_Int32 MAX_PERCENT = 100 * PER_PERCENT; + +const sal_Int32 PER_DEGREE = 60000; +const sal_Int32 MAX_DEGREE = 360 * PER_DEGREE; + +// ============================================================================ + +struct LineProperties; +typedef ::boost::shared_ptr< LineProperties > LinePropertiesPtr; + +struct FillProperties; +typedef ::boost::shared_ptr< FillProperties > FillPropertiesPtr; + +struct GraphicProperties; +typedef ::boost::shared_ptr< GraphicProperties > GraphicPropertiesPtr; + +struct TextCharacterProperties; +typedef ::boost::shared_ptr< TextCharacterProperties > TextCharacterPropertiesPtr; + +struct TextBodyProperties; +typedef ::boost::shared_ptr< TextBodyProperties > TextBodyPropertiesPtr; + +class TextBody; +typedef ::boost::shared_ptr< TextBody > TextBodyPtr; + +class Shape; +typedef ::boost::shared_ptr< Shape > ShapePtr; + +class Theme; +typedef ::boost::shared_ptr< Theme > ThemePtr; + +// --------------------------------------------------------------------------- + +namespace table { + +class TableProperties; +typedef ::boost::shared_ptr< TableProperties > TablePropertiesPtr; + +} // namespace table + +// ============================================================================ + +/** converts the attributes from an CT_Point2D into an awt Point with 1/100th mm */ +com::sun::star::awt::Point GetPoint2D( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); + +/** converts the attributes from an CT_TLPoint into an awt Point with 1/1000% */ +com::sun::star::awt::Point GetPointPercent( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttribs ); + + +/** converts the attributes from an CT_Size2D into an awt Size with 1/100th mm */ +com::sun::star::awt::Size GetSize2D( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); + +/** converts the attributes from a CT_RelativeRect to an IntegerRectangle2D */ +com::sun::star::geometry::IntegerRectangle2D GetRelativeRect( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); + +/** converts an emu string into 1/100th mmm but constrain as per ST_TextMargin + * see 5.1.12.73 + */ +sal_Int32 GetTextMargin( const ::rtl::OUString& sValue ); + +/** converts EMUs into 1/100th mmm */ +sal_Int32 GetCoordinate( sal_Int32 nValue ); + +/** converts an emu string into 1/100th mmm */ +sal_Int32 GetCoordinate( const ::rtl::OUString& sValue ); + +/** converts a ST_Percentage % string into 1/1000th of % */ +sal_Int32 GetPercent( const ::rtl::OUString& sValue ); + +/** Converts a ST_PositiveFixedPercentage to a float. 1.0 == 100% */ +double GetPositiveFixedPercentage( const ::rtl::OUString& sValue ); + +/** converts the ST_TextFontSize to point */ +float GetTextSize( const ::rtl::OUString& rValue ); + +/** converts the ST_TextSpacingPoint to 1/100mm */ +sal_Int32 GetTextSpacingPoint( const ::rtl::OUString& sValue ); + +/** */ +::com::sun::star::style::TabAlign GetTabAlign( ::sal_Int32 aToken ); + +float GetFontHeight( sal_Int32 nHeight ); + +sal_Int16 GetFontUnderline( sal_Int32 nToken ); + +sal_Int16 GetFontStrikeout( sal_Int32 nToken ); + +sal_Int16 GetCaseMap( sal_Int32 nToken ); + +/** converts a paragraph align to a ParaAdjust */ +sal_Int16 GetParaAdjust( sal_Int32 nAlign ); + +// ============================================================================ + +// CT_IndexRange +struct IndexRange { + sal_Int32 start; + sal_Int32 end; +}; + +/** retrieve the content of CT_IndexRange */ +IndexRange GetIndexRange( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); + +// ============================================================================ + +struct EmuPoint +{ + sal_Int64 X; + sal_Int64 Y; + + inline explicit EmuPoint() : X( 0 ), Y( 0 ) {} + inline explicit EmuPoint( sal_Int64 nX, sal_Int64 nY ) : X( nX ), Y( nY ) {} +}; + +// ============================================================================ + +struct EmuSize +{ + sal_Int64 Width; + sal_Int64 Height; + + inline explicit EmuSize() : Width( 0 ), Height( 0 ) {} + inline explicit EmuSize( sal_Int64 nWidth, sal_Int64 nHeight ) : Width( nWidth ), Height( nHeight ) {} +}; + +// ============================================================================ + +struct EmuRectangle : public EmuPoint, public EmuSize +{ + inline explicit EmuRectangle() {} + inline explicit EmuRectangle( const EmuPoint& rPos, const EmuSize& rSize ) : EmuPoint( rPos ), EmuSize( rSize ) {} + inline explicit EmuRectangle( sal_Int64 nX, sal_Int64 nY, sal_Int64 nWidth, sal_Int64 nHeight ) : EmuPoint( nX, nY ), EmuSize( nWidth, nHeight ) {} +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/embeddedwavaudiofile.hxx b/oox/inc/oox/drawingml/embeddedwavaudiofile.hxx new file mode 100644 index 000000000000..d724254b4263 --- /dev/null +++ b/oox/inc/oox/drawingml/embeddedwavaudiofile.hxx @@ -0,0 +1,57 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_EMBEDDEDWAVAUDIOFILE_HXX +#define OOX_DRAWINGML_EMBEDDEDWAVAUDIOFILE_HXX + +#include <rtl/ustring.hxx> +#include <com/sun/star/xml/sax/XFastAttributeList.hpp> + +#include "oox/core/fragmenthandler.hxx" + +namespace oox { namespace drawingml { + + struct EmbeddedWAVAudioFile + { + EmbeddedWAVAudioFile() + : mbBuiltIn(false) + { + } + bool mbBuiltIn; + ::rtl::OUString msName; + ::rtl::OUString msEmbed; + }; + + void getEmbeddedWAVAudioFile( + const ::oox::core::Relations& rRelations, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttribs, + EmbeddedWAVAudioFile & aAudio ); + +} } + + +#endif diff --git a/oox/inc/oox/drawingml/fillproperties.hxx b/oox/inc/oox/drawingml/fillproperties.hxx new file mode 100644 index 000000000000..be6561c970d3 --- /dev/null +++ b/oox/inc/oox/drawingml/fillproperties.hxx @@ -0,0 +1,203 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_FILLPROPERTIES_HXX +#define OOX_DRAWINGML_FILLPROPERTIES_HXX + +#include <map> +#include <com/sun/star/graphic/XGraphic.hpp> +#include <com/sun/star/geometry/IntegerRectangle2D.hpp> +#include "oox/drawingml/color.hxx" +#include "oox/helper/helper.hxx" + +namespace oox { + class ModelObjectHelper; + class PropertyMap; + class PropertySet; +} + +namespace oox { +namespace drawingml { + +// ============================================================================ + +enum FillPropertyId +{ + FillStyleId, + FillColorId, + FillTransparenceId, + FillGradientId, + FillBitmapUrlId, + FillBitmapModeId, + FillBitmapSizeXId, + FillBitmapSizeYId, + FillBitmapOffsetXId, + FillBitmapOffsetYId, + FillBitmapRectanglePointId, + FillId_END +}; + +struct FillPropertyIds +{ + const sal_Int32* mpnPropertyIds; + bool mbNamedFillGradient; + bool mbNamedFillBitmap; + + explicit FillPropertyIds( + const sal_Int32* pnPropertyIds, + bool bNamedFillGradient, + bool bNamedFillBitmap ); + + inline bool has( FillPropertyId ePropId ) const { return mpnPropertyIds[ ePropId ] >= 0; } + inline sal_Int32 operator[]( FillPropertyId ePropId ) const { return mpnPropertyIds[ ePropId ]; } +}; + +// ============================================================================ + +struct GradientFillProperties +{ + typedef ::std::map< double, Color > GradientStopMap; + + GradientStopMap maGradientStops; /// Gradient stops (colors/transparence). + OptValue< ::com::sun::star::geometry::IntegerRectangle2D > moFillToRect; + OptValue< ::com::sun::star::geometry::IntegerRectangle2D > moTileRect; + OptValue< sal_Int32 > moGradientPath; /// If set, gradient follows rectangle, circle, or shape. + OptValue< sal_Int32 > moShadeAngle; /// Rotation angle of linear gradients. + OptValue< sal_Int32 > moShadeFlip; /// Flip mode of gradient, if not stretched to shape. + OptValue< bool > moShadeScaled; /// True = scale gradient into shape. + OptValue< bool > moRotateWithShape; /// True = rotate gradient with shape. + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const GradientFillProperties& rSourceProps ); +}; + +// ============================================================================ + +struct PatternFillProperties +{ + Color maPattFgColor; /// Pattern foreground color. + Color maPattBgColor; /// Pattern background color. + OptValue< sal_Int32 > moPattPreset; /// Preset pattern type. + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const PatternFillProperties& rSourceProps ); +}; + +// ============================================================================ + +struct BlipFillProperties +{ + ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > + mxGraphic; /// The fill graphic. + OptValue< sal_Int32 > moBitmapMode; /// Bitmap tile or stretch. + OptValue< ::com::sun::star::geometry::IntegerRectangle2D > + moFillRect; /// Stretch fill offsets. + OptValue< sal_Int32 > moTileOffsetX; /// Width of bitmap tiles (EMUs). + OptValue< sal_Int32 > moTileOffsetY; /// Height of bitmap tiles (EMUs). + OptValue< sal_Int32 > moTileScaleX; /// Horizontal scaling of bitmap tiles (1/1000 percent). + OptValue< sal_Int32 > moTileScaleY; /// Vertical scaling of bitmap tiles (1/1000 percent). + OptValue< sal_Int32 > moTileAlign; /// Anchor point inside bitmap. + OptValue< sal_Int32 > moTileFlip; /// Flip mode of bitmap tiles. + OptValue< bool > moRotateWithShape; /// True = rotate bitmap with shape. + // effects + OptValue< sal_Int32 > moColorEffect; /// XML token for a color effect. + OptValue< sal_Int32 > moBrightness; /// Brightness in the range [-100000,100000]. + OptValue< sal_Int32 > moContrast; /// Contrast in the range [-100000,100000]. + Color maColorChangeFrom; /// Start color of color transformation. + Color maColorChangeTo; /// Destination color of color transformation. + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const BlipFillProperties& rSourceProps ); +}; + +// ============================================================================ + +struct FillProperties +{ + OptValue< sal_Int32 > moFillType; /// Fill type (OOXML token). + Color maFillColor; /// Solid fill color and transparence. + GradientFillProperties maGradientProps; /// Properties for gradient fills. + PatternFillProperties maPatternProps; /// Properties for pattern fills. + BlipFillProperties maBlipProps; /// Properties for bitmap fills. + + static FillPropertyIds DEFAULT_IDS; /// Default fill property identifiers for shape fill. + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const FillProperties& rSourceProps ); + + /** Tries to resolve current settings to a solid color, e.g. returns the + start color of a gradient. */ + Color getBestSolidColor() const; + + /** Writes the properties to the passed property map. */ + void pushToPropMap( + PropertyMap& rPropMap, + const ::oox::core::FilterBase& rFilter, + ModelObjectHelper& rModelObjHelper, + const FillPropertyIds& rPropIds = DEFAULT_IDS, + sal_Int32 nShapeRotation = 0, + sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const; + + /** Writes the properties to the passed property set. */ + void pushToPropSet( + PropertySet& rPropSet, + const ::oox::core::FilterBase& rFilter, + ModelObjectHelper& rModelObjHelper, + const FillPropertyIds& rPropIds = DEFAULT_IDS, + sal_Int32 nShapeRotation = 0, + sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const; +}; + +// ============================================================================ + +struct GraphicProperties +{ + BlipFillProperties maBlipProps; /// Properties for the graphic. + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const GraphicProperties& rSourceProps ); + + /** Writes the properties to the passed property map. */ + void pushToPropMap( + PropertyMap& rPropMap, + const ::oox::core::FilterBase& rFilter, + sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const; + + /** Writes the properties to the passed property set. */ + void pushToPropSet( + PropertySet& rPropSet, + const ::oox::core::FilterBase& rFilter, + sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/fillpropertiesgroupcontext.hxx b/oox/inc/oox/drawingml/fillpropertiesgroupcontext.hxx new file mode 100644 index 000000000000..86c790795f25 --- /dev/null +++ b/oox/inc/oox/drawingml/fillpropertiesgroupcontext.hxx @@ -0,0 +1,215 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_FILLPROPERTIESGROUPCONTEXT_HPP +#define OOX_DRAWINGML_FILLPROPERTIESGROUPCONTEXT_HPP + +#include "oox/drawingml/colorchoicecontext.hxx" +#include "oox/drawingml/fillproperties.hxx" + +namespace oox { +namespace drawingml { + +// ============================================================================ + +/** Context handler that imports the a:solidFill element. */ +class SolidFillContext : public ColorContext +{ +public: + explicit SolidFillContext( + ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs, + FillProperties& rFillProps ); +}; + +// ============================================================================ + +/** Context handler that imports the a:gradFill element. */ +class GradientFillContext : public ::oox::core::ContextHandler +{ +public: + explicit GradientFillContext( + ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs, + GradientFillProperties& rGradientProps ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException ); + +private: + GradientFillProperties& mrGradientProps; +}; + +// ============================================================================ + +/** Context handler that imports the a:pattFill element. */ +class PatternFillContext : public ::oox::core::ContextHandler +{ +public: + explicit PatternFillContext( + ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs, + PatternFillProperties& rPatternProps ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException ); + +private: + PatternFillProperties& mrPatternProps; +}; + +// ============================================================================ +// ============================================================================ + +/** Context handler that imports the a:clrChange element containing the colors + of a bitmap color change transformation. */ +class ColorChangeContext : public ::oox::core::ContextHandler +{ +public: + explicit ColorChangeContext( + ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs, + BlipFillProperties& rBlipProps ); + virtual ~ColorChangeContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException ); + +private: + BlipFillProperties& mrBlipProps; + bool mbUseAlpha; +}; + +// ============================================================================ + +/** Context handler that imports the a:blip element containing the fill bitmap + and bitmap color transformation settings. */ +class BlipContext : public ::oox::core::ContextHandler +{ +public: + explicit BlipContext( + ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs, + BlipFillProperties& rBlipProps ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException ); + +private: + BlipFillProperties& mrBlipProps; +}; + +// ============================================================================ + +/** Context handler that imports the a:blipFill element. */ +class BlipFillContext : public ::oox::core::ContextHandler +{ +public: + explicit BlipFillContext( + ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs, + BlipFillProperties& rBlipProps ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException ); + +private: + BlipFillProperties& mrBlipProps; +}; + +// ============================================================================ +// ============================================================================ + +/** Context handler for elements that contain a fill property element + (a:noFill, a:solidFill, a:gradFill, a:pattFill, a:blipFill, a:grpFill). */ +class FillPropertiesContext : public ::oox::core::ContextHandler +{ +public: + explicit FillPropertiesContext( + ::oox::core::ContextHandler& rParent, + FillProperties& rFillProps ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException ); + + static ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > + createFillContext( + ::oox::core::ContextHandler& rParent, + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs, + FillProperties& rFillProps ); + +protected: + FillProperties& mrFillProps; +}; + +// ============================================================================ + +/** Context handler for elements that contain a fill property element + (a:noFill, a:solidFill, a:gradFill, a:pattFill, a:blipFill, a:grpFill). + + This context handler takes a simple color instead of a fill properties + struct. The imported fill properties are converted automatically to the + best fitting solid color. + */ +class SimpleFillPropertiesContext : private FillProperties, public FillPropertiesContext +{ +public: + explicit SimpleFillPropertiesContext( + ::oox::core::ContextHandler& rParent, + Color& rColor ); + virtual ~SimpleFillPropertiesContext(); + +protected: + Color& mrColor; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/graphicshapecontext.hxx b/oox/inc/oox/drawingml/graphicshapecontext.hxx new file mode 100644 index 000000000000..d515a4553936 --- /dev/null +++ b/oox/inc/oox/drawingml/graphicshapecontext.hxx @@ -0,0 +1,116 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_GRAPHICSHAPECONTEXT_HXX +#define OOX_DRAWINGML_GRAPHICSHAPECONTEXT_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/shapecontext.hxx" +#include "oox/drawingml/diagram/diagram.hxx" + +namespace oox { namespace vml { struct OleObjectInfo; } } + +namespace oox { namespace drawingml { + +class GraphicShapeContext : public ShapeContext +{ +public: + GraphicShapeContext( ::oox::core::ContextHandler& rParent, ShapePtr pMasterShapePtr, ShapePtr pShapePtr ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +}; + +// ==================================================================== + +class GraphicalObjectFrameContext : public ShapeContext +{ +public: + GraphicalObjectFrameContext( ::oox::core::ContextHandler& rParent, ShapePtr pMasterShapePtr, ShapePtr pShapePtr, bool bEmbedShapesInChart ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + bool mbEmbedShapesInChart; +}; + +// ==================================================================== + +class OleObjectGraphicDataContext : public ShapeContext +{ +public: + OleObjectGraphicDataContext( ::oox::core::ContextHandler& rParent, ShapePtr pShapePtr ); + ~OleObjectGraphicDataContext(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + ::boost::shared_ptr< ::oox::vml::OleObjectInfo > mxOleObjectInfo; +}; + +// ==================================================================== + +class DiagramGraphicDataContext + : public ShapeContext +{ +public: + DiagramGraphicDataContext( ::oox::core::ContextHandler& rParent, ShapePtr pShapePtr ); + virtual ~DiagramGraphicDataContext(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + DiagramPtr loadDiagram(); + + ::rtl::OUString msDm; + ::rtl::OUString msLo; + ::rtl::OUString msQs; + ::rtl::OUString msCs; +}; + +// ==================================================================== + +class ChartGraphicDataContext : public ShapeContext +{ +public: + explicit ChartGraphicDataContext( + ::oox::core::ContextHandler& rParent, + const ShapePtr& rxShape, bool bEmbedShapes ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( + sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + bool mbEmbedShapes; +}; + +// ==================================================================== + +} } + +#endif // OOX_DRAWINGML_GRAPHICSHAPECONTEXT_HXX diff --git a/oox/inc/oox/drawingml/guidcontext.hxx b/oox/inc/oox/drawingml/guidcontext.hxx new file mode 100644 index 000000000000..20dff63fc373 --- /dev/null +++ b/oox/inc/oox/drawingml/guidcontext.hxx @@ -0,0 +1,49 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_GUIDCONTEXT_HXX +#define OOX_DRAWINGML_GUIDCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + + class GuidContext : public ::oox::core::ContextHandler + { + + public: + GuidContext( ::oox::core::ContextHandler& rParent, rtl::OUString& rGuidId ); + virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + private: + + rtl::OUString& mrGuidId; + }; + +} } + +#endif diff --git a/oox/inc/oox/drawingml/lineproperties.hxx b/oox/inc/oox/drawingml/lineproperties.hxx new file mode 100644 index 000000000000..9a538db30156 --- /dev/null +++ b/oox/inc/oox/drawingml/lineproperties.hxx @@ -0,0 +1,127 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_LINEPROPERTIES_HXX +#define OOX_DRAWINGML_LINEPROPERTIES_HXX + +#include "oox/drawingml/fillproperties.hxx" + +namespace oox { +namespace drawingml { + +// ============================================================================ + +enum LinePropertyId +{ + LineStyleId, + LineWidthId, + LineColorId, + LineTransparenceId, + LineDashId, + LineJointId, + LineStartId, + LineStartWidthId, + LineStartCenterId, + LineEndId, + LineEndWidthId, + LineEndCenterId, + LineId_END +}; + +struct LinePropertyIds +{ + const sal_Int32* mpnPropertyIds; + bool mbNamedLineDash; + bool mbNamedLineMarker; + + explicit LinePropertyIds( + const sal_Int32* pnPropertyIds, + bool bNamedLineDash, + bool bNamedLineMarker ); + + inline bool has( LinePropertyId ePropId ) const { return mpnPropertyIds[ ePropId ] >= 0; } + inline sal_Int32 operator[]( LinePropertyId ePropId ) const { return mpnPropertyIds[ ePropId ]; } +}; + +// ============================================================================ + +struct LineArrowProperties +{ + OptValue< sal_Int32 > moArrowType; + OptValue< sal_Int32 > moArrowWidth; + OptValue< sal_Int32 > moArrowLength; + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const LineArrowProperties& rSourceProps ); +}; + +// ============================================================================ + +struct LineProperties +{ + typedef ::std::pair< sal_Int32, sal_Int32 > DashStop; + typedef ::std::vector< DashStop > DashStopVector; + + LineArrowProperties maStartArrow; /// Start line arrow style. + LineArrowProperties maEndArrow; /// End line arrow style. + FillProperties maLineFill; /// Line fill (solid, gradient, ...). + DashStopVector maCustomDash; /// User-defined line dash style. + OptValue< sal_Int32 > moLineWidth; /// Line width (EMUs). + OptValue< sal_Int32 > moPresetDash; /// Preset dash (OOXML token). + OptValue< sal_Int32 > moLineCompound; /// Line compound type (OOXML token). + OptValue< sal_Int32 > moLineCap; /// Line cap (OOXML token). + OptValue< sal_Int32 > moLineJoint; /// Line joint type (OOXML token). + + static LinePropertyIds DEFAULT_IDS; /// Default line property identifiers. + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const LineProperties& rSourceProps ); + + /** Writes the properties to the passed property map. */ + void pushToPropMap( + PropertyMap& rPropMap, + const ::oox::core::FilterBase& rFilter, + ModelObjectHelper& rModelObjHelper, + const LinePropertyIds& rPropIds = DEFAULT_IDS, + sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const; + + /** Writes the properties to the passed property map. */ + void pushToPropSet( + PropertySet& rPropSet, + const ::oox::core::FilterBase& rFilter, + ModelObjectHelper& rModelObjHelper, + const LinePropertyIds& rPropIds = DEFAULT_IDS, + sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/linepropertiescontext.hxx b/oox/inc/oox/drawingml/linepropertiescontext.hxx new file mode 100644 index 000000000000..617e3fa67c93 --- /dev/null +++ b/oox/inc/oox/drawingml/linepropertiescontext.hxx @@ -0,0 +1,57 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_LINEPROPERTIESCONTEXT_HXX +#define OOX_DRAWINGML_LINEPROPERTIESCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +// --------------------------------------------------------------------- + +struct LineProperties; + +class LinePropertiesContext : public ::oox::core::ContextHandler +{ +public: + LinePropertiesContext( ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, + LineProperties& rLineProperties ) throw(); + ~LinePropertiesContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + LineProperties& mrLineProperties; +}; + +} } + +#endif // OOX_DRAWINGML_LINEPROPERTIESCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/objectdefaultcontext.hxx b/oox/inc/oox/drawingml/objectdefaultcontext.hxx new file mode 100644 index 000000000000..b572637ec047 --- /dev/null +++ b/oox/inc/oox/drawingml/objectdefaultcontext.hxx @@ -0,0 +1,49 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_OBJECTDEFAULTCONTEXT_HXX +#define OOX_DRAWINGML_OBJECTDEFAULTCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +class Theme; + +class objectDefaultContext : public oox::core::ContextHandler +{ +public: + objectDefaultContext( ::oox::core::ContextHandler& rParent, Theme& rTheme ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + Theme& mrTheme; +}; + +} } + +#endif // OOX_DRAWINGML_OBJECTDEFAULTCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/shape.hxx b/oox/inc/oox/drawingml/shape.hxx new file mode 100644 index 000000000000..f4f5a5ee68fe --- /dev/null +++ b/oox/inc/oox/drawingml/shape.hxx @@ -0,0 +1,212 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SHAPE_HXX +#define OOX_DRAWINGML_SHAPE_HXX + +#include "oox/helper/propertymap.hxx" +#include "oox/drawingml/drawingmltypes.hxx" +#include "oox/drawingml/customshapeproperties.hxx" +#include "oox/drawingml/textliststyle.hxx" + +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/drawing/XDrawPage.hpp> +#include <boost/shared_ptr.hpp> +#include <boost/enable_shared_from_this.hpp> +#include <vector> +#include <map> + +namespace oox { namespace drawingml { + +typedef ::std::map< ::rtl::OUString, ShapePtr > ShapeIdMap; + +struct ShapeStyleRef +{ + Color maPhClr; + sal_Int32 mnThemedIdx; +}; + +typedef ::std::map< sal_Int32, ShapeStyleRef > ShapeStyleRefMap; + +// ============================================================================ + +/** A callback that will be called before and after the API shape is created + from the imported shape. + + An instance of a derived class of this callback can be set at every + ::oox::drawingml::Shape instance to implement anything that needs a created + and inserted XShape. + */ +class CreateShapeCallback +{ +public: + virtual ::rtl::OUString onCreateXShape( + const ::rtl::OUString& rServiceName, + const ::com::sun::star::awt::Rectangle& rShapeRect ); + + virtual void onXShapeCreated( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes ) const; + + inline const PropertyMap& getShapeProperties() const { return maShapeProps; } + +protected: + explicit CreateShapeCallback( ::oox::core::XmlFilterBase& rFilter ); + virtual ~CreateShapeCallback(); + +protected: + ::oox::core::XmlFilterBase& mrFilter; + PropertyMap maShapeProps; +}; + +typedef ::boost::shared_ptr< CreateShapeCallback > CreateShapeCallbackRef; + +// ============================================================================ + +class Shape + : public boost::enable_shared_from_this< Shape > +{ +public: + + Shape( const sal_Char* pServiceType = NULL ); + virtual ~Shape(); + + rtl::OUString& getServiceName(){ return msServiceName; } + void setServiceName( const sal_Char* pServiceName ); + + PropertyMap& getShapeProperties(){ return maShapeProperties; } + + inline LineProperties& getLineProperties() { return *mpLinePropertiesPtr; } + inline const LineProperties& getLineProperties() const { return *mpLinePropertiesPtr; } + + inline FillProperties& getFillProperties() { return *mpFillPropertiesPtr; } + inline const FillProperties& getFillProperties() const { return *mpFillPropertiesPtr; } + + inline GraphicProperties& getGraphicProperties() { return *mpGraphicPropertiesPtr; } + inline const GraphicProperties& getGraphicProperties() const { return *mpGraphicPropertiesPtr; } + + CustomShapePropertiesPtr getCustomShapeProperties(){ return mpCustomShapePropertiesPtr; } + + table::TablePropertiesPtr getTableProperties(); + + void setPosition( com::sun::star::awt::Point nPosition ){ maPosition = nPosition; } + void setSize( com::sun::star::awt::Size aSize ){ maSize = aSize; } + void setRotation( sal_Int32 nRotation ) { mnRotation = nRotation; } + void setFlip( sal_Bool bFlipH, sal_Bool bFlipV ) { mbFlipH = bFlipH; mbFlipV = bFlipV; } + void addChild( const ShapePtr pChildPtr ) { maChildren.push_back( pChildPtr ); } + std::vector< ShapePtr >& getChildren() { return maChildren; } + + void setName( const rtl::OUString& rName ) { msName = rName; } + ::rtl::OUString getName( ) { return msName; } + void setId( const rtl::OUString& rId ) { msId = rId; } + void setSubType( sal_Int32 nSubType ) { mnSubType = nSubType; } + sal_Int32 getSubType() const { return mnSubType; } + void setSubTypeIndex( sal_uInt32 nSubTypeIndex ) { mnSubTypeIndex = nSubTypeIndex; } + sal_Int32 getSubTypeIndex() const { return mnSubTypeIndex; } + + // setDefaults has to be called if styles are imported (OfficeXML is not storing properties having the default value) + void setDefaults(); + + void setTextBody(const TextBodyPtr & pTextBody); + TextBodyPtr getTextBody(); + void setMasterTextListStyle( const TextListStylePtr& pMasterTextListStyle ); + TextListStylePtr getMasterTextListStyle() const { return mpMasterTextListStyle; } + + inline ShapeStyleRefMap& getShapeStyleRefs() { return maShapeStyleRefs; } + inline const ShapeStyleRefMap& getShapeStyleRefs() const { return maShapeStyleRefs; } + const ShapeStyleRef* getShapeStyleRef( sal_Int32 nRefType ) const; + + inline void setCreateShapeCallback( CreateShapeCallbackRef xCallback ) { mxCreateCallback = xCallback; } + + // addShape is creating and inserting the corresponding XShape. + void addShape( + const oox::core::XmlFilterBase& rFilterBase, + const Theme* pTheme, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle* pShapeRect = 0, + ShapeIdMap* pShapeMap = 0 ); + + void setXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rXShape ) + { mxShape = rXShape; }; + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & + getXShape() const { return mxShape; } + + virtual void applyShapeReference( const Shape& rReferencedShape ); + +protected: + + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + createAndInsert( + const ::oox::core::XmlFilterBase& rFilterBase, + const ::rtl::OUString& rServiceName, + const Theme* pTheme, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle* pShapeRect, + sal_Bool bClearText ); + + void addChildren( + const ::oox::core::XmlFilterBase& rFilterBase, + Shape& rMaster, + const Theme* pTheme, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle& rClientRect, + ShapeIdMap* pShapeMap ); + + std::vector< ShapePtr > maChildren; // only used for group shapes + TextBodyPtr mpTextBody; + LinePropertiesPtr mpLinePropertiesPtr; + FillPropertiesPtr mpFillPropertiesPtr; + GraphicPropertiesPtr mpGraphicPropertiesPtr; + CustomShapePropertiesPtr mpCustomShapePropertiesPtr; + table::TablePropertiesPtr mpTablePropertiesPtr; + PropertyMap maShapeProperties; + TextListStylePtr mpMasterTextListStyle; + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > mxShape; + + rtl::OUString msServiceName; + rtl::OUString msName; + rtl::OUString msId; + sal_Int32 mnSubType; // if this type is not zero, then the shape is a placeholder + sal_Int32 mnSubTypeIndex; + + ShapeStyleRefMap maShapeStyleRefs; + + com::sun::star::awt::Size maSize; + com::sun::star::awt::Point maPosition; + +private: + CreateShapeCallbackRef mxCreateCallback; + sal_Int32 mnRotation; + sal_Bool mbFlipH; + sal_Bool mbFlipV; +}; + +::rtl::OUString GetShapeType( sal_Int32 nType ); + +} } + +#endif // OOX_DRAWINGML_SHAPE_HXX diff --git a/oox/inc/oox/drawingml/shapecontext.hxx b/oox/inc/oox/drawingml/shapecontext.hxx new file mode 100644 index 000000000000..68ef45ac92cc --- /dev/null +++ b/oox/inc/oox/drawingml/shapecontext.hxx @@ -0,0 +1,58 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SHAPECONTEXT_HXX +#define OOX_DRAWINGML_SHAPECONTEXT_HXX + +#include <com/sun/star/drawing/XShapes.hpp> + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/shapepropertiescontext.hxx" + +namespace oox { namespace drawingml { + +class ShapeContext : public ::oox::core::ContextHandler +{ +public: + ShapeContext( ::oox::core::ContextHandler& rParent, ShapePtr pMasterShapePtr, ShapePtr pShapePtr ); + virtual ~ShapeContext(); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + ShapePtr getShape(); + +protected: + + ShapePtr mpMasterShapePtr; + ShapePtr mpShapePtr; +}; + +} } + +#endif // OOX_DRAWINGML_SHAPEGROUPCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/shapegroupcontext.hxx b/oox/inc/oox/drawingml/shapegroupcontext.hxx new file mode 100644 index 000000000000..681c527c0635 --- /dev/null +++ b/oox/inc/oox/drawingml/shapegroupcontext.hxx @@ -0,0 +1,51 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SHAPEGROUPCONTEXT_HXX +#define OOX_DRAWINGML_SHAPEGROUPCONTEXT_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/shapecontext.hxx" + +namespace oox { namespace drawingml { + +class ShapeGroupContext : public ::oox::core::ContextHandler +{ +public: + ShapeGroupContext( ::oox::core::ContextHandler& rParent, ShapePtr pMasterShapePtr, ShapePtr pGroupShapePtr ); + virtual ~ShapeGroupContext(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + + ShapePtr mpGroupShapePtr; + ShapePtr mpMasterShapePtr; +}; + +} } + +#endif // OOX_DRAWINGML_SHAPEGROUPCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/shapepropertiescontext.hxx b/oox/inc/oox/drawingml/shapepropertiescontext.hxx new file mode 100644 index 000000000000..8cb4a3276918 --- /dev/null +++ b/oox/inc/oox/drawingml/shapepropertiescontext.hxx @@ -0,0 +1,49 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SHAPEPROPERTIESCONTEXT_HXX +#define OOX_DRAWINGML_SHAPEPROPERTIESCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/shape.hxx" + +namespace oox { namespace drawingml { + +class ShapePropertiesContext : public ::oox::core::ContextHandler +{ +public: + ShapePropertiesContext( ::oox::core::ContextHandler& rParent, Shape& rShape ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + Shape& mrShape; +}; + +} } + +#endif // OOX_DRAWINGML_SHAPEPROPERTIESCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/shapestylecontext.hxx b/oox/inc/oox/drawingml/shapestylecontext.hxx new file mode 100644 index 000000000000..71fc8b33b7c6 --- /dev/null +++ b/oox/inc/oox/drawingml/shapestylecontext.hxx @@ -0,0 +1,51 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SHAPESTYLECONTEXT_HXX +#define OOX_DRAWINGML_SHAPESTYLECONTEXT_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +class ShapeStyleContext : public ::oox::core::ContextHandler +{ +public: + ShapeStyleContext( ::oox::core::ContextHandler& rParent, Shape& rShape ); + ~ShapeStyleContext(); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + Shape& mrShape; +}; + +} } + +#endif // OOX_DRAWINGML_SHAPESTYLECONTEXT_HXX diff --git a/oox/inc/oox/drawingml/spdefcontext.hxx b/oox/inc/oox/drawingml/spdefcontext.hxx new file mode 100644 index 000000000000..dced46eaa700 --- /dev/null +++ b/oox/inc/oox/drawingml/spdefcontext.hxx @@ -0,0 +1,48 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SPDEFCONTEXT_HXX +#define OOX_DRAWINGML_SPDEFCONTEXT_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +class spDefContext : public oox::core::ContextHandler +{ +public: + spDefContext( ::oox::core::ContextHandler& rParent, Shape& rDefaultObject ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + Shape& mrDefaultObject; +}; + +} } + +#endif // OOX_DRAWINGML_SPDEFCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/table/tablebackgroundstylecontext.hxx b/oox/inc/oox/drawingml/table/tablebackgroundstylecontext.hxx new file mode 100644 index 000000000000..541fc2333234 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablebackgroundstylecontext.hxx @@ -0,0 +1,53 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TABLEBACKGROUNDSTYLECONTEXT +#define OOX_DRAWINGML_TABLEBACKGROUNDSTYLECONTEXT + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/table/tablestyle.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TableBackgroundStyleContext : public ::oox::core::ContextHandler +{ +public: + TableBackgroundStyleContext( ::oox::core::ContextHandler& rParent, TableStyle& rTableStyle ); + ~TableBackgroundStyleContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableStyle& mrTableStyle; +}; + +} } } + + +#endif diff --git a/oox/inc/oox/drawingml/table/tablecell.hxx b/oox/inc/oox/drawingml/table/tablecell.hxx new file mode 100644 index 000000000000..cf70e1d155c0 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablecell.hxx @@ -0,0 +1,121 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TABLECELL_HXX +#define OOX_DRAWINGML_TABLECELL_HXX + +#include "oox/helper/propertymap.hxx" +#include "oox/drawingml/color.hxx" +#include "oox/drawingml/drawingmltypes.hxx" +#include "oox/drawingml/lineproperties.hxx" +#include "oox/drawingml/fillproperties.hxx" +#include "oox/drawingml/textliststyle.hxx" +#include <com/sun/star/table/XCell.hpp> + +#include <boost/shared_ptr.hpp> +#include <boost/optional.hpp> +#include <vector> +#include <map> + +namespace oox { namespace drawingml { namespace table { + +class TableCellContext; +class TableProperties; +class TableStyle; + +class TableCell +{ + friend class TableCellContext; + +public: + + TableCell(); + ~TableCell(); + + sal_Int32 getRowSpan() const { return mnRowSpan; }; + void setRowSpan( sal_Int32 nRowSpan ){ mnRowSpan = nRowSpan; }; + sal_Int32 getGridSpan() const { return mnGridSpan; }; + void setGridSpan( sal_Int32 nGridSpan ){ mnGridSpan = nGridSpan; }; + sal_Bool gethMerge() const { return mbhMerge; }; + void sethMerge( sal_Bool bhMerge ){ mbhMerge = bhMerge; }; + sal_Bool getvMerge() const { return mbvMerge; }; + void setvMerge( sal_Bool bvMerge ){ mbvMerge = bvMerge; }; + sal_Int32 getLeftMargin() const { return mnMarL; }; + void setLeftMargin( sal_Int32 nMargin ){ mnMarL = nMargin; }; + sal_Int32 getRightMargin() const { return mnMarR; }; + void setRightMargin( sal_Int32 nMargin ){ mnMarR = nMargin; }; + sal_Int32 getTopMargin() const { return mnMarT; }; + void setTopMargin( sal_Int32 nMargin ){ mnMarT = nMargin; }; + sal_Int32 getBottomMargin() const { return mnMarB; }; + void setBottomMargin( sal_Int32 nMargin ){ mnMarB = nMargin; }; + sal_Int32 getVertToken() const { return mnVertToken; }; + void setVertToken( sal_Int32 nToken ){ mnVertToken = nToken; }; + sal_Int32 getAnchorToken() const { return mnAnchorToken; }; + void setAnchorToken( sal_Int32 nToken ){ mnAnchorToken = nToken; }; + sal_Bool getAnchorCtr() const { return mbAnchorCtr; }; + void setAnchorCtr( sal_Bool bAnchorCtr ){ mbAnchorCtr = bAnchorCtr; }; + sal_Int32 getHorzOverflowToken() const { return mnHorzOverflowToken; }; + void setHorzOverflowToken( sal_Int32 nToken ){ mnHorzOverflowToken = nToken; }; + + void setTextBody( const oox::drawingml::TextBodyPtr& pTextBody ){ mpTextBody = pTextBody; }; + oox::drawingml::TextBodyPtr getTextBody(){ return mpTextBody; }; + + void pushToXCell( const ::oox::core::XmlFilterBase& rFilterBase, ::oox::drawingml::TextListStylePtr pMasterTextListStyle, + const ::com::sun::star::uno::Reference < ::com::sun::star::table::XCell >& rxCell, const TableProperties& rTableProperties, + const TableStyle& rTable, sal_Int32 nColumn, sal_Int32 nMaxColumn, sal_Int32 nRow, sal_Int32 nMaxRow ); + +private: + + oox::drawingml::TextBodyPtr mpTextBody; + + oox::drawingml::LineProperties maLinePropertiesLeft; + oox::drawingml::LineProperties maLinePropertiesRight; + oox::drawingml::LineProperties maLinePropertiesTop; + oox::drawingml::LineProperties maLinePropertiesBottom; + oox::drawingml::LineProperties maLinePropertiesTopLeftToBottomRight; + oox::drawingml::LineProperties maLinePropertiesBottomLeftToTopRight; + + oox::drawingml::FillProperties maFillProperties; + + sal_Int32 mnRowSpan; + sal_Int32 mnGridSpan; + sal_Bool mbhMerge; + sal_Bool mbvMerge; + + sal_Int32 mnMarL; + sal_Int32 mnMarR; + sal_Int32 mnMarT; + sal_Int32 mnMarB; + sal_Int32 mnVertToken; + sal_Int32 mnAnchorToken; + sal_Bool mbAnchorCtr; + sal_Int32 mnHorzOverflowToken; +}; + +} } } + +#endif // OOX_DRAWINGML_TABLECELL_HXX diff --git a/oox/inc/oox/drawingml/table/tablecellcontext.hxx b/oox/inc/oox/drawingml/table/tablecellcontext.hxx new file mode 100644 index 000000000000..02ab8d93ff76 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablecellcontext.hxx @@ -0,0 +1,54 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TABLECELLCONTEXT +#define OOX_DRAWINGML_TABLECELLCONTEXT + +#include "oox/drawingml/shapecontext.hxx" +#include "oox/drawingml/table/tablecell.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TableCellContext : public ::oox::core::ContextHandler +{ +public: + TableCellContext( ::oox::core::ContextHandler& rParent, + const com::sun::star::uno::Reference< com::sun::star::xml::sax::XFastAttributeList >& xAttribs, TableCell& rTableCell ); + ~TableCellContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableCell& mrTableCell; +}; + +} } } + + +#endif diff --git a/oox/inc/oox/drawingml/table/tablecontext.hxx b/oox/inc/oox/drawingml/table/tablecontext.hxx new file mode 100644 index 000000000000..727bf66b4185 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablecontext.hxx @@ -0,0 +1,54 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TABLECONTEXT +#define OOX_DRAWINGML_TABLECONTEXT + +#include "oox/drawingml/shapecontext.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TableProperties; + +class TableContext : public ShapeContext +{ +public: + TableContext( ::oox::core::ContextHandler& rParent, ShapePtr pShapePtr ); + ~TableContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableProperties& mrTableProperties; +}; + +} } } + + +#endif diff --git a/oox/inc/oox/drawingml/table/tablepartstylecontext.hxx b/oox/inc/oox/drawingml/table/tablepartstylecontext.hxx new file mode 100644 index 000000000000..902e1ad79f89 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablepartstylecontext.hxx @@ -0,0 +1,53 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TABLEPARTSTYLECONTEXT +#define OOX_DRAWINGML_TABLEPARTSTYLECONTEXT + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/table/tablestylepart.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TablePartStyleContext : public ::oox::core::ContextHandler +{ +public: + TablePartStyleContext( ::oox::core::ContextHandler& rParent, TableStylePart& rTableStylePart ); + ~TablePartStyleContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableStylePart& mrTableStylePart; +}; + +} } } + + +#endif diff --git a/oox/inc/oox/drawingml/table/tableproperties.hxx b/oox/inc/oox/drawingml/table/tableproperties.hxx new file mode 100644 index 000000000000..83793709da7c --- /dev/null +++ b/oox/inc/oox/drawingml/table/tableproperties.hxx @@ -0,0 +1,87 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TABLEPROPERTIES_HXX +#define OOX_DRAWINGML_TABLEPROPERTIES_HXX + +#include "oox/drawingml/table/tablerow.hxx" +#include "oox/drawingml/table/tablestyle.hxx" +#include "oox/helper/propertymap.hxx" +#include "oox/drawingml/color.hxx" + +#include <boost/shared_ptr.hpp> +#include <boost/optional.hpp> +#include <vector> +#include <map> + +namespace oox { namespace drawingml { namespace table { + +class TableProperties +{ +public: + + TableProperties(); + ~TableProperties(); + + std::vector< sal_Int32 >& getTableGrid() { return mvTableGrid; }; + std::vector< TableRow >& getTableRows() { return mvTableRows; }; + + rtl::OUString& getStyleId(){ return maStyleId; }; + boost::shared_ptr< TableStyle >& getTableStyle(){ return mpTableStyle; }; + sal_Bool& isRtl(){ return mbRtl; }; + sal_Bool& isFirstRow(){ return mbFirstRow; }; + sal_Bool& isFirstCol(){ return mbFirstCol; }; + sal_Bool& isLastRow(){ return mbLastRow; }; + sal_Bool& isLastCol(){ return mbLastCol; }; + sal_Bool& isBandRow(){ return mbBandRow; }; + sal_Bool& isBandCol(){ return mbBandCol; }; + + void apply( const TablePropertiesPtr& ); + void pushToPropSet( const ::oox::core::XmlFilterBase& rFilterBase, + const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > & xPropSet, ::oox::drawingml::TextListStylePtr pMasterTextListStyle ); + +private: + + const TableStyle& getUsedTableStyle( const ::oox::core::XmlFilterBase& rFilterBase ); + + rtl::OUString maStyleId; // either StyleId is available + boost::shared_ptr< TableStyle > mpTableStyle; // or the complete TableStyle + std::vector< sal_Int32 > mvTableGrid; + std::vector< TableRow > mvTableRows; + + sal_Bool mbRtl; + sal_Bool mbFirstRow; + sal_Bool mbFirstCol; + sal_Bool mbLastRow; + sal_Bool mbLastCol; + sal_Bool mbBandRow; + sal_Bool mbBandCol; +}; + +} } } + +#endif // OOX_DRAWINGML_TABLEPROPERTIES_HXX diff --git a/oox/inc/oox/drawingml/table/tablerow.hxx b/oox/inc/oox/drawingml/table/tablerow.hxx new file mode 100644 index 000000000000..4ef12f3002ea --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablerow.hxx @@ -0,0 +1,55 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TABLEROW_HXX +#define OOX_DRAWINGML_TABLEROW_HXX + +#include "oox/drawingml/table/tablecell.hxx" +#include <vector> + +namespace oox { namespace drawingml { namespace table { + +class TableRow +{ +public: + + TableRow(); + ~TableRow(); + + void setHeight( sal_Int32 nHeight ){ mnHeight = nHeight; }; + sal_Int32 getHeight() const { return mnHeight; }; + std::vector< TableCell >& getTableCells() { return mvTableCells; }; + +private: + + sal_Int32 mnHeight; + std::vector< TableCell > mvTableCells; +}; + +} } } + +#endif // OOX_DRAWINGML_TABLEROW_HXX diff --git a/oox/inc/oox/drawingml/table/tablerowcontext.hxx b/oox/inc/oox/drawingml/table/tablerowcontext.hxx new file mode 100644 index 000000000000..f6cd981ddaed --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablerowcontext.hxx @@ -0,0 +1,55 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TABLEROWCONTEXT +#define OOX_DRAWINGML_TABLEROWCONTEXT + +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TableRow; + +class TableRowContext : public ::oox::core::ContextHandler +{ +public: + TableRowContext( ::oox::core::ContextHandler& rParent, + const com::sun::star::uno::Reference< com::sun::star::xml::sax::XFastAttributeList >& xAttribs, TableRow& rTableRow ); + ~TableRowContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableRow& mrTableRow; +}; + +} } } + + +#endif diff --git a/oox/inc/oox/drawingml/table/tablestyle.hxx b/oox/inc/oox/drawingml/table/tablestyle.hxx new file mode 100644 index 000000000000..4fb71d6ad5e0 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablestyle.hxx @@ -0,0 +1,91 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TABLESTYLE_HXX +#define OOX_DRAWINGML_TABLESTYLE_HXX + +#include "oox/drawingml/table/tablestylepart.hxx" +#include "oox/drawingml/drawingmltypes.hxx" +#include "oox/drawingml/shape.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TableStyle +{ +public: + + TableStyle(); + ~TableStyle(); + + rtl::OUString& getStyleId(){ return maStyleId; } + rtl::OUString& getStyleName() { return maStyleName; } + + ::oox::drawingml::ShapeStyleRef& getBackgroundFillStyleRef(){ return maFillStyleRef; } + + ::oox::drawingml::FillPropertiesPtr& getBackgroundFillProperties(){ return mpFillProperties; } + + TableStylePart& getWholeTbl() { return maWholeTbl; } + TableStylePart& getBand1H() { return maBand1H; } + TableStylePart& getBand2H() { return maBand2H; } + TableStylePart& getBand1V() { return maBand1V; } + TableStylePart& getBand2V() { return maBand2V; } + TableStylePart& getLastCol() { return maLastCol; } + TableStylePart& getFirstCol() { return maFirstCol; } + TableStylePart& getLastRow() { return maLastRow; } + TableStylePart& getSeCell() { return maSeCell; } + TableStylePart& getSwCell() { return maSwCell; } + TableStylePart& getFirstRow() { return maFirstRow; } + TableStylePart& getNeCell() { return maNeCell; } + TableStylePart& getNwCell() { return maNwCell; } + +private: + + rtl::OUString maStyleId; + rtl::OUString maStyleName; + + ::oox::drawingml::ShapeStyleRef maFillStyleRef; + + ::oox::drawingml::FillPropertiesPtr mpFillProperties; + + TableStylePart maWholeTbl; + TableStylePart maBand1H; + TableStylePart maBand2H; + TableStylePart maBand1V; + TableStylePart maBand2V; + TableStylePart maLastCol; + TableStylePart maFirstCol; + TableStylePart maLastRow; + TableStylePart maSeCell; + TableStylePart maSwCell; + TableStylePart maFirstRow; + TableStylePart maNeCell; + TableStylePart maNwCell; +}; + +} } } + +#endif // OOX_DRAWINGML_TABLESTYLE_HXX diff --git a/oox/inc/oox/drawingml/table/tablestylecellstylecontext.hxx b/oox/inc/oox/drawingml/table/tablestylecellstylecontext.hxx new file mode 100644 index 000000000000..e63a7754845e --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablestylecellstylecontext.hxx @@ -0,0 +1,54 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TABLESTYLECELLSTYLECONTEXT +#define OOX_DRAWINGML_TABLESTYLECELLSTYLECONTEXT + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/table/tablestylepart.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TableStyleCellStyleContext : public ::oox::core::ContextHandler +{ +public: + TableStyleCellStyleContext( ::oox::core::ContextHandler& rParent, TableStylePart& rTableStylePart ); + ~TableStyleCellStyleContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableStylePart& mrTableStylePart; + sal_Int32 mnLineType; +}; + +} } } + + +#endif diff --git a/oox/inc/oox/drawingml/table/tablestylecontext.hxx b/oox/inc/oox/drawingml/table/tablestylecontext.hxx new file mode 100644 index 000000000000..8e464b2b2744 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablestylecontext.hxx @@ -0,0 +1,55 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TABLESTYLECONTEXT +#define OOX_DRAWINGML_TABLESTYLECONTEXT + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/table/tablestyle.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TableStyleContext : public ::oox::core::ContextHandler +{ +public: + TableStyleContext( ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs, + TableStyle& rTableStyle ); + ~TableStyleContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableStyle& mrTableStyle; +}; + +} } } + + +#endif diff --git a/oox/inc/oox/drawingml/table/tablestylelist.hxx b/oox/inc/oox/drawingml/table/tablestylelist.hxx new file mode 100644 index 000000000000..ea82fcdc4b28 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablestylelist.hxx @@ -0,0 +1,60 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TABLESTYLELIST_HXX +#define OOX_DRAWINGML_TABLESTYLELIST_HXX + +#include <rtl/ustring.hxx> +#include <boost/shared_ptr.hpp> +#include <vector> + +namespace oox { namespace drawingml { namespace table { + +class TableStyle; + +class TableStyleList +{ +public: + + TableStyleList(); + ~TableStyleList(); + + rtl::OUString& getDefaultStyleId() { return maDefaultStyleId; }; + std::vector< TableStyle >& getTableStyles(){ return maTableStyles; }; + +private: + + rtl::OUString maDefaultStyleId; + std::vector< TableStyle > maTableStyles; + +}; + +typedef boost::shared_ptr< TableStyleList > TableStyleListPtr; + +} } } + +#endif // OOX_DRAWINGML_TABLESTYLELIST_HXX diff --git a/oox/inc/oox/drawingml/table/tablestylelistfragmenthandler.hxx b/oox/inc/oox/drawingml/table/tablestylelistfragmenthandler.hxx new file mode 100644 index 000000000000..7142f395d041 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablestylelistfragmenthandler.hxx @@ -0,0 +1,63 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TABLESTYLELISTFRAGMENTHANDLER_HXX +#define OOX_DRAWINGML_TABLESTYLELISTFRAGMENTHANDLER_HXX + +#include "oox/drawingml/table/tablestylelist.hxx" +#include "oox/core/fragmenthandler2.hxx" + +namespace oox { +namespace drawingml { +namespace table { + +// ============================================================================ + +class TableStyleListFragmentHandler : public ::oox::core::FragmentHandler2 +{ +public: + explicit TableStyleListFragmentHandler( + ::oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + TableStyleList& rTableStyleList ); + virtual ~TableStyleListFragmentHandler(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableStyleList& mrTableStyleList; +}; + +// ============================================================================ + +} // namespace table +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/table/tablestylepart.hxx b/oox/inc/oox/drawingml/table/tablestylepart.hxx new file mode 100644 index 000000000000..aebdd0245516 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablestylepart.hxx @@ -0,0 +1,79 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TABLESTYLEPART_HXX +#define OOX_DRAWINGML_TABLESTYLEPART_HXX + +#include <rtl/ustring.hxx> +#include <boost/optional.hpp> +#include "oox/drawingml/color.hxx" +#include "oox/drawingml/textfont.hxx" +#include "oox/drawingml/fillproperties.hxx" +#include "oox/drawingml/lineproperties.hxx" +#include "oox/drawingml/shape.hxx" +#include <map> + +namespace oox { namespace drawingml { namespace table { + +class TableStylePart +{ +public: + + TableStylePart(); + ~TableStylePart(); + + ::oox::drawingml::Color& getTextColor(){ return maTextColor; } + ::boost::optional< sal_Bool >& getTextBoldStyle(){ return maTextBoldStyle; } + ::boost::optional< sal_Bool >& getTextItalicStyle(){ return maTextItalicStyle; } + ::oox::drawingml::TextFont& getAsianFont(){ return maAsianFont; } + ::oox::drawingml::TextFont& getComplexFont(){ return maComplexFont; } + ::oox::drawingml::TextFont& getSymbolFont(){ return maSymbolFont; } + ::oox::drawingml::TextFont& getLatinFont(){ return maLatinFont; } + + ::oox::drawingml::FillPropertiesPtr& getFillProperties(){ return mpFillProperties; } + std::map < sal_Int32, ::oox::drawingml::LinePropertiesPtr >& getLineBorders(){ return maLineBorders; } + + ::oox::drawingml::ShapeStyleRefMap& getStyleRefs(){ return maStyleRefs; } + +private: + + ::oox::drawingml::Color maTextColor; + ::boost::optional< sal_Bool > maTextBoldStyle; + ::boost::optional< sal_Bool > maTextItalicStyle; + ::oox::drawingml::TextFont maAsianFont; + ::oox::drawingml::TextFont maComplexFont; + ::oox::drawingml::TextFont maSymbolFont; + ::oox::drawingml::TextFont maLatinFont; + + ::oox::drawingml::FillPropertiesPtr mpFillProperties; + std::map < sal_Int32, ::oox::drawingml::LinePropertiesPtr > maLineBorders; + ::oox::drawingml::ShapeStyleRefMap maStyleRefs; +}; + +} } } + +#endif // OOX_DRAWINGML_TABLESTYLEPART_HXX diff --git a/oox/inc/oox/drawingml/table/tablestyletextstylecontext.hxx b/oox/inc/oox/drawingml/table/tablestyletextstylecontext.hxx new file mode 100644 index 000000000000..cf66d93c8738 --- /dev/null +++ b/oox/inc/oox/drawingml/table/tablestyletextstylecontext.hxx @@ -0,0 +1,55 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TABLESTYLETEXTSTYLECONTEXT +#define OOX_DRAWINGML_TABLESTYLETEXTSTYLECONTEXT + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/table/tablestylepart.hxx" + +namespace oox { namespace drawingml { namespace table { + +class TableStyleTextStyleContext : public ::oox::core::ContextHandler +{ +public: + TableStyleTextStyleContext( ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs, + TableStylePart& rTableStylePart ); + ~TableStyleTextStyleContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + TableStylePart& mrTableStylePart; +}; + +} } } + + +#endif diff --git a/oox/inc/oox/drawingml/textbody.hxx b/oox/inc/oox/drawingml/textbody.hxx new file mode 100644 index 000000000000..a2eb6106e651 --- /dev/null +++ b/oox/inc/oox/drawingml/textbody.hxx @@ -0,0 +1,77 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTBODY_HXX +#define OOX_DRAWINGML_TEXTBODY_HXX + +#include "oox/helper/containerhelper.hxx" +#include "oox/drawingml/textbodyproperties.hxx" +#include "oox/drawingml/textliststyle.hxx" + +namespace com { namespace sun { namespace star { + namespace text { class XText; } + namespace text { class XTextCursor; } +} } } + +namespace oox { namespace core { class XmlFilterBase; } } + +namespace oox { namespace drawingml { + +class TextParagraph; +typedef RefVector< TextParagraph > TextParagraphVector; + +class TextBody +{ +public: + TextBody(); + ~TextBody(); + + inline const TextParagraphVector& getParagraphs() const { return maParagraphs; } + TextParagraph& addParagraph(); + + inline const TextListStyle& getTextListStyle() const { return maTextListStyle; } + inline TextListStyle& getTextListStyle() { return maTextListStyle; } + + inline const TextBodyProperties& getTextProperties() const { return maTextProperties; } + inline TextBodyProperties& getTextProperties() { return maTextProperties; } + + /** insert the text body at the text cursor */ + void insertAt( + const ::oox::core::XmlFilterBase& rFilterBase, + const ::com::sun::star::uno::Reference < ::com::sun::star::text::XText > & xText, + const ::com::sun::star::uno::Reference < ::com::sun::star::text::XTextCursor > & xAt, + const TextCharacterProperties& rTextStyleProperties, + const TextListStylePtr& pMasterTextListStyle ) const; +protected: + TextParagraphVector maParagraphs; + TextBodyProperties maTextProperties; + TextListStyle maTextListStyle; +}; + +} } + +#endif // OOX_DRAWINGML_TEXTBODY_HXX diff --git a/oox/inc/oox/drawingml/textbodycontext.hxx b/oox/inc/oox/drawingml/textbodycontext.hxx new file mode 100644 index 000000000000..acb12bffdac7 --- /dev/null +++ b/oox/inc/oox/drawingml/textbodycontext.hxx @@ -0,0 +1,69 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTBODYCONTEXT_HXX +#define OOX_DRAWINGML_TEXTBODYCONTEXT_HXX + +#include <com/sun/star/text/XText.hpp> + +#include "oox/drawingml/textbody.hxx" +#include "oox/drawingml/textrun.hxx" +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +class TextBodyContext : public ::oox::core::ContextHandler +{ +public: + TextBodyContext( ::oox::core::ContextHandler& rParent, TextBody& rTextBody ); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + TextBody& mrTextBody; + ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > mxText; +}; + +// CT_RegularTextRun +class RegularTextRunContext : public ::oox::core::ContextHandler +{ +public: + RegularTextRunContext( ::oox::core::ContextHandler& rParent, TextRunPtr pRunPtr ); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + TextRunPtr mpRunPtr; + bool mbIsInText; +}; + +} } + +#endif // OOX_DRAWINGML_TEXTBODYCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/textbodyproperties.hxx b/oox/inc/oox/drawingml/textbodyproperties.hxx new file mode 100644 index 000000000000..6688eea7746c --- /dev/null +++ b/oox/inc/oox/drawingml/textbodyproperties.hxx @@ -0,0 +1,56 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTBODYPROPERTIES_HXX +#define OOX_DRAWINGML_TEXTBODYPROPERTIES_HXX + +#include "oox/helper/helper.hxx" +#include "oox/helper/propertymap.hxx" + +namespace oox { +namespace drawingml { + +// ============================================================================ + +struct TextBodyProperties +{ + PropertyMap maPropertyMap; + OptValue< sal_Int32 > moRotation; + OptValue< sal_Int32 > moVert; + + explicit TextBodyProperties(); + + void pushToPropMap( PropertyMap& rPropMap ) const; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/textbodypropertiescontext.hxx b/oox/inc/oox/drawingml/textbodypropertiescontext.hxx new file mode 100644 index 000000000000..ec51d6da2b2f --- /dev/null +++ b/oox/inc/oox/drawingml/textbodypropertiescontext.hxx @@ -0,0 +1,53 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTBODYPROPERTIESCONTEXT_HXX +#define OOX_DRAWINGML_TEXTBODYPROPERTIESCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +struct TextBodyProperties; + +class TextBodyPropertiesContext : public ::oox::core::ContextHandler +{ +public: + TextBodyPropertiesContext( ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, + TextBodyProperties& rTextBodyProp ); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + TextBodyProperties& mrTextBodyProp; +}; + +} } + +#endif // OOX_DRAWINGML_TEXTBODYPROPERTIESCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/textcharacterproperties.hxx b/oox/inc/oox/drawingml/textcharacterproperties.hxx new file mode 100644 index 000000000000..81cd95dddff2 --- /dev/null +++ b/oox/inc/oox/drawingml/textcharacterproperties.hxx @@ -0,0 +1,88 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTCHARACTERPROPERTIES_HXX +#define OOX_DRAWINGML_TEXTCHARACTERPROPERTIES_HXX + +#include "oox/helper/helper.hxx" +#include "oox/helper/propertymap.hxx" +#include "oox/drawingml/color.hxx" +#include "oox/drawingml/textfont.hxx" + +namespace oox { class PropertySet; } + +namespace oox { +namespace drawingml { + +// ============================================================================ + +struct TextCharacterProperties +{ + PropertyMap maHyperlinkPropertyMap; + TextFont maLatinFont; + TextFont maAsianFont; + TextFont maComplexFont; + TextFont maSymbolFont; + Color maCharColor; + Color maUnderlineColor; + Color maHighlightColor; + OptValue< ::rtl::OUString > moLang; + OptValue< sal_Int32 > moHeight; + OptValue< sal_Int32 > moUnderline; + OptValue< sal_Int32 > moStrikeout; + OptValue< sal_Int32 > moCaseMap; + OptValue< bool > moBold; + OptValue< bool > moItalic; + OptValue< bool > moUnderlineLineFollowText; + OptValue< bool > moUnderlineFillFollowText; + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const TextCharacterProperties& rSourceProps ); + + /** Returns the current character size. If possible the masterstyle should + have been applied before, otherwise the character size can be zero and + the default value is returned. */ + float getCharHeightPoints( float fDefault ) const; + + /** Writes the properties to the passed property map. */ + void pushToPropMap( + PropertyMap& rPropMap, + const ::oox::core::XmlFilterBase& rFilter ) const; + + /** Writes the properties to the passed property set. */ + void pushToPropSet( + PropertySet& rPropSet, + const ::oox::core::XmlFilterBase& rFilter ) const; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/textcharacterpropertiescontext.hxx b/oox/inc/oox/drawingml/textcharacterpropertiescontext.hxx new file mode 100644 index 000000000000..0d45c7c19f2b --- /dev/null +++ b/oox/inc/oox/drawingml/textcharacterpropertiescontext.hxx @@ -0,0 +1,54 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTCHARACTERPROPERTIESCONTEXT_HXX +#define OOX_DRAWINGML_TEXTCHARACTERPROPERTIESCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +struct TextCharacterProperties; + +class TextCharacterPropertiesContext : public ::oox::core::ContextHandler +{ +public: + TextCharacterPropertiesContext( ::oox::core::ContextHandler& rParent, + const com::sun::star::uno::Reference< com::sun::star::xml::sax::XFastAttributeList >& rXAttributes, + TextCharacterProperties& rTextCharacterProperties ); + virtual ~TextCharacterPropertiesContext(); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + TextCharacterProperties& mrTextCharacterProperties; +}; + +} } + +#endif // OOX_DRAWINGML_TEXTCHARACTERPROPERTIESCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/textfield.hxx b/oox/inc/oox/drawingml/textfield.hxx new file mode 100644 index 000000000000..a1a0ab49c141 --- /dev/null +++ b/oox/inc/oox/drawingml/textfield.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTFIELD_HXX +#define OOX_DRAWINGML_TEXTFIELD_HXX + +#include <boost/shared_ptr.hpp> + +#include "oox/drawingml/textrun.hxx" +#include "oox/drawingml/textparagraphproperties.hxx" + +namespace oox { namespace drawingml { + +struct TextCharacterProperties; + +class TextField + : public TextRun +{ +public: + TextField(); + + inline TextParagraphProperties& getTextParagraphProperties() { return maTextParagraphProperties; } + inline const TextParagraphProperties& getTextParagraphProperties() const { return maTextParagraphProperties; } + + inline void setType( const ::rtl::OUString& sType ) { msType = sType; } + inline void setUuid( const ::rtl::OUString & sUuid ) { msUuid = sUuid; } + + virtual void insertAt( + const ::oox::core::XmlFilterBase& rFilterBase, + const ::com::sun::star::uno::Reference < ::com::sun::star::text::XText > & xText, + const ::com::sun::star::uno::Reference < ::com::sun::star::text::XTextCursor > &xAt, + const TextCharacterProperties& rTextCharacterStyle ) const; + +private: + TextParagraphProperties maTextParagraphProperties; + ::rtl::OUString msType; + ::rtl::OUString msUuid; +}; + +typedef boost::shared_ptr< TextField > TextFieldPtr; + +} } + +#endif diff --git a/oox/inc/oox/drawingml/textfieldcontext.hxx b/oox/inc/oox/drawingml/textfieldcontext.hxx new file mode 100644 index 000000000000..b81265c9e923 --- /dev/null +++ b/oox/inc/oox/drawingml/textfieldcontext.hxx @@ -0,0 +1,58 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTFIELDCONTEXT_HXX +#define OOX_DRAWINGML_TEXTFIELDCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +class TextField; + +class TextFieldContext + : public ::oox::core::ContextHandler +{ +public: + TextFieldContext( ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rXAttributes, + TextField& rTextField); + virtual void SAL_CALL endFastElement( sal_Int32 aElementToken ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( + sal_Int32 aElementToken, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rXAttributes ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + TextField& mrTextField; + bool mbIsInText; +}; + +} } + + +#endif diff --git a/oox/inc/oox/drawingml/textfont.hxx b/oox/inc/oox/drawingml/textfont.hxx new file mode 100644 index 000000000000..b8fd1d6f653b --- /dev/null +++ b/oox/inc/oox/drawingml/textfont.hxx @@ -0,0 +1,80 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGNML_TEXTFONT_HXX +#define OOX_DRAWINGNML_TEXTFONT_HXX + +#include <rtl/ustring.hxx> + +namespace oox { class AttributeList; } +namespace oox { namespace core { class XmlFilterBase; } } + +namespace oox { +namespace drawingml { + +// ============================================================================ + +/** carries a CT_TextFont*/ +class TextFont +{ +public: + explicit TextFont(); + + /** Sets attributes from the passed attribute list. */ + void setAttributes( const AttributeList& rAttribs ); + + /** Overwrites this text font with the passed text font, if it is used. */ + void assignIfUsed( const TextFont& rTextFont ); + + /** Returns the font name, pitch, and family; tries to resolve theme + placeholder names, e.g. '+mj-lt' for the major latin theme font. */ + bool getFontData( + ::rtl::OUString& rFontName, + sal_Int16 rnFontPitch, + sal_Int16& rnFontFamily, + const ::oox::core::XmlFilterBase& rFilter ) const; + +private: + bool implGetFontData( + ::rtl::OUString& rFontName, + sal_Int16 rnFontPitch, + sal_Int16& rnFontFamily ) const; + +private: + ::rtl::OUString maTypeface; + ::rtl::OUString maPanose; + sal_Int32 mnPitch; + sal_Int32 mnCharset; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/textliststyle.hxx b/oox/inc/oox/drawingml/textliststyle.hxx new file mode 100644 index 000000000000..6ba4cdf1d62a --- /dev/null +++ b/oox/inc/oox/drawingml/textliststyle.hxx @@ -0,0 +1,63 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTLISTSTYLE_HXX +#define OOX_DRAWINGML_TEXTLISTSTYLE_HXX + +#include "oox/helper/containerhelper.hxx" +#include "oox/drawingml/textparagraphproperties.hxx" + +namespace oox { namespace drawingml { + +typedef RefVector< TextParagraphProperties > TextParagraphPropertiesVector; + +class TextListStyle +{ +public: + + TextListStyle(); + ~TextListStyle(); + + void apply( const TextListStyle& rTextListStyle ); + + inline const TextParagraphPropertiesVector& getListStyle() const { return maListStyle; }; + inline TextParagraphPropertiesVector& getListStyle() { return maListStyle; }; + + inline const TextParagraphPropertiesVector& getAggregationListStyle() const { return maAggregationListStyle; }; + inline TextParagraphPropertiesVector& getAggregationListStyle() { return maAggregationListStyle; }; + +protected: + + TextParagraphPropertiesVector maListStyle; + TextParagraphPropertiesVector maAggregationListStyle; +}; + +typedef boost::shared_ptr< TextListStyle > TextListStylePtr; + +} } + +#endif // OOX_DRAWINGML_TEXTLISTSTYLE_HXX diff --git a/oox/inc/oox/drawingml/textliststylecontext.hxx b/oox/inc/oox/drawingml/textliststylecontext.hxx new file mode 100644 index 000000000000..225bb83bf67f --- /dev/null +++ b/oox/inc/oox/drawingml/textliststylecontext.hxx @@ -0,0 +1,51 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTLISTSTYLECONTEXT_HXX +#define OOX_DRAWINGML_TEXTLISTSTYLECONTEXT_HXX + +#include "oox/drawingml/textliststyle.hxx" +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +class TextListStyleContext : public ::oox::core::ContextHandler +{ +public: + TextListStyleContext( ::oox::core::ContextHandler& rParent, TextListStyle& rTextListStyle ); + ~TextListStyleContext(); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + TextListStyle& mrTextListStyle; +}; + +} } + +#endif // OOX_DRAWINGML_TEXTLISTSTYLECONTEXT_HXX diff --git a/oox/inc/oox/drawingml/textparagraph.hxx b/oox/inc/oox/drawingml/textparagraph.hxx new file mode 100644 index 000000000000..d8c97cbfa114 --- /dev/null +++ b/oox/inc/oox/drawingml/textparagraph.hxx @@ -0,0 +1,80 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTPARAGRAPH_HXX +#define OOX_DRAWINGML_TEXTPARAGRAPH_HXX + +#include <com/sun/star/text/XTextCursor.hpp> +#include <com/sun/star/text/XText.hpp> + +#include "oox/helper/containerhelper.hxx" +#include "oox/core/xmlfilterbase.hxx" +#include "oox/drawingml/textrun.hxx" +#include "oox/drawingml/textliststyle.hxx" +#include "oox/drawingml/textparagraphproperties.hxx" + +namespace oox { namespace drawingml { + +typedef RefVector< TextRun > TextRunVector; + +class TextParagraph +{ +public: + TextParagraph(); + ~TextParagraph(); + + inline TextRunVector& getRuns() { return maRuns; } + inline const TextRunVector& getRuns() const { return maRuns; } + inline void addRun( const TextRunPtr & pRun ) { maRuns.push_back( pRun ); } + + inline TextParagraphProperties& getProperties() { return maProperties; } + inline const TextParagraphProperties& getProperties() const { return maProperties; } + + inline TextCharacterProperties& getEndProperties() { return maEndProperties; } + inline const TextCharacterProperties& getEndProperties() const { return maEndProperties; } + + //inline void setProperties( TextParagraphPropertiesPtr pProps ) { mpProperties = pProps; } + + void insertAt( + const ::oox::core::XmlFilterBase& rFilterBase, + const ::com::sun::star::uno::Reference < ::com::sun::star::text::XText > & xText, + const ::com::sun::star::uno::Reference < ::com::sun::star::text::XTextCursor > &xAt, + const TextCharacterProperties& rTextStyleProperties, + const TextListStyle& rTextListStyle, + bool bFirst = false ) const; + +private: + TextParagraphProperties maProperties; + TextCharacterProperties maEndProperties; + TextRunVector maRuns; +}; + +typedef boost::shared_ptr< TextParagraph > TextParagraphPtr; + +} } + +#endif // OOX_DRAWINGML_TEXTPARAGRAPH_HXX diff --git a/oox/inc/oox/drawingml/textparagraphproperties.hxx b/oox/inc/oox/drawingml/textparagraphproperties.hxx new file mode 100644 index 000000000000..ef80af2d1c11 --- /dev/null +++ b/oox/inc/oox/drawingml/textparagraphproperties.hxx @@ -0,0 +1,129 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTPARAGRAPHPROPERTIES_HXX +#define OOX_DRAWINGML_TEXTPARAGRAPHPROPERTIES_HXX + +#include <com/sun/star/beans/XPropertySet.hpp> +#include "oox/drawingml/fillpropertiesgroupcontext.hxx" +#include "oox/drawingml/textcharacterproperties.hxx" +#include <com/sun/star/style/NumberingType.hpp> +#include "oox/drawingml/textfont.hxx" +#include "textspacing.hxx" +#include <boost/optional.hpp> + +namespace com { namespace sun { namespace star { + namespace graphic { class XGraphic; } +} } } + +namespace oox { namespace drawingml { + +class TextParagraphProperties; + +typedef boost::shared_ptr< TextParagraphProperties > TextParagraphPropertiesPtr; + +class BulletList +{ +public: + BulletList( ); + bool is() const; + void apply( const BulletList& ); + void pushToPropMap( const ::oox::core::XmlFilterBase& rFilterBase, PropertyMap& rPropMap ) const; + void setBulletChar( const ::rtl::OUString & sChar ); + void setStartAt( sal_Int32 nStartAt ){ mnStartAt <<= static_cast< sal_Int16 >( nStartAt ); } + void setType( sal_Int32 nType ); + void setNone( ); + void setSuffixParenBoth(); + void setSuffixParenRight(); + void setSuffixPeriod(); + void setSuffixNone(); + void setSuffixMinusRight(); + void setBulletSize(sal_Int16 nSize); + void setFontSize(sal_Int16 nSize); + void setStyleName( const rtl::OUString& rStyleName ) { maStyleName <<= rStyleName; } + void setGraphic( ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >& rXGraphic ); + + ::oox::drawingml::ColorPtr maBulletColorPtr; + ::com::sun::star::uno::Any mbBulletColorFollowText; + ::com::sun::star::uno::Any mbBulletFontFollowText; + ::oox::drawingml::TextFont maBulletFont; + ::com::sun::star::uno::Any msBulletChar; + ::com::sun::star::uno::Any mnStartAt; + ::com::sun::star::uno::Any mnNumberingType; + ::com::sun::star::uno::Any msNumberingPrefix; + ::com::sun::star::uno::Any msNumberingSuffix; + ::com::sun::star::uno::Any mnSize; + ::com::sun::star::uno::Any mnFontSize; + ::com::sun::star::uno::Any maStyleName; + ::com::sun::star::uno::Any maGraphic; + boost::optional< float > maFollowFontSize; +}; + +class TextParagraphProperties +{ +public: + + TextParagraphProperties(); + ~TextParagraphProperties(); + + void setLevel( sal_Int16 nLevel ) { mnLevel = nLevel; } + sal_Int16 getLevel( ) const { return mnLevel; } + PropertyMap& getTextParagraphPropertyMap() { return maTextParagraphPropertyMap; } + BulletList& getBulletList() { return maBulletList; } + TextCharacterProperties& getTextCharacterProperties() { return maTextCharacterProperties; } + const TextCharacterProperties& getTextCharacterProperties() const { return maTextCharacterProperties; } + + TextSpacing& getParaTopMargin() { return maParaTopMargin; } + TextSpacing& getParaBottomMargin() { return maParaBottomMargin; } + boost::optional< sal_Int32 >& getParaLeftMargin(){ return moParaLeftMargin; } + boost::optional< sal_Int32 >& getFirstLineIndentation(){ return moFirstLineIndentation; } + + void apply( const TextParagraphProperties& rSourceProps ); + void pushToPropSet( const ::oox::core::XmlFilterBase& rFilterBase, + const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > & xPropSet, + PropertyMap& rioBulletList, const BulletList* pMasterBuList, sal_Bool bApplyBulletList, float fFontSize ) const; + + /** Returns the largest character size of this paragraph. If possible the + masterstyle should have been applied before, otherwise the character + size can be zero and the default value is returned. */ + float getCharHeightPoints( float fDefault ) const; + +protected: + + TextCharacterProperties maTextCharacterProperties; + PropertyMap maTextParagraphPropertyMap; + BulletList maBulletList; + TextSpacing maParaTopMargin; + TextSpacing maParaBottomMargin; + boost::optional< sal_Int32 > moParaLeftMargin; + boost::optional< sal_Int32 > moFirstLineIndentation; + sal_Int16 mnLevel; +}; + +} } + +#endif // OOX_DRAWINGML_TEXTPARAGRAPHPROPERTIES_HXX diff --git a/oox/inc/oox/drawingml/textparagraphpropertiescontext.hxx b/oox/inc/oox/drawingml/textparagraphpropertiescontext.hxx new file mode 100644 index 000000000000..de369c622e69 --- /dev/null +++ b/oox/inc/oox/drawingml/textparagraphpropertiescontext.hxx @@ -0,0 +1,64 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTPARAGRAPHPROPERTIESCONTEXT_HXX +#define OOX_DRAWINGML_TEXTPARAGRAPHPROPERTIESCONTEXT_HXX + +#include <list> + +#include <com/sun/star/style/TabStop.hpp> +#include "oox/drawingml/drawingmltypes.hxx" +#include "oox/drawingml/textparagraphproperties.hxx" +#include "oox/drawingml/textspacing.hxx" +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +class TextParagraphPropertiesContext : public ::oox::core::ContextHandler +{ +public: + TextParagraphPropertiesContext( ::oox::core::ContextHandler& rParent, + const com::sun::star::uno::Reference< com::sun::star::xml::sax::XFastAttributeList >& rXAttributes, + TextParagraphProperties& rTextParagraphProperties ); + ~TextParagraphPropertiesContext(); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + TextParagraphProperties& mrTextParagraphProperties; + TextSpacing maLineSpacing; + TextSpacing& mrSpaceBefore; + TextSpacing& mrSpaceAfter; + BulletList& mrBulletList; + ::std::list< ::com::sun::star::style::TabStop > maTabList; + ::boost::shared_ptr< BlipFillProperties > mxBlipProps; +}; + +} } + +#endif // OOX_DRAWINGML_TEXTPARAGRAPHPROPERTIESCONTEXT_HXX diff --git a/oox/inc/oox/drawingml/textrun.hxx b/oox/inc/oox/drawingml/textrun.hxx new file mode 100644 index 000000000000..2704b8e92621 --- /dev/null +++ b/oox/inc/oox/drawingml/textrun.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TEXTRUN_HXX +#define OOX_DRAWINGML_TEXTRUN_HXX + +#include <com/sun/star/text/XTextCursor.hpp> +#include <com/sun/star/text/XText.hpp> +#include <com/sun/star/frame/XModel.hpp> +#include "oox/drawingml/textcharacterproperties.hxx" + +namespace oox { namespace drawingml { + +class TextRun +{ +public: + TextRun(); + virtual ~TextRun(); + + inline ::rtl::OUString& getText() { return msText; } + inline const ::rtl::OUString& getText() const { return msText; } + + inline TextCharacterProperties& getTextCharacterProperties() { return maTextCharacterProperties; } + inline const TextCharacterProperties& getTextCharacterProperties() const { return maTextCharacterProperties; } + + inline void setLineBreak() { mbIsLineBreak = true; } + + virtual void insertAt( + const ::oox::core::XmlFilterBase& rFilterBase, + const ::com::sun::star::uno::Reference < ::com::sun::star::text::XText >& xText, + const ::com::sun::star::uno::Reference < ::com::sun::star::text::XTextCursor >& xAt, + const TextCharacterProperties& rTextCharacterStyle ) const; + +private: + ::rtl::OUString msText; + TextCharacterProperties maTextCharacterProperties; + bool mbIsLineBreak; +}; + +typedef boost::shared_ptr< TextRun > TextRunPtr; + +} } + +#endif // OOX_DRAWINGML_TEXTRUN_HXX diff --git a/oox/inc/oox/drawingml/textspacing.hxx b/oox/inc/oox/drawingml/textspacing.hxx new file mode 100644 index 000000000000..80c172c125ee --- /dev/null +++ b/oox/inc/oox/drawingml/textspacing.hxx @@ -0,0 +1,81 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGNML__TEXTSPACING_HXX +#define OOX_DRAWINGNML__TEXTSPACING_HXX + +#include <rtl/ustring.hxx> + +#include <com/sun/star/style/LineSpacing.hpp> +#include <com/sun/star/style/LineSpacingMode.hpp> + +namespace oox { namespace drawingml { + + + /** carries a CT_TextSpacing */ + class TextSpacing + { + public: + enum { + POINTS = 0, + PERCENT + }; + TextSpacing() + : nUnit( POINTS ), nValue( 0 ), bHasValue( sal_False ) + { + } + TextSpacing( sal_Int32 nPoints ) : nUnit( POINTS ), nValue( nPoints ), bHasValue( sal_True ){}; + ::com::sun::star::style::LineSpacing toLineSpacing() const + { + ::com::sun::star::style::LineSpacing aSpacing; + aSpacing.Mode = ( nUnit == PERCENT + ? ::com::sun::star::style::LineSpacingMode::PROP + : ::com::sun::star::style::LineSpacingMode::MINIMUM ); + aSpacing.Height = static_cast< sal_Int16 >( nUnit == PERCENT ? nValue / 1000 : nValue ); + return aSpacing; + } + sal_Int32 toMargin( float fFontSize ) const + { + if ( nUnit == PERCENT ) + { + double fMargin = ( fFontSize * 2540 + 36 ) / 72; + fMargin *= nValue; + fMargin /= 100000; + return static_cast< sal_Int32 >( fMargin ); + } + else + return nValue; + } + sal_Int32 nUnit; + sal_Int32 nValue; + sal_Bool bHasValue; + }; + +} } + +#endif + diff --git a/oox/inc/oox/drawingml/theme.hxx b/oox/inc/oox/drawingml/theme.hxx new file mode 100644 index 000000000000..15f5ce82ce12 --- /dev/null +++ b/oox/inc/oox/drawingml/theme.hxx @@ -0,0 +1,116 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_THEME_HXX +#define OOX_DRAWINGML_THEME_HXX + +#include "oox/helper/containerhelper.hxx" +#include "oox/drawingml/clrscheme.hxx" +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/textfont.hxx" + +namespace oox { +namespace drawingml { + +// ============================================================================ + +const sal_Int32 THEMED_STYLE_SUBTLE = 1; +const sal_Int32 THEMED_STYLE_MODERATE = 2; +const sal_Int32 THEMED_STYLE_INTENSE = 3; + +typedef RefVector< FillProperties > FillStyleList; +typedef RefVector< LineProperties > LineStyleList; +typedef RefVector< PropertyMap > EffectStyleList; +typedef RefMap< sal_Int32, TextCharacterProperties > FontScheme; + +// ============================================================================ + +class Theme +{ +public: + explicit Theme(); + ~Theme(); + + inline void setStyleName( const ::rtl::OUString& rStyleName ) { maStyleName = rStyleName; } + inline const ::rtl::OUString& getStyleName() const { return maStyleName; } + + inline ClrScheme& getClrScheme() { return maClrScheme; } + inline const ClrScheme& getClrScheme() const { return maClrScheme; } + + inline FillStyleList& getFillStyleList() { return maFillStyleList; } + inline const FillStyleList& getFillStyleList() const { return maFillStyleList; } + inline FillStyleList& getBgFillStyleList() { return maBgFillStyleList; } + inline const FillStyleList& getBgFillStyleList() const { return maBgFillStyleList; } + /** Returns the fill properties of the passed one-based themed style index. */ + const FillProperties* getFillStyle( sal_Int32 nIndex ) const; + + inline LineStyleList& getLineStyleList() { return maLineStyleList; } + inline const LineStyleList& getLineStyleList() const { return maLineStyleList; } + /** Returns the line properties of the passed one-based themed style index. */ + const LineProperties* getLineStyle( sal_Int32 nIndex ) const; + + inline EffectStyleList& getEffectStyleList() { return maEffectStyleList; } + inline const EffectStyleList& getEffectStyleList() const { return maEffectStyleList; } + /** Returns the effect properties of the passed one-based themed style index. */ + const PropertyMap* getEffectStyle( sal_Int32 nIndex ) const; + + inline FontScheme& getFontScheme() { return maFontScheme; } + inline const FontScheme& getFontScheme() const { return maFontScheme; } + /** Returns theme font properties by scheme type (major/minor). */ + const TextCharacterProperties* getFontStyle( sal_Int32 nSchemeType ) const; + /** Returns theme font by placeholder name, e.g. the major latin theme font for the font name '+mj-lt'. */ + const TextFont* resolveFont( const ::rtl::OUString& rName ) const; + + inline Shape& getSpDef() { return maSpDef; } + inline const Shape& getSpDef() const { return maSpDef; } + + inline Shape& getLnDef() { return maLnDef; } + inline const Shape& getLnDef() const { return maLnDef; } + + inline Shape& getTxDef() { return maTxDef; } + inline const Shape& getTxDef() const { return maTxDef; } + +private: + ::rtl::OUString maStyleName; + ClrScheme maClrScheme; + FillStyleList maFillStyleList; + FillStyleList maBgFillStyleList; + LineStyleList maLineStyleList; + EffectStyleList maEffectStyleList; + FontScheme maFontScheme; + Shape maSpDef; + Shape maLnDef; + Shape maTxDef; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/themeelementscontext.hxx b/oox/inc/oox/drawingml/themeelementscontext.hxx new file mode 100644 index 000000000000..1dfc76b6957d --- /dev/null +++ b/oox/inc/oox/drawingml/themeelementscontext.hxx @@ -0,0 +1,58 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_THEMEELEMENTSCONTEXT_HXX +#define OOX_DRAWINGML_THEMEELEMENTSCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { +namespace drawingml { + +class Theme; + +// ============================================================================ + +class ThemeElementsContext : public oox::core::ContextHandler +{ +public: + ThemeElementsContext( ::oox::core::ContextHandler& rParent, Theme& rTheme ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 nElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + Theme& mrTheme; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/themefragmenthandler.hxx b/oox/inc/oox/drawingml/themefragmenthandler.hxx new file mode 100644 index 000000000000..aeaaa5378bd8 --- /dev/null +++ b/oox/inc/oox/drawingml/themefragmenthandler.hxx @@ -0,0 +1,61 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_THEMEFRAGMENTHANDLER_HXX +#define OOX_DRAWINGML_THEMEFRAGMENTHANDLER_HXX + +#include "oox/core/fragmenthandler2.hxx" + +namespace oox { +namespace drawingml { + +class Theme; + +// ============================================================================ + +class ThemeFragmentHandler : public ::oox::core::FragmentHandler2 +{ +public: + explicit ThemeFragmentHandler( + ::oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + Theme& rTheme ); + virtual ~ThemeFragmentHandler(); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + Theme& mrTheme; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/transform2dcontext.hxx b/oox/inc/oox/drawingml/transform2dcontext.hxx new file mode 100644 index 000000000000..022f1dbe47c2 --- /dev/null +++ b/oox/inc/oox/drawingml/transform2dcontext.hxx @@ -0,0 +1,58 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_TRANSFORM2DCONTEXT_HXX +#define OOX_DRAWINGML_TRANSFORM2DCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" + +namespace oox { +namespace drawingml { + +// ============================================================================ + +class Shape; + +/** context to import a CT_Transform2D */ +class Transform2DContext : public ::oox::core::ContextHandler +{ +public: + Transform2DContext( ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, Shape& rShape ) throw(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + Shape& mrShape; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/dump/biffdumper.hxx b/oox/inc/oox/dump/biffdumper.hxx new file mode 100644 index 000000000000..5a7e390d19a4 --- /dev/null +++ b/oox/inc/oox/dump/biffdumper.hxx @@ -0,0 +1,539 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DUMP_BIFFDUMPER_HXX +#define OOX_DUMP_BIFFDUMPER_HXX + +#include "oox/dump/dumperbase.hxx" +#include "oox/dump/dffdumper.hxx" +#include "oox/dump/oledumper.hxx" +#include "oox/xls/richstring.hxx" + +#if OOX_INCLUDE_DUMPER + +namespace oox { namespace xls { + class BiffInputStream; + class FontPortionModelList; + struct FunctionInfo; + class FunctionProvider; +} } + +namespace oox { +namespace dump { +namespace biff { + +typedef ::boost::shared_ptr< ::oox::xls::BiffInputStream > BiffInputStreamRef; + +// ============================================================================ +// ============================================================================ + +class BiffDffStreamObject : public DffStreamObject +{ +public: + explicit BiffDffStreamObject( + const OutputObjectBase& rParent, + const BinaryInputStreamRef& rxStrm ); + +protected: + virtual void implDumpClientAnchor(); +}; + +// ============================================================================ + +class BiffCtlsStreamObject : public InputObjectBase +{ +public: + explicit BiffCtlsStreamObject( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxStrm ); + + void dumpControl( sal_uInt32 nStartPos, sal_uInt32 nLength ); + +protected: + virtual void implDump(); + +private: + sal_uInt32 mnStartPos; + sal_uInt32 mnLength; +}; + +// ============================================================================ +// ============================================================================ + +class BiffConfig : public Config +{ +public: + explicit BiffConfig( const Config& rParent, ::oox::xls::BiffType eBiff ); + +protected: + virtual bool implIsValid() const; + virtual NameListRef implGetNameList( const ::rtl::OUString& rKey ) const; + +private: + ::oox::xls::BiffType meBiff; +}; + +// ============================================================================ + +class BiffSharedData : public Base +{ +public: + explicit BiffSharedData( ::oox::xls::BiffType eBiff ); + + void initializePerSheet(); + + inline ::oox::xls::BiffType getBiff() const { return meBiff; } + + inline rtl_TextEncoding getTextEncoding() const { return meTextEnc; } + void setTextEncoding( rtl_TextEncoding eTextEnc ); + + sal_uInt16 getFontCount() const; + rtl_TextEncoding getFontEncoding( sal_uInt16 nFontId ) const; + void appendFontEncoding( rtl_TextEncoding eFontEnc ); + + sal_uInt16 getXfCount() const; + rtl_TextEncoding getXfEncoding( sal_uInt16 nXfId ) const; + void appendXfFontId( sal_uInt16 nFontId ); + +protected: + virtual bool implIsValid() const; + +private: + typedef ::std::vector< rtl_TextEncoding > TextEncVec; + typedef ::std::vector< sal_uInt16 > FontIdVec; + + TextEncVec maFontEncs; + FontIdVec maXfFontIds; + ::oox::xls::BiffType meBiff; + rtl_TextEncoding meTextEnc; +}; + +// ============================================================================ + +class BiffObjectBase : public RecordObjectBase +{ +public: + inline BiffSharedData& getBiffData() const { return *mxBiffData; } + inline ::oox::xls::BiffInputStream& getBiffStream() const { return *mxBiffStrm; } + inline ::oox::xls::BiffType getBiff() const { return mxBiffData->getBiff(); } + +protected: + inline explicit BiffObjectBase() {} + virtual ~BiffObjectBase(); + + using InputObjectBase::construct; + void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, ::oox::xls::BiffType eBiff, const ::rtl::OUString& rSysFileName ); + void construct( const BiffObjectBase& rParent ); + + virtual bool implIsValid() const; + virtual bool implStartRecord( BinaryInputStream& rBaseStrm, sal_Int64& ornRecPos, sal_Int64& ornRecId, sal_Int64& ornRecSize ); + + inline sal_uInt16 getLastRecId() const { return mnLastRecId; } + ::rtl::OUString getErrorName( sal_uInt8 nErrCode ) const; + + // ------------------------------------------------------------------------ + + sal_Int32 readCol( bool bCol16Bit ); + sal_Int32 readRow( bool bRow32Bit ); + void readAddress( Address& orAddress, bool bCol16Bit = true, bool bRow32Bit = false ); + void readRange( Range& orRange, bool bCol16Bit = true, bool bRow32Bit = false ); + void readRangeList( RangeList& orRanges, bool bCol16Bit = true, bool bRow32Bit = false ); + + // ------------------------------------------------------------------------ + + void writeBooleanItem( const String& rName, sal_uInt8 nBool ); + void writeErrorCodeItem( const String& rName, sal_uInt8 nErrCode ); + + void writeFontPortions( const ::oox::xls::FontPortionModelList& rPortions ); + + template< typename Type > + void writeRectItem( const String& rName, + Type nLeft, Type nTop, Type nWidth, Type nHeight, + const NameListWrapper& rListWrp = NO_LIST, + FormatType eFmtType = FORMATTYPE_DEC ); + + // ------------------------------------------------------------------------ + + ::rtl::OUString dumpByteString( + const String& rName, + ::oox::xls::BiffStringFlags nFlags = ::oox::xls::BIFF_STR_DEFAULT, + rtl_TextEncoding eDefaultTextEnc = RTL_TEXTENCODING_DONTKNOW ); + ::rtl::OUString dumpUniString( + const String& rName, + ::oox::xls::BiffStringFlags nFlags = ::oox::xls::BIFF_STR_DEFAULT ); + ::rtl::OUString dumpString( + const String& rName, + ::oox::xls::BiffStringFlags nByteFlags = ::oox::xls::BIFF_STR_DEFAULT, + ::oox::xls::BiffStringFlags nUniFlags = ::oox::xls::BIFF_STR_DEFAULT, + rtl_TextEncoding eDefaultTextEnc = RTL_TEXTENCODING_DONTKNOW ); + + sal_uInt8 dumpBoolean( const String& rName = EMPTY_STRING ); + sal_uInt8 dumpErrorCode( const String& rName = EMPTY_STRING ); + + rtl_TextEncoding dumpCodePage( const String& rName = EMPTY_STRING ); + void dumpFormulaResult( const String& rName = EMPTY_STRING ); + + sal_Int32 dumpColIndex( const String& rName = EMPTY_STRING, bool bCol16Bit = true ); + sal_Int32 dumpRowIndex( const String& rName = EMPTY_STRING, bool bRow32Bit = false ); + sal_Int32 dumpColRange( const String& rName = EMPTY_STRING, bool bCol16Bit = true ); + sal_Int32 dumpRowRange( const String& rName = EMPTY_STRING, bool bRow32Bit = false ); + + Address dumpAddress( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); + Range dumpRange( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); + void dumpRangeList( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); + + void dumpConstArrayHeader( sal_uInt32& rnCols, sal_uInt32& rnRows ); + ::rtl::OUString dumpConstValue( sal_Unicode cStrQuote = OOX_DUMP_STRQUOTE ); + + template< typename Type > + void dumpRect( const String& rName, + const NameListWrapper& rListWrp = NO_LIST, + FormatType eFmtType = FORMATTYPE_DEC ); + + sal_uInt16 dumpRepeatedRecId(); + void dumpFrHeader( bool bWithFlags, bool bWithRange ); + + void dumpDffClientRect(); + void dumpEmbeddedDff(); + void dumpOcxControl(); + +private: + typedef ::boost::shared_ptr< BiffSharedData > BiffSharedDataRef; + typedef ::boost::shared_ptr< BiffDffStreamObject > BiffDffStreamObjRef; + typedef ::boost::shared_ptr< BiffCtlsStreamObject > BiffCtlsStrmObjRef; + + BiffSharedDataRef mxBiffData; + BiffInputStreamRef mxBiffStrm; + BiffDffStreamObjRef mxDffObj; + BiffCtlsStrmObjRef mxCtlsObj; + NameListRef mxErrCodes; + NameListRef mxConstType; + NameListRef mxResultType; + sal_uInt16 mnLastRecId; + bool mbMergeContRec; +}; + +// ---------------------------------------------------------------------------- + +template< typename Type > +void BiffObjectBase::writeRectItem( const String& rName, + Type nLeft, Type nTop, Type nWidth, Type nHeight, + const NameListWrapper& rListWrp, FormatType eFmtType ) +{ + MultiItemsGuard aMultiGuard( out() ); + writeEmptyItem( rName ); + writeValueItem( "x-pos", nLeft, eFmtType, rListWrp ); + writeValueItem( "y-pos", nTop, eFmtType, rListWrp ); + writeValueItem( "x-size", nWidth, eFmtType, rListWrp ); + writeValueItem( "y-size", nHeight, eFmtType, rListWrp ); +} + +template< typename Type > +void BiffObjectBase::dumpRect( const String& rName, + const NameListWrapper& rListWrp, FormatType eFmtType ) +{ + Type nLeft, nTop, nWidth, nHeight; + *mxBiffStrm >> nLeft >> nTop >> nWidth >> nHeight; + writeRectItem( rName, nLeft, nTop, nWidth, nHeight, rListWrp, eFmtType ); +} + +// ============================================================================ +// ============================================================================ + +class FormulaObject : public BiffObjectBase +{ +public: + explicit FormulaObject( const BiffObjectBase& rParent ); + virtual ~FormulaObject(); + + sal_uInt16 readFormulaSize(); + sal_uInt16 dumpFormulaSize( const String& rName = EMPTY_STRING ); + + void dumpCellFormula( const String& rName, sal_uInt16 nSize ); + void dumpCellFormula( const String& rName = EMPTY_STRING ); + void dumpNameFormula( const String& rName, sal_uInt16 nSize ); + void dumpNameFormula( const String& rName = EMPTY_STRING ); + +protected: + virtual void implDump(); + +private: + void constructFmlaObj(); + + void dumpFormula( const String& rName, sal_uInt16 nSize, bool bNameMode ); + void dumpFormula( const String& rName, bool bNameMode ); + + TokenAddress createTokenAddress( sal_uInt16 nCol, sal_uInt16 nRow, bool bRelC, bool bRelR, bool bNameMode ) const; + ::rtl::OUString createRef( const ::rtl::OUString& rData ) const; + ::rtl::OUString createName( sal_uInt16 nNameIdx ) const; + ::rtl::OUString createPlaceHolder( size_t nIdx ) const; + ::rtl::OUString createPlaceHolder() const; + + sal_uInt16 readFuncId(); + ::rtl::OUString writeFuncIdItem( sal_uInt16 nFuncId, const ::oox::xls::FunctionInfo** oppFuncInfo = 0 ); + + sal_uInt16 dumpTokenCol( const String& rName, bool& rbRelC, bool& rbRelR ); + sal_uInt16 dumpTokenRow( const String& rName, bool& rbRelC, bool& rbRelR ); + TokenAddress dumpTokenAddress( bool bNameMode ); + TokenRange dumpTokenRange( bool bNameMode ); + + sal_Int16 readTokenRefIdx(); + ::rtl::OUString dumpTokenRefIdx(); + ::rtl::OUString dumpTokenRefTabIdxs(); + + void dumpIntToken(); + void dumpDoubleToken(); + void dumpStringToken(); + void dumpBoolToken(); + void dumpErrorToken(); + void dumpMissArgToken(); + + void dumpArrayToken( const ::rtl::OUString& rTokClass ); + void dumpNameToken( const ::rtl::OUString& rTokClass ); + void dumpNameXToken( const ::rtl::OUString& rTokClass ); + void dumpRefToken( const ::rtl::OUString& rTokClass, bool bNameMode ); + void dumpAreaToken( const ::rtl::OUString& rTokClass, bool bNameMode ); + void dumpRefErrToken( const ::rtl::OUString& rTokClass, bool bArea ); + void dumpRef3dToken( const ::rtl::OUString& rTokClass, bool bNameMode ); + void dumpArea3dToken( const ::rtl::OUString& rTokClass, bool bNameMode ); + void dumpRefErr3dToken( const ::rtl::OUString& rTokClass, bool bArea ); + void dumpMemFuncToken( const ::rtl::OUString& rTokClass ); + void dumpMemAreaToken( const ::rtl::OUString& rTokClass, bool bAddData ); + + void dumpExpToken( const String& rName ); + void dumpUnaryOpToken( const String& rLOp, const String& rROp ); + void dumpBinaryOpToken( const String& rOp ); + void dumpFuncToken( const ::rtl::OUString& rTokClass ); + void dumpFuncVarToken( const ::rtl::OUString& rTokClass ); + void dumpCmdToken( const ::rtl::OUString& rTokClass ); + + void dumpSheetToken(); + void dumpEndSheetToken(); + bool dumpAttrToken(); + + bool dumpNlrToken(); + void dumpNlrErrToken(); + void dumpNlrColRowToken( const ::rtl::OUString& rTokClass, bool bAddData ); + void dumpNlrRangeToken( const ::rtl::OUString& rTokClass, bool bAddData ); + void dumpNlrRangeErrToken(); + + void dumpAddTokenData(); + void dumpAddDataNlr( size_t nIdx ); + void dumpAddDataArray( size_t nIdx ); + void dumpAddDataMemArea( size_t nIdx ); + +private: + enum AddDataType { ADDDATA_NLR, ADDDATA_ARRAY, ADDDATA_MEMAREA }; + + typedef ::boost::shared_ptr< FormulaStack > FormulaStackRef; + typedef ::boost::shared_ptr< ::oox::xls::FunctionProvider > FuncProvRef; + typedef ::std::vector< AddDataType > AddDataTypeVec; + + NameListRef mxTokens; + NameListRef mxClasses; + NameListRef mxRelFlags; + NameListRef mxNlrTypes; + NameListRef mxAttrTypes; + NameListRef mxSpTypes; + sal_Int32 mnColCount; + sal_Int32 mnRowCount; + + FormulaStackRef mxStack; + FuncProvRef mxFuncProv; + AddDataTypeVec maAddData; + ::rtl::OUString maRefPrefix; + ::rtl::OUString maName; + sal_uInt16 mnSize; + bool mbNameMode; +}; + +// ============================================================================ +// ============================================================================ + +class RecordStreamObject : public BiffObjectBase +{ +protected: + inline explicit RecordStreamObject() {} + virtual ~RecordStreamObject(); + + using BiffObjectBase::construct; + void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, ::oox::xls::BiffType eBiff, const ::rtl::OUString& rSysFileName ); + + virtual bool implIsValid() const; + + inline FormulaObject& getFormulaDumper() const { return *mxFmlaObj; } + +private: + typedef ::boost::shared_ptr< FormulaObject > FormulaObjectRef; + FormulaObjectRef mxFmlaObj; +}; + +// ============================================================================ + +class WorkbookStreamObject : public RecordStreamObject +{ +public: + explicit WorkbookStreamObject( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); + virtual ~WorkbookStreamObject(); + +protected: + virtual void implDumpRecordBody(); + +private: + void initializePerSheet(); + + ::rtl::OUString createFontName( const ::rtl::OUString& rName, sal_uInt16 nHeight, bool bBold, bool bItalic ) const; + + sal_uInt16 dumpPatternIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); + sal_uInt16 dumpColorIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); + sal_uInt16 dumpFontIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); + sal_uInt16 dumpFormatIdx( const String& rName = EMPTY_STRING ); + sal_uInt16 dumpXfIdx( const String& rName = EMPTY_STRING, bool bBiff2Style = false ); + + template< typename Type > + inline Type dumpExtColorType() { return dumpDec< Type >( "color-type", "EXTCOLOR-TYPE" ); } + void dumpExtColorValue( sal_uInt32 nColorType ); + void dumpExtColor( const String& rName = EMPTY_STRING ); + void dumpExtCfColor( const String& rName = EMPTY_STRING ); + void dumpExtGradientHead(); + + ::rtl::OUString dumpPivotString( const String& rName, sal_uInt16 nStrLen ); + ::rtl::OUString dumpPivotString( const String& rName ); + + sal_uInt16 dumpCellHeader( bool bBiff2Style = false ); + void dumpBoolErr(); + + void dumpCfRuleProp(); + void dumpXfExtProp(); + void dumpDxfProp(); + void dumpDxf12Prop(); + void dumpCfRule12Param( sal_uInt16 nSubType ); + + void dumpFontRec(); + void dumpFormatRec(); + void dumpXfRec(); + + void dumpObjRec(); + void dumpObjRecBiff3(); + void dumpObjRecBiff4(); + void dumpObjRecBiff5(); + void dumpObjRecBiff8(); + + void dumpObjRecLineData(); + void dumpObjRecFillData(); + void dumpObjRecRectData(); + void dumpObjRecTextDataBiff3( sal_uInt16& ornTextLen, sal_uInt16& ornFormatSize ); + void dumpObjRecTextDataBiff5( sal_uInt16& ornTextLen, sal_uInt16& ornFormatSize, sal_uInt16& ornLinkSize ); + void dumpObjRecSbsData(); + void dumpObjRecGboData(); + void dumpObjRecEdoData(); + void dumpObjRecRboData(); + void dumpObjRecCblsData(); + void dumpObjRecLbsData(); + + void dumpObjRecPadding(); + void dumpObjRecString( const String& rName, sal_uInt16 nTextLen, bool bRepeatLen ); + void dumpObjRecTextFmt( sal_uInt16 nFormatSize ); + void dumpObjRecFmlaRaw(); + void dumpObjRecFmla( const String& rName, sal_uInt16 nFmlaSize ); + void dumpObjRecPictFmla( sal_uInt16 nFmlaSize ); + +private: + NameListRef mxColors; + NameListRef mxBorderStyles; + NameListRef mxFillPatterns; + NameListRef mxFontNames; + NameListRef mxFormats; + sal_uInt16 mnFormatIdx; + sal_uInt16 mnPTRowFields; + sal_uInt16 mnPTColFields; + sal_uInt16 mnPTRowColItemsIdx; + bool mbHasCodePage; + bool mbHasDff; +}; + +// ============================================================================ + +class PivotCacheStreamObject : public RecordStreamObject +{ +public: + explicit PivotCacheStreamObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + ::oox::xls::BiffType eBiff, + const ::rtl::OUString& rSysFileName ); + +protected: + virtual void implDumpRecordBody(); +}; + +// ============================================================================ +// ============================================================================ + +class RootStorageObject : public OleStorageObject +{ +public: + explicit RootStorageObject( const DumperBase& rParent ); + +protected: + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); + + virtual void implDumpStorage( + const StorageRef& rxStrg, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rSysPath ); +}; + +// ============================================================================ +// ============================================================================ + +class Dumper : public DumperBase +{ +public: + explicit Dumper( const ::oox::core::FilterBase& rFilter ); + + explicit Dumper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm, + const ::rtl::OUString& rSysFileName ); + +protected: + virtual void implDump(); +}; + +// ============================================================================ +// ============================================================================ + +} // namespace biff +} // namespace dump +} // namespace oox + +#endif +#endif + diff --git a/oox/inc/oox/dump/dffdumper.hxx b/oox/inc/oox/dump/dffdumper.hxx new file mode 100644 index 000000000000..f229c19eff8c --- /dev/null +++ b/oox/inc/oox/dump/dffdumper.hxx @@ -0,0 +1,82 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DUMP_DFFDUMPER_HXX +#define OOX_DUMP_DFFDUMPER_HXX + +#include "oox/dump/dumperbase.hxx" + +#if OOX_INCLUDE_DUMPER + +namespace oox { +namespace dump { + +// ============================================================================ + +class DffStreamObject : public SequenceRecordObjectBase +{ +public: + inline sal_uInt16 getVer() const { return mnInstVer & 0x000F; } + inline sal_uInt16 getInst() const { return (mnInstVer & 0xFFF0) >> 4; } + inline bool isContainer() const { return getVer() == 15; } + +protected: + inline explicit DffStreamObject() {} + + using SequenceRecordObjectBase::construct; + void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); + void construct( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxStrm ); + + virtual bool implReadRecordHeader( BinaryInputStream& rBaseStrm, sal_Int64& ornRecId, sal_Int64& ornRecSize ); + virtual void implWriteExtHeader(); + virtual void implDumpRecordBody(); + virtual void implDumpClientAnchor(); + +private: + void constructDffObj(); + + sal_uInt32 dumpDffSimpleColor( const String& rName ); + sal_uInt32 dumpDffColor( const String& rName ); + + void dumpDffOpt(); + sal_uInt16 dumpDffOptPropHeader(); + +private: + ItemFormatMap maSimpleProps; + ItemFormatMap maComplexProps; + sal_uInt16 mnInstVer; + sal_Int32 mnRealSize; +}; + +// ============================================================================ + +} // namespace dump +} // namespace oox + +#endif +#endif + diff --git a/oox/inc/oox/dump/dumperbase.hxx b/oox/inc/oox/dump/dumperbase.hxx new file mode 100644 index 000000000000..ecca5751c16c --- /dev/null +++ b/oox/inc/oox/dump/dumperbase.hxx @@ -0,0 +1,1984 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DUMP_DUMPERBASE_HXX +#define OOX_DUMP_DUMPERBASE_HXX + +#include <math.h> +#include <vector> +#include <stack> +#include <set> +#include <map> +#include <boost/shared_ptr.hpp> +#include <rtl/strbuf.hxx> +#include <rtl/ustrbuf.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/util/DateTime.hpp> +#include <comphelper/mediadescriptor.hxx> +#include "oox/helper/helper.hxx" +#include "oox/helper/storagebase.hxx" +#include "oox/helper/binaryinputstream.hxx" + +#define OOX_INCLUDE_DUMPER (OSL_DEBUG_LEVEL > 0) + +#if OOX_INCLUDE_DUMPER + +namespace com { namespace sun { namespace star { + namespace io { class XInputStream; } + namespace io { class XTextInputStream; } + namespace io { class XOutputStream; } + namespace io { class XTextOutputStream; } + namespace lang { class XMultiServiceFactory; } +} } } + +namespace comphelper { + class IDocPasswordVerifier; +} + +namespace oox { + class BinaryOutputStream; +} + +namespace oox { namespace core { + class FilterBase; +} } + +namespace oox { +namespace dump { + +// ============================================================================ + +#define OOX_DUMP_UNUSED "unused" +#define OOX_DUMP_UNKNOWN "?unknown" + +#define OOX_DUMP_ERRASCII( ascii ) "?err:" ascii +#define OOX_DUMP_ERRSTRING( ascii ) CREATE_OUSTRING( OOX_DUMP_ERRASCII( ascii ) ) + +#define OOX_DUMP_ERR_NOMAP OOX_DUMP_ERRSTRING( "no-map" ) +#define OOX_DUMP_ERR_NONAME OOX_DUMP_ERRSTRING( "no-name" ) +#define OOX_DUMP_ERR_STREAM OOX_DUMP_ERRSTRING( "stream-error" ) + +#define OOX_DUMP_DUMPEXT CREATE_OUSTRING( ".dump" ) + +const sal_Unicode OOX_DUMP_STRQUOTE = '\''; +const sal_Unicode OOX_DUMP_FMLASTRQUOTE = '"'; +const sal_Unicode OOX_DUMP_ADDRABS = '$'; +const sal_Unicode OOX_DUMP_R1C1ROW = 'R'; +const sal_Unicode OOX_DUMP_R1C1COL = 'C'; +const sal_Unicode OOX_DUMP_R1C1OPEN = '['; +const sal_Unicode OOX_DUMP_R1C1CLOSE = ']'; +const sal_Unicode OOX_DUMP_RANGESEP = ':'; +const sal_Unicode OOX_DUMP_BASECLASS = 'B'; +const sal_Unicode OOX_DUMP_FUNCSEP = ','; +const sal_Unicode OOX_DUMP_LISTSEP = ','; +const sal_Unicode OOX_DUMP_TABSEP = '!'; +const sal_Unicode OOX_DUMP_ARRAYSEP = ';'; +const sal_Unicode OOX_DUMP_EMPTYVALUE = '~'; +const sal_Unicode OOX_DUMP_CMDPROMPT = '?'; +const sal_Unicode OOX_DUMP_PLACEHOLDER = '\x01'; + +typedef ::std::pair< ::rtl::OUString, ::rtl::OUString > OUStringPair; +typedef ::std::pair< sal_Int64, sal_Int64 > Int64Pair; + +typedef ::std::vector< ::rtl::OUString > OUStringVector; +typedef ::std::vector< sal_Int64 > Int64Vector; + +// ============================================================================ +// ============================================================================ + +/** Static helper functions for system file and stream access. */ +class InputOutputHelper +{ +public: + // file names ------------------------------------------------------------- + + static ::rtl::OUString convertFileNameToUrl( const ::rtl::OUString& rFileName ); + static sal_Int32 getFileNamePos( const ::rtl::OUString& rFileUrl ); + static ::rtl::OUString getFileNameExtension( const ::rtl::OUString& rFileUrl ); + + // input streams ---------------------------------------------------------- + + static ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + getXInputStream( BinaryInputStream& rStrm ); + + static ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + openInputStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::rtl::OUString& rFileName ); + + static ::com::sun::star::uno::Reference< ::com::sun::star::io::XTextInputStream > + openTextInputStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm, + const ::rtl::OUString& rEncoding ); + + static ::com::sun::star::uno::Reference< ::com::sun::star::io::XTextInputStream > + openTextInputStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::rtl::OUString& rFileName, + const ::rtl::OUString& rEncoding ); + + // output streams --------------------------------------------------------- + + static ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + openOutputStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::rtl::OUString& rFileName ); + + static ::com::sun::star::uno::Reference< ::com::sun::star::io::XTextOutputStream > + openTextOutputStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream >& rxOutStrm, + const ::rtl::OUString& rEncoding ); + + static ::com::sun::star::uno::Reference< ::com::sun::star::io::XTextOutputStream > + openTextOutputStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::rtl::OUString& rFileName, + const ::rtl::OUString& rEncoding ); +}; + +// ============================================================================ +// ============================================================================ + +/** Specifiers for atomic data types. */ +enum DataType +{ + DATATYPE_VOID, /// No data type. + DATATYPE_INT8, /// Signed 8-bit integer. + DATATYPE_UINT8, /// Unsigned 8-bit integer. + DATATYPE_INT16, /// Signed 16-bit integer. + DATATYPE_UINT16, /// Unsigned 16-bit integer. + DATATYPE_INT32, /// Signed 32-bit integer. + DATATYPE_UINT32, /// Unsigned 32-bit integer. + DATATYPE_INT64, /// Signed 64-bit integer. + DATATYPE_UINT64, /// Unsigned 64-bit integer. + DATATYPE_FLOAT, /// Floating-point, single precision. + DATATYPE_DOUBLE /// Floating-point, double precision. +}; + +// ---------------------------------------------------------------------------- + +/** Specifiers for the output format of values. */ +enum FormatType +{ + FORMATTYPE_NONE, /// No numeric format (e.g. show name only). + FORMATTYPE_DEC, /// Decimal. + FORMATTYPE_HEX, /// Hexadecimal. + FORMATTYPE_SHORTHEX, /// Hexadecimal, as short as possible (no leading zeros). + FORMATTYPE_BIN, /// Binary. + FORMATTYPE_FIX, /// Fixed-point. + FORMATTYPE_BOOL /// Boolean ('true' or 'false'). +}; + +// ---------------------------------------------------------------------------- + +/** Describes the output format of a data item. + + Data items are written in the following format: + + <NAME>=<VALUE>=<NAME-FROM-LIST> + + NAME is the name of the data item. The name is contained in the member + maItemName. If the name is empty, only the value is written (without a + leading equality sign). + + VALUE is the numeric value of the data item. Its format is dependent on the + output format given in the member meFmtType. If the format type is + FORMATTYPE_NONE, no value is written. + + NAME-FROM-LIST is a symbolic name for the current value of the data item. + Various types of name lists produce different names for values, which can + be used for enumerations or names for single bits in bitfields (see class + NameListBase and derived classes). The name of the list is given in the + member maListName. If it is empty, no name is written for the value. + */ +struct ItemFormat +{ + DataType meDataType; /// Data type of the item. + FormatType meFmtType; /// Output format for the value. + ::rtl::OUString maItemName; /// Name of the item. + ::rtl::OUString maListName; /// Name of a name list to be used for this item. + + explicit ItemFormat(); + + void set( DataType eDataType, FormatType eFmtType, const ::rtl::OUString& rItemName ); + void set( DataType eDataType, FormatType eFmtType, const ::rtl::OUString& rItemName, const ::rtl::OUString& rListName ); + + /** Initializes the struct from a vector of strings containing the item format. + + The vector must contain at least 2 strings. The struct is filled from + the strings in the vector in the following order: + 1) Data type (one of: [u]int8, [u]int16, [u]int32, [u]int64, float, double). + 2) Format type (one of: dec, hex, shorthex, bin, fix, bool, unused, unknown). + 3) Item name (optional). + 4) Name list name (optional). + + @return Iterator pointing to the first unhandled string. + */ + OUStringVector::const_iterator parse( const OUStringVector& rFormatVec ); + + /** Initializes the struct from a string containing the item format. + + The string must have the following format: + DATATYPE,FORMATTYPE[,ITEMNAME[,LISTNAME]] + + DATATYPE is the data type of the item (see above for possible values). + FORMATTYPE is the format type of the item (see above for possible values). + ITEMNAME is the name of the item (optional). + LISTNAME is the name of a name list (optional). + + @return List containing remaining unhandled format strings. + */ + OUStringVector parse( const ::rtl::OUString& rFormatStr ); +}; + +// ============================================================================ +// ============================================================================ + +struct Address +{ + sal_Int32 mnCol; + sal_Int32 mnRow; + inline explicit Address() : mnCol( 0 ), mnRow( 0 ) {} + inline explicit Address( sal_Int32 nCol, sal_Int32 nRow ) : mnCol( nCol ), mnRow( nRow ) {} +}; + +// ---------------------------------------------------------------------------- + +struct Range +{ + Address maFirst; + Address maLast; + inline explicit Range() {} +}; + +// ---------------------------------------------------------------------------- + +typedef ::std::vector< Range > RangeList; + +// ============================================================================ + +struct TokenAddress : public Address +{ + bool mbRelCol; + bool mbRelRow; + inline explicit TokenAddress() : mbRelCol( false ), mbRelRow( false ) {} +}; + +// ---------------------------------------------------------------------------- + +struct TokenRange +{ + TokenAddress maFirst; + TokenAddress maLast; + inline explicit TokenRange() {} +}; + +// ============================================================================ +// ============================================================================ + +/** Static helper functions for formatted output to strings. */ +class StringHelper +{ +public: + // append string to string ------------------------------------------------ + + static void appendChar( ::rtl::OUStringBuffer& rStr, sal_Unicode cChar, sal_Int32 nCount = 1 ); + static void appendString( ::rtl::OUStringBuffer& rStr, const ::rtl::OUString& rData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + + // append decimal --------------------------------------------------------- + + static void appendDec( ::rtl::OUStringBuffer& rStr, sal_uInt8 nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + static void appendDec( ::rtl::OUStringBuffer& rStr, sal_Int8 nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + static void appendDec( ::rtl::OUStringBuffer& rStr, sal_uInt16 nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + static void appendDec( ::rtl::OUStringBuffer& rStr, sal_Int16 nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + static void appendDec( ::rtl::OUStringBuffer& rStr, sal_uInt32 nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + static void appendDec( ::rtl::OUStringBuffer& rStr, sal_Int32 nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + static void appendDec( ::rtl::OUStringBuffer& rStr, sal_uInt64 nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + static void appendDec( ::rtl::OUStringBuffer& rStr, sal_Int64 nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + static void appendDec( ::rtl::OUStringBuffer& rStr, double fData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ); + + // append hexadecimal ----------------------------------------------------- + + static void appendHex( ::rtl::OUStringBuffer& rStr, sal_uInt8 nData, bool bPrefix = true ); + static void appendHex( ::rtl::OUStringBuffer& rStr, sal_Int8 nData, bool bPrefix = true ); + static void appendHex( ::rtl::OUStringBuffer& rStr, sal_uInt16 nData, bool bPrefix = true ); + static void appendHex( ::rtl::OUStringBuffer& rStr, sal_Int16 nData, bool bPrefix = true ); + static void appendHex( ::rtl::OUStringBuffer& rStr, sal_uInt32 nData, bool bPrefix = true ); + static void appendHex( ::rtl::OUStringBuffer& rStr, sal_Int32 nData, bool bPrefix = true ); + static void appendHex( ::rtl::OUStringBuffer& rStr, sal_uInt64 nData, bool bPrefix = true ); + static void appendHex( ::rtl::OUStringBuffer& rStr, sal_Int64 nData, bool bPrefix = true ); + static void appendHex( ::rtl::OUStringBuffer& rStr, double fData, bool bPrefix = true ); + + // append shortened hexadecimal ------------------------------------------- + + static void appendShortHex( ::rtl::OUStringBuffer& rStr, sal_uInt8 nData, bool bPrefix = true ); + static void appendShortHex( ::rtl::OUStringBuffer& rStr, sal_Int8 nData, bool bPrefix = true ); + static void appendShortHex( ::rtl::OUStringBuffer& rStr, sal_uInt16 nData, bool bPrefix = true ); + static void appendShortHex( ::rtl::OUStringBuffer& rStr, sal_Int16 nData, bool bPrefix = true ); + static void appendShortHex( ::rtl::OUStringBuffer& rStr, sal_uInt32 nData, bool bPrefix = true ); + static void appendShortHex( ::rtl::OUStringBuffer& rStr, sal_Int32 nData, bool bPrefix = true ); + static void appendShortHex( ::rtl::OUStringBuffer& rStr, sal_uInt64 nData, bool bPrefix = true ); + static void appendShortHex( ::rtl::OUStringBuffer& rStr, sal_Int64 nData, bool bPrefix = true ); + static void appendShortHex( ::rtl::OUStringBuffer& rStr, double fData, bool bPrefix = true ); + + // append binary ---------------------------------------------------------- + + static void appendBin( ::rtl::OUStringBuffer& rStr, sal_uInt8 nData, bool bDots = true ); + static void appendBin( ::rtl::OUStringBuffer& rStr, sal_Int8 nData, bool bDots = true ); + static void appendBin( ::rtl::OUStringBuffer& rStr, sal_uInt16 nData, bool bDots = true ); + static void appendBin( ::rtl::OUStringBuffer& rStr, sal_Int16 nData, bool bDots = true ); + static void appendBin( ::rtl::OUStringBuffer& rStr, sal_uInt32 nData, bool bDots = true ); + static void appendBin( ::rtl::OUStringBuffer& rStr, sal_Int32 nData, bool bDots = true ); + static void appendBin( ::rtl::OUStringBuffer& rStr, sal_uInt64 nData, bool bDots = true ); + static void appendBin( ::rtl::OUStringBuffer& rStr, sal_Int64 nData, bool bDots = true ); + static void appendBin( ::rtl::OUStringBuffer& rStr, double fData, bool bDots = true ); + + // append fixed-point decimal --------------------------------------------- + + template< typename Type > + static void appendFix( ::rtl::OUStringBuffer& rStr, Type nData, sal_Int32 nWidth = 0 ); + + // append formatted value ------------------------------------------------- + + static void appendBool( ::rtl::OUStringBuffer& rStr, bool bData ); + template< typename Type > + static void appendValue( ::rtl::OUStringBuffer& rStr, Type nData, FormatType eFmtType ); + + // append columns, rows, addresses ---------------------------------------- + + static void appendAddrCol( ::rtl::OUStringBuffer& rStr, sal_Int32 nCol, bool bRel ); + static void appendAddrRow( ::rtl::OUStringBuffer& rStr, sal_Int32 nRow, bool bRel ); + static void appendAddrName( ::rtl::OUStringBuffer& rStr, sal_Unicode cPrefix, sal_Int32 nColRow, bool bRel ); + + static void appendAddress( ::rtl::OUStringBuffer& rStr, const Address& rPos ); + static void appendRange( ::rtl::OUStringBuffer& rStr, const Range& rRange ); + static void appendRangeList( ::rtl::OUStringBuffer& rStr, const RangeList& rRanges ); + + static void appendAddress( ::rtl::OUStringBuffer& rStr, const TokenAddress& rPos, bool bR1C1 ); + static void appendRange( ::rtl::OUStringBuffer& rStr, const TokenRange& rRange, bool bR1C1 ); + + // encoded text output ---------------------------------------------------- + + static void appendCChar( ::rtl::OUStringBuffer& rStr, sal_Unicode cChar, bool bPrefix = true ); + static void appendEncChar( ::rtl::OUStringBuffer& rStr, sal_Unicode cChar, sal_Int32 nCount = 1, bool bPrefix = true ); + static void appendEncString( ::rtl::OUStringBuffer& rStr, const ::rtl::OUString& rData, bool bPrefix = true ); + + // token list ------------------------------------------------------------- + + static void appendToken( ::rtl::OUStringBuffer& rStr, const ::rtl::OUString& rToken, sal_Unicode cSep = OOX_DUMP_LISTSEP ); + static void appendToken( ::rtl::OUStringBuffer& rStr, sal_Int64 nToken, sal_Unicode cSep = OOX_DUMP_LISTSEP ); + static void prependToken( ::rtl::OUStringBuffer& rStr, const ::rtl::OUString& rToken, sal_Unicode cSep = OOX_DUMP_LISTSEP ); + static void prependToken( ::rtl::OUStringBuffer& rStr, sal_Int64 nToken, sal_Unicode cSep = OOX_DUMP_LISTSEP ); + + static void appendIndex( ::rtl::OUStringBuffer& rStr, const ::rtl::OUString& rIdx ); + static void appendIndex( ::rtl::OUStringBuffer& rStr, sal_Int64 nIdx ); + static void appendIndexedText( ::rtl::OUStringBuffer& rStr, const ::rtl::OUString& rData, const ::rtl::OUString& rIdx ); + static void appendIndexedText( ::rtl::OUStringBuffer& rStr, const ::rtl::OUString& rData, sal_Int64 nIdx ); + + static ::rtl::OUString getToken( const ::rtl::OUString& rData, sal_Int32& rnPos, sal_Unicode cSep = OOX_DUMP_LISTSEP ); + + /** Encloses the passed string with the passed characters. Uses cOpen, if cClose is NUL. */ + static void enclose( ::rtl::OUStringBuffer& rStr, sal_Unicode cOpen, sal_Unicode cClose = '\0' ); + + // string conversion ------------------------------------------------------ + + static ::rtl::OUString trimSpaces( const ::rtl::OUString& rStr ); + static ::rtl::OUString trimTrailingNul( const ::rtl::OUString& rStr ); + + static ::rtl::OString convertToUtf8( const ::rtl::OUString& rStr ); + static DataType convertToDataType( const ::rtl::OUString& rStr ); + static FormatType convertToFormatType( const ::rtl::OUString& rStr ); + + static bool convertFromDec( sal_Int64& ornData, const ::rtl::OUString& rData ); + static bool convertFromHex( sal_Int64& ornData, const ::rtl::OUString& rData ); + + static bool convertStringToInt( sal_Int64& ornData, const ::rtl::OUString& rData ); + static bool convertStringToDouble( double& orfData, const ::rtl::OUString& rData ); + static bool convertStringToBool( const ::rtl::OUString& rData ); + + static OUStringPair convertStringToPair( const ::rtl::OUString& rString, sal_Unicode cSep = '=' ); + + // string to list conversion ---------------------------------------------- + + static void convertStringToStringList( OUStringVector& orVec, const ::rtl::OUString& rData, bool bIgnoreEmpty ); + static void convertStringToIntList( Int64Vector& orVec, const ::rtl::OUString& rData, bool bIgnoreEmpty ); +}; + +// ---------------------------------------------------------------------------- + +template< typename Type > +void StringHelper::appendFix( ::rtl::OUStringBuffer& rStr, Type nData, sal_Int32 nWidth ) +{ + appendDec( rStr, static_cast< double >( nData ) / pow( 2.0, 4.0 * sizeof( Type ) ), nWidth ); +} + +template< typename Type > +void StringHelper::appendValue( ::rtl::OUStringBuffer& rStr, Type nData, FormatType eFmtType ) +{ + switch( eFmtType ) + { + case FORMATTYPE_DEC: appendDec( rStr, nData ); break; + case FORMATTYPE_HEX: appendHex( rStr, nData ); break; + case FORMATTYPE_SHORTHEX: appendShortHex( rStr, nData ); break; + case FORMATTYPE_BIN: appendBin( rStr, nData ); break; + case FORMATTYPE_FIX: appendFix( rStr, nData ); break; + case FORMATTYPE_BOOL: appendBool( rStr, nData ); break; + default:; + } +} + +// ============================================================================ + +class String : public ::rtl::OUString +{ +public: + inline String() {} + inline /*implicit*/ String( const ::rtl::OUString& rStr ) : ::rtl::OUString( rStr ) {} + inline /*implicit*/ String( const sal_Char* pcStr ) : ::rtl::OUString( ::rtl::OUString::createFromAscii( pcStr ? pcStr : "" ) ) {} + inline /*implicit*/ String( sal_Unicode cChar ) : ::rtl::OUString( cChar ) {} + + inline bool has() const { return getLength() > 0; } + inline ::rtl::OUString operator()( const sal_Char* pcDefault ) const { if( has() ) return *this; return String( pcDefault ); } +}; + +static const String EMPTY_STRING; + +// ============================================================================ +// ============================================================================ + +/** Stack to create a human readable formula string from a UPN token array. */ +class FormulaStack +{ +public: + explicit FormulaStack(); + + inline const ::rtl::OUString& getFormulaString() const { return getString( maFmlaStack ); } + inline const ::rtl::OUString& getClassesString() const { return getString( maClassStack ); } + + void pushOperand( const String& rOp, const ::rtl::OUString& rTokClass ); + void pushOperand( const String& rOp ); + void pushUnaryOp( const String& rLOp, const String& rROp ); + void pushBinaryOp( const String& rOp ); + void pushFuncOp( const String& rFunc, const ::rtl::OUString& rTokClass, sal_uInt8 nParamCount ); + + inline void setError() { mbError = true; } + void replaceOnTop( const ::rtl::OUString& rOld, const ::rtl::OUString& rNew ); + +private: + typedef ::std::stack< ::rtl::OUString > StringStack; + + inline bool check( bool bCond ) { return (mbError |= !bCond) == false; } + + const ::rtl::OUString& getString( const StringStack& rStack ) const; + void pushUnaryOp( StringStack& rStack, const ::rtl::OUString& rLOp, const ::rtl::OUString& rROp ); + void pushBinaryOp( StringStack& rStack, const ::rtl::OUString& rOp ); + void pushFuncOp( StringStack& rStack, const ::rtl::OUString& rOp, sal_uInt8 nParamCount ); + +private: + StringStack maFmlaStack; + StringStack maClassStack; + bool mbError; +}; + +// ============================================================================ +// ============================================================================ + +class Base; +typedef ::boost::shared_ptr< Base > BaseRef; + +/** Base class for all dumper classes. + + Derived classes implement the virtual function implIsValid(). It should + check all members the other functions rely on. If the function + implIsValid() returns true, all references and pointers can be used without + further checking. + + Overview of all classes in this header file based on this Base class: + + Base + | + +----> NameListBase + | | + | +----> ConstList ------> MultiList + | | + | +----> FlagsList ------> CombiList + | | + | +----> UnitConverter + | + +----> SharedConfigData + | + +----> Config + | + +----> Output + | + +----> StorageIterator + | + +----> ObjectBase + | + +----> StorageObjectBase + | + +----> OutputObjectBase + | | + | +----> InputObjectBase + | | + | +----> BinaryStreamObject + | | + | +----> TextStreamObject + | | | + | | +----> XmlStreamObject + | | + | +----> RecordObjectBase + | | + | +----> SequenceRecordObjectBase + | + +----> DumperBase + */ +class Base +{ +public: + virtual ~Base(); + + inline bool isValid() const { return implIsValid(); } + inline static bool isValid( const BaseRef& rxBase ) { return rxBase.get() && rxBase->isValid(); } + +protected: + inline explicit Base() {} + + virtual bool implIsValid() const = 0; +}; + +// ============================================================================ +// ============================================================================ + +typedef ::com::sun::star::uno::Reference< ::com::sun::star::io::XTextInputStream > ConfigInputStreamRef; + +class ConfigItemBase +{ +public: + virtual ~ConfigItemBase(); + void readConfigBlock( const ConfigInputStreamRef& rxStrm ); + +protected: + inline explicit ConfigItemBase() {} + + virtual void implProcessConfigItemStr( + const ConfigInputStreamRef& rxStrm, + const ::rtl::OUString& rKey, + const ::rtl::OUString& rData ); + + virtual void implProcessConfigItemInt( + const ConfigInputStreamRef& rxStrm, + sal_Int64 nKey, + const ::rtl::OUString& rData ); + + void readConfigBlockContents( + const ConfigInputStreamRef& rxStrm ); + +private: + enum LineType { LINETYPE_DATA, LINETYPE_END }; + + LineType readConfigLine( + const ConfigInputStreamRef& rxStrm, + ::rtl::OUString& orKey, + ::rtl::OUString& orData ) const; + + LineType readConfigLine( + const ConfigInputStreamRef& rxStrm ) const; + + void processConfigItem( + const ConfigInputStreamRef& rxStrm, + const ::rtl::OUString& rKey, + const ::rtl::OUString& rData ); +}; + +// ============================================================================ + +class SharedConfigData; +class Config; + +class NameListBase; +typedef ::boost::shared_ptr< NameListBase > NameListRef; + +/** Base class of all classes providing names for specific values (name lists). + + The idea is to provide a unique interfase for all different methods to + write specific names for any values. This can be enumerations (dedicated + names for a subset of values), or names for bits in bit fields. Classes + derived from this base class implement the specific behaviour for the + desired purpose. + */ +class NameListBase : public Base, public ConfigItemBase +{ +public: + typedef ::std::map< sal_Int64, ::rtl::OUString > OUStringMap; + typedef OUStringMap::const_iterator const_iterator; + +public: + virtual ~NameListBase(); + + /** Sets a name for the specified key. */ + void setName( sal_Int64 nKey, const String& rName ); + + /** Include all names of the passed list. */ + void includeList( const NameListRef& rxList ); + + /** Returns true, if the map contains an entry for the passed key. */ + template< typename Type > + inline bool hasName( Type nKey ) const + { return maMap.count( static_cast< sal_Int64 >( nKey ) ) != 0; } + + /** Returns the name for the passed key. */ + template< typename Type > + inline ::rtl::OUString getName( const Config& rCfg, Type nKey ) const + { return implGetName( rCfg, static_cast< sal_Int64 >( nKey ) ); } + + /** Returns a display name for the passed double value. */ + inline ::rtl::OUString getName( const Config& rCfg, double fValue ) const + { return implGetNameDbl( rCfg, fValue ); } + + /** Returns a map iterator pointing to the first contained name. */ + inline const_iterator begin() const { return maMap.begin(); } + /** Returns a map iterator pointing one past the last contained name. */ + inline const_iterator end() const { return maMap.end(); } + +protected: + inline explicit NameListBase( const SharedConfigData& rCfgData ) : mrCfgData( rCfgData ) {} + + virtual bool implIsValid() const; + + virtual void implProcessConfigItemStr( + const ConfigInputStreamRef& rxStrm, + const ::rtl::OUString& rKey, + const ::rtl::OUString& rData ); + + virtual void implProcessConfigItemInt( + const ConfigInputStreamRef& rxStrm, + sal_Int64 nKey, + const ::rtl::OUString& rData ); + + /** Derived classes set the name for the passed key. */ + virtual void implSetName( sal_Int64 nKey, const ::rtl::OUString& rName ) = 0; + /** Derived classes generate and return the name for the passed key. */ + virtual ::rtl::OUString implGetName( const Config& rCfg, sal_Int64 nKey ) const = 0; + /** Derived classes generate and return the name for the passed double value. */ + virtual ::rtl::OUString implGetNameDbl( const Config& rCfg, double fValue ) const = 0; + /** Derived classes insert all names and other settings from the passed list. */ + virtual void implIncludeList( const NameListBase& rList ) = 0; + + /** Inserts the passed name into the internal map. */ + void insertRawName( sal_Int64 nKey, const ::rtl::OUString& rName ); + /** Returns the name for the passed key, or 0, if nothing found. */ + const ::rtl::OUString* findRawName( sal_Int64 nKey ) const; + +private: + /** Includes name lists, given in a comma separated list of names of the lists. */ + void include( const ::rtl::OUString& rListKeys ); + /** Excludes names from the list, given in a comma separated list of their keys. */ + void exclude( const ::rtl::OUString& rKeys ); + +private: + OUStringMap maMap; + const SharedConfigData& mrCfgData; +}; + +// ============================================================================ + +class ConstList : public NameListBase +{ +public: + explicit ConstList( const SharedConfigData& rCfgData ); + + /** Sets a default name for unknown keys. */ + inline void setDefaultName( const String& rDefName ) { maDefName = rDefName; } + /** Enables or disables automatic quotation of returned names. */ + inline void setQuoteNames( bool bQuoteNames ) { mbQuoteNames = bQuoteNames; } + +protected: + virtual void implProcessConfigItemStr( + const ConfigInputStreamRef& rxStrm, + const ::rtl::OUString& rKey, + const ::rtl::OUString& rData ); + + /** Sets the name for the passed key. */ + virtual void implSetName( sal_Int64 nKey, const ::rtl::OUString& rName ); + /** Returns the name for the passed key, or the default name, if key is not contained. */ + virtual ::rtl::OUString implGetName( const Config& rCfg, sal_Int64 nKey ) const; + /** Returns the name for the passed double value. */ + virtual ::rtl::OUString implGetNameDbl( const Config& rCfg, double fValue ) const; + /** Inserts all names from the passed list. */ + virtual void implIncludeList( const NameListBase& rList ); + +private: + ::rtl::OUString maDefName; + bool mbQuoteNames; +}; + +// ============================================================================ + +class MultiList : public ConstList +{ +public: + explicit MultiList( const SharedConfigData& rCfgData ); + + void setNamesFromVec( sal_Int64 nStartKey, const OUStringVector& rNames ); + +protected: + virtual void implProcessConfigItemStr( + const ConfigInputStreamRef& rxStrm, + const ::rtl::OUString& rKey, + const ::rtl::OUString& rData ); + + virtual void implSetName( sal_Int64 nKey, const ::rtl::OUString& rName ); + +private: + void insertNames( sal_Int64 nStartKey, const ::rtl::OUString& rData ); + +private: + bool mbIgnoreEmpty; +}; + +// ============================================================================ + +class FlagsList : public NameListBase +{ +public: + explicit FlagsList( const SharedConfigData& rCfgData ); + + /** Returns the flags to be ignored on output. */ + inline sal_Int64 getIgnoreFlags() const { return mnIgnore; } + /** Sets flags to be ignored on output. */ + inline void setIgnoreFlags( sal_Int64 nIgnore ) { mnIgnore = nIgnore; } + +protected: + virtual void implProcessConfigItemStr( + const ConfigInputStreamRef& rxStrm, + const ::rtl::OUString& rKey, + const ::rtl::OUString& rData ); + + /** Sets the name for the passed key. */ + virtual void implSetName( sal_Int64 nKey, const ::rtl::OUString& rName ); + /** Returns the name for the passed key. */ + virtual ::rtl::OUString implGetName( const Config& rCfg, sal_Int64 nKey ) const; + /** Returns the name for the passed double value. */ + virtual ::rtl::OUString implGetNameDbl( const Config& rCfg, double fValue ) const; + /** Inserts all flags from the passed list. */ + virtual void implIncludeList( const NameListBase& rList ); + +private: + sal_Int64 mnIgnore; +}; + +// ============================================================================ + +class CombiList : public FlagsList +{ +public: + explicit CombiList( const SharedConfigData& rCfgData ); + +protected: + /** Sets the name for the passed key. */ + virtual void implSetName( sal_Int64 nKey, const ::rtl::OUString& rName ); + /** Returns the name for the passed key. */ + virtual ::rtl::OUString implGetName( const Config& rCfg, sal_Int64 nKey ) const; + /** Inserts all flags from the passed list. */ + virtual void implIncludeList( const NameListBase& rList ); + +private: + struct ExtItemFormatKey + { + sal_Int64 mnKey; + Int64Pair maFilter; + inline explicit ExtItemFormatKey( sal_Int64 nKey ) : mnKey( nKey ), maFilter( 0, 0 ) {} + bool operator<( const ExtItemFormatKey& rRight ) const; + + }; + struct ExtItemFormat : public ItemFormat + { + bool mbShiftValue; + inline explicit ExtItemFormat() : mbShiftValue( true ) {} + }; + typedef ::std::map< ExtItemFormatKey, ExtItemFormat > ExtItemFormatMap; + ExtItemFormatMap maFmtMap; +}; + +// ============================================================================ + +class UnitConverter : public NameListBase +{ +public: + explicit UnitConverter( const SharedConfigData& rCfgData ); + + inline void setUnitName( const String& rUnitName ) { maUnitName = rUnitName; } + inline void setFactor( double fFactor ) { mfFactor = fFactor; } + +protected: + /** Sets the name for the passed key. */ + virtual void implSetName( sal_Int64 nKey, const ::rtl::OUString& rName ); + /** Returns the converted value with appended unit name. */ + virtual ::rtl::OUString implGetName( const Config& rCfg, sal_Int64 nKey ) const; + /** Returns the converted value with appended unit name. */ + virtual ::rtl::OUString implGetNameDbl( const Config& rCfg, double fValue ) const; + /** Empty implementation. */ + virtual void implIncludeList( const NameListBase& rList ); + +private: + ::rtl::OUString maUnitName; + double mfFactor; +}; + +// ============================================================================ + +class NameListWrapper +{ +public: + inline NameListWrapper() {} + inline /*implicit*/ NameListWrapper( const ::rtl::OUString& rListName ) : maName( rListName ) {} + inline /*implicit*/ NameListWrapper( const sal_Char* pcListName ) : maName( pcListName ) {} + inline /*implicit*/ NameListWrapper( const NameListRef& rxList ) : mxList( rxList ) {} + + inline bool isEmpty() const { return !mxList && !maName.has(); } + NameListRef getNameList( const Config& rCfg ) const; + +private: + String maName; + mutable NameListRef mxList; +}; + +static const NameListWrapper NO_LIST; + +// ============================================================================ + +class ItemFormatMap : public ::std::map< sal_Int64, ItemFormat > +{ +public: + inline explicit ItemFormatMap() {} + inline explicit ItemFormatMap( const NameListRef& rxNameList ) { insertFormats( rxNameList ); } + + void insertFormats( const NameListRef& rxNameList ); +}; + +// ============================================================================ +// ============================================================================ + +class SharedConfigData : public Base, public ConfigItemBase +{ +public: + explicit SharedConfigData( + const ::rtl::OUString& rFileName, + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const StorageRef& rxRootStrg, + const ::rtl::OUString& rSysFileName, + ::comphelper::MediaDescriptor& rMediaDesc ); + + virtual ~SharedConfigData(); + + inline const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& getFactory() const { return mxFactory; } + inline const StorageRef& getRootStorage() const { return mxRootStrg; } + inline const ::rtl::OUString& getSysFileName() const { return maSysFileName; } + + void setOption( const ::rtl::OUString& rKey, const ::rtl::OUString& rData ); + const ::rtl::OUString* getOption( const ::rtl::OUString& rKey ) const; + + template< typename ListType > + ::boost::shared_ptr< ListType > createNameList( const ::rtl::OUString& rListName ); + void setNameList( const ::rtl::OUString& rListName, const NameListRef& rxList ); + void eraseNameList( const ::rtl::OUString& rListName ); + NameListRef getNameList( const ::rtl::OUString& rListName ) const; + + ::rtl::OUString requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ); + inline bool isPasswordCancelled() const { return mbPwCancelled; } + +protected: + virtual bool implIsValid() const; + virtual void implProcessConfigItemStr( + const ConfigInputStreamRef& rxStrm, + const ::rtl::OUString& rKey, + const ::rtl::OUString& rData ); + +private: + bool readConfigFile( const ::rtl::OUString& rFileUrl ); + template< typename ListType > + void readNameList( const ConfigInputStreamRef& rxStrm, const ::rtl::OUString& rListName ); + void createShortList( const ::rtl::OUString& rData ); + void createUnitConverter( const ::rtl::OUString& rData ); + +private: + typedef ::std::set< ::rtl::OUString > ConfigFileSet; + typedef ::std::map< ::rtl::OUString, ::rtl::OUString > ConfigDataMap; + typedef ::std::map< ::rtl::OUString, NameListRef > NameListMap; + + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxFactory; + StorageRef mxRootStrg; + ::rtl::OUString maSysFileName; + ::comphelper::MediaDescriptor& mrMediaDesc; + ConfigFileSet maConfigFiles; + ConfigDataMap maConfigData; + NameListMap maNameLists; + ::rtl::OUString maConfigPath; + bool mbLoaded; + bool mbPwCancelled; +}; + +// ---------------------------------------------------------------------------- + +template< typename ListType > +::boost::shared_ptr< ListType > SharedConfigData::createNameList( const ::rtl::OUString& rListName ) +{ + ::boost::shared_ptr< ListType > xList; + if( rListName.getLength() > 0 ) + { + xList.reset( new ListType( *this ) ); + setNameList( rListName, xList ); + } + return xList; +} + +template< typename ListType > +void SharedConfigData::readNameList( const ConfigInputStreamRef& rxStrm, const ::rtl::OUString& rListName ) +{ + NameListRef xList = createNameList< ListType >( rListName ); + if( xList.get() ) + xList->readConfigBlock( rxStrm ); +} + +// ============================================================================ + +class Config : public Base +{ +public: + explicit Config( const Config& rParent ); + explicit Config( + const sal_Char* pcEnvVar, + const ::oox::core::FilterBase& rFilter ); + explicit Config( + const sal_Char* pcEnvVar, + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const StorageRef& rxRootStrg, + const ::rtl::OUString& rSysFileName, + ::comphelper::MediaDescriptor& rMediaDesc ); + + virtual ~Config(); + + inline const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& getFactory() const { return mxCfgData->getFactory(); } + inline const StorageRef& getRootStorage() const { return mxCfgData->getRootStorage(); } + inline const ::rtl::OUString& getSysFileName() const { return mxCfgData->getSysFileName(); } + + void setStringOption( const String& rKey, const String& rData ); + + const ::rtl::OUString& getStringOption( const String& rKey, const ::rtl::OUString& rDefault ) const; + bool getBoolOption( const String& rKey, bool bDefault ) const; + template< typename Type > + Type getIntOption( const String& rKey, Type nDefault ) const; + + bool isDumperEnabled() const; + bool isImportEnabled() const; + + template< typename ListType > + ::boost::shared_ptr< ListType > createNameList( const String& rListName ); + void setNameList( const String& rListName, const NameListRef& rxList ); + void eraseNameList( const String& rListName ); + NameListRef getNameList( const String& rListName ) const; + + /** Returns the name for the passed key from the passed name list. */ + template< typename Type > + ::rtl::OUString getName( const NameListWrapper& rListWrp, Type nKey ) const; + /** Returns true, if the passed name list contains an entry for the passed key. */ + template< typename Type > + bool hasName( const NameListWrapper& rListWrp, Type nKey ) const; + + ::rtl::OUString requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ); + bool isPasswordCancelled() const; + +protected: + inline explicit Config() {} + void construct( const Config& rParent ); + void construct( + const sal_Char* pcEnvVar, + const ::oox::core::FilterBase& rFilter ); + void construct( + const sal_Char* pcEnvVar, + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const StorageRef& rxRootStrg, + const ::rtl::OUString& rSysFileName, + ::comphelper::MediaDescriptor& rMediaDesc ); + + virtual bool implIsValid() const; + virtual const ::rtl::OUString* implGetOption( const ::rtl::OUString& rKey ) const; + virtual NameListRef implGetNameList( const ::rtl::OUString& rListName ) const; + +private: + typedef ::boost::shared_ptr< SharedConfigData > SharedConfigDataRef; + SharedConfigDataRef mxCfgData; +}; + +typedef ::boost::shared_ptr< Config > ConfigRef; + +// ---------------------------------------------------------------------------- + +template< typename Type > +Type Config::getIntOption( const String& rKey, Type nDefault ) const +{ + sal_Int64 nRawData; + const ::rtl::OUString* pData = implGetOption( rKey ); + return (pData && StringHelper::convertStringToInt( nRawData, *pData )) ? + static_cast< Type >( nRawData ) : nDefault; +} + +template< typename ListType > +::boost::shared_ptr< ListType > Config::createNameList( const String& rListName ) +{ + return mxCfgData->createNameList< ListType >( rListName ); +} + +template< typename Type > +::rtl::OUString Config::getName( const NameListWrapper& rListWrp, Type nKey ) const +{ + NameListRef xList = rListWrp.getNameList( *this ); + return xList.get() ? xList->getName( *this, nKey ) : OOX_DUMP_ERR_NOMAP; +} + +template< typename Type > +bool Config::hasName( const NameListWrapper& rListWrp, Type nKey ) const +{ + NameListRef xList = rListWrp.getNameList( *this ); + return xList.get() && xList->hasName( nKey ); +} + +// ============================================================================ +// ============================================================================ + +class Output : public Base +{ +public: + explicit Output( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XTextOutputStream >& rxStrm ); + + explicit Output( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::rtl::OUString& rFileName ); + + // ------------------------------------------------------------------------ + + void newLine(); + void emptyLine( size_t nCount = 1 ); + inline ::rtl::OUStringBuffer& getLine() { return maLine; } + + void incIndent(); + void decIndent(); + void resetIndent(); + + void startTable( sal_Int32 nW1 ); + void startTable( sal_Int32 nW1, sal_Int32 nW2 ); + void startTable( sal_Int32 nW1, sal_Int32 nW2, sal_Int32 nW3 ); + void startTable( sal_Int32 nW1, sal_Int32 nW2, sal_Int32 nW3, sal_Int32 nW4 ); + void startTable( size_t nColCount, const sal_Int32* pnColWidths ); + void tab(); + void tab( size_t nCol ); + void endTable(); + + void resetItemIndex( sal_Int64 nIdx = 0 ); + void startItem( const String& rItemName ); + void contItem(); + void endItem(); + inline const ::rtl::OUString& getLastItemValue() const { return maLastItem; } + + void startMultiItems(); + void endMultiItems(); + + // ------------------------------------------------------------------------ + + void writeChar( sal_Unicode cChar, sal_Int32 nCount = 1 ); + void writeAscii( const sal_Char* pcStr ); + void writeString( const ::rtl::OUString& rStr ); + void writeArray( const sal_uInt8* pnData, sal_Size nSize, sal_Unicode cSep = OOX_DUMP_LISTSEP ); + void writeBool( bool bData ); + void writeColorABGR( sal_Int32 nColor ); + void writeDateTime( const ::com::sun::star::util::DateTime& rDateTime ); + void writeColIndex( sal_Int32 nCol ); + void writeRowIndex( sal_Int32 nRow ); + void writeColRowRange( sal_Int32 nColRow1, sal_Int32 nColRow2 ); + void writeColRange( sal_Int32 nCol1, sal_Int32 nCol2 ); + void writeRowRange( sal_Int32 nRow1, sal_Int32 nRow2 ); + void writeAddress( const Address& rPos ); + void writeRange( const Range& rRange ); + void writeRangeList( const RangeList& rRanges ); + + template< typename Type > + inline void writeDec( Type nData, sal_Int32 nWidth = 0, sal_Unicode cFill = ' ' ) + { StringHelper::appendDec( maLine, nData, nWidth, cFill ); } + template< typename Type > + inline void writeHex( Type nData, bool bPrefix = true ) + { StringHelper::appendHex( maLine, nData, bPrefix ); } + template< typename Type > + inline void writeShortHex( Type nData, bool bPrefix = true ) + { StringHelper::appendShortHex( maLine, nData, bPrefix ); } + template< typename Type > + inline void writeBin( Type nData, bool bDots = true ) + { StringHelper::appendBin( maLine, nData, bDots ); } + template< typename Type > + inline void writeFix( Type nData, sal_Int32 nWidth = 0 ) + { StringHelper::appendFix( maLine, nData, nWidth ); } + template< typename Type > + inline void writeValue( Type nData, FormatType eFmtType ) + { StringHelper::appendValue( maLine, nData, eFmtType ); } + template< typename Type > + inline void writeName( const Config& rCfg, Type nData, const NameListWrapper& rListWrp ) + { writeString( rCfg.getName( rListWrp, nData ) ); } + + // ------------------------------------------------------------------------ +protected: + void construct( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XTextOutputStream >& rxStrm ); + + virtual bool implIsValid() const; + +private: + void writeItemName( const String& rItemName ); + +private: + typedef ::std::vector< sal_Int32 > StringLenVec; + + ::com::sun::star::uno::Reference< ::com::sun::star::io::XTextOutputStream > mxStrm; + ::rtl::OUString maIndent; + ::rtl::OUStringBuffer maLine; + ::rtl::OUString maLastItem; + StringLenVec maColPos; + size_t mnCol; + size_t mnItemLevel; + size_t mnMultiLevel; + sal_Int64 mnItemIdx; + sal_Int32 mnLastItem; +}; + +typedef ::boost::shared_ptr< Output > OutputRef; + +// ============================================================================ + +class IndentGuard +{ +public: + inline explicit IndentGuard( Output& rOut ) : mrOut( rOut ) { mrOut.incIndent(); } + inline ~IndentGuard() { mrOut.decIndent(); } +private: + IndentGuard( const IndentGuard& ); + IndentGuard& operator=( const IndentGuard& ); +private: + Output& mrOut; +}; + +// ---------------------------------------------------------------------------- + +class TableGuard +{ +public: + inline explicit TableGuard( Output& rOut, sal_Int32 nW1 ) : + mrOut( rOut ) { mrOut.startTable( nW1 ); } + inline explicit TableGuard( Output& rOut, sal_Int32 nW1, sal_Int32 nW2 ) : + mrOut( rOut ) { mrOut.startTable( nW1, nW2 ); } + inline explicit TableGuard( Output& rOut, sal_Int32 nW1, sal_Int32 nW2, sal_Int32 nW3 ) : + mrOut( rOut ) { mrOut.startTable( nW1, nW2, nW3 ); } + inline explicit TableGuard( Output& rOut, sal_Int32 nW1, sal_Int32 nW2, sal_Int32 nW3, sal_Int32 nW4 ) : + mrOut( rOut ) { mrOut.startTable( nW1, nW2, nW3, nW4 ); } + inline explicit TableGuard( Output& rOut, size_t nColCount, + const sal_Int32* pnColWidths ) : + mrOut( rOut ) { mrOut.startTable( nColCount, pnColWidths ); } + inline ~TableGuard() { mrOut.endTable(); } + inline void tab() { mrOut.tab(); } + inline void tab( size_t nCol ) { mrOut.tab( nCol ); } +private: + TableGuard( const TableGuard& ); + TableGuard& operator=( const TableGuard& ); +private: + Output& mrOut; +}; + +// ---------------------------------------------------------------------------- + +class ItemGuard +{ +public: + inline explicit ItemGuard( Output& rOut, const String& rName = EMPTY_STRING ) : + mrOut( rOut ) { mrOut.startItem( rName ); } + inline ~ItemGuard() { mrOut.endItem(); } + inline void cont() { mrOut.contItem(); } +private: + ItemGuard( const ItemGuard& ); + ItemGuard& operator=( const ItemGuard& ); +private: + Output& mrOut; +}; + +// ---------------------------------------------------------------------------- + +class MultiItemsGuard +{ +public: + inline explicit MultiItemsGuard( Output& rOut ) : mrOut( rOut ) { mrOut.startMultiItems(); } + inline ~MultiItemsGuard() { mrOut.endMultiItems(); } +private: + MultiItemsGuard( const MultiItemsGuard& ); + MultiItemsGuard& operator=( const MultiItemsGuard& ); +private: + Output& mrOut; +}; + +// ============================================================================ + +class StorageIterator : public Base +{ +public: + explicit StorageIterator( const StorageRef& rxStrg ); + virtual ~StorageIterator(); + + size_t getElementCount() const; + + StorageIterator& operator++(); + + ::rtl::OUString getName() const; + bool isStream() const; + bool isStorage() const; + +private: + virtual bool implIsValid() const; + +private: + StorageRef mxStrg; + OUStringVector maNames; + OUStringVector::const_iterator maIt; +}; + +// ============================================================================ +// ============================================================================ + +class ObjectBase : public Base +{ +public: + virtual ~ObjectBase(); + + inline const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& getFactory() const { return mxConfig->getFactory(); } + + void dump(); + + // ------------------------------------------------------------------------ +protected: + inline explicit ObjectBase() {} + + void construct( const ConfigRef& rxConfig ); + void construct( const ObjectBase& rParent ); + + virtual bool implIsValid() const; + virtual void implDump(); + + // ------------------------------------------------------------------------ + + void reconstructConfig( const ConfigRef& rxConfig ); + + inline Config& cfg() const { return *mxConfig; } + +private: + ConfigRef mxConfig; +}; + +typedef ::boost::shared_ptr< ObjectBase > ObjectRef; + +// ============================================================================ +// ============================================================================ + +class StorageObjectBase : public ObjectBase +{ +protected: + inline explicit StorageObjectBase() {} + +protected: + using ObjectBase::construct; + void construct( const ObjectBase& rParent, const StorageRef& rxStrg, const ::rtl::OUString& rSysPath ); + void construct( const ObjectBase& rParent ); + + virtual bool implIsValid() const; + virtual void implDump(); + + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); + + virtual void implDumpStorage( + const StorageRef& rxStrg, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rSysPath ); + + void addPreferredStream( const String& rStrmName ); + void addPreferredStorage( const String& rStrgPath ); + +private: + ::rtl::OUString getSysFileName( + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysOutPath ); + + void extractStream( + StorageBase& rStrg, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); + void extractStorage( + const StorageRef& rxStrg, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rSysPath ); + + void extractItem( + const StorageRef& rxStrg, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rItemName, + const ::rtl::OUString& rSysOutPath, + bool bIsStrg, bool bIsStrm ); + +private: + struct PreferredItem + { + ::rtl::OUString maName; + bool mbStorage; + + inline explicit PreferredItem( const ::rtl::OUString rName, bool bStorage ) : + maName( rName ), mbStorage( bStorage ) {} + }; + typedef ::std::vector< PreferredItem > PreferredItemVector; + + StorageRef mxStrg; + ::rtl::OUString maSysPath; + PreferredItemVector maPreferred; +}; + +typedef ::boost::shared_ptr< StorageObjectBase > StorageObjectRef; + +// ============================================================================ +// ============================================================================ + +class OutputObjectBase : public ObjectBase +{ +public: + virtual ~OutputObjectBase(); + + // ------------------------------------------------------------------------ +protected: + inline explicit OutputObjectBase() {} + + using ObjectBase::construct; + void construct( const ObjectBase& rParent, const ::rtl::OUString& rSysFileName ); + void construct( const ObjectBase& rParent, const OutputRef& rxOut ); + void construct( const OutputObjectBase& rParent ); + + virtual bool implIsValid() const; + + // ------------------------------------------------------------------------ + + inline Output& out() const { return *mxOut; } + + // ------------------------------------------------------------------------ + + void writeEmptyItem( const String& rName ); + void writeInfoItem( const String& rName, const String& rData ); + void writeCharItem( const String& rName, sal_Unicode cData ); + void writeStringItem( const String& rName, const ::rtl::OUString& rData ); + void writeArrayItem( const String& rName, const sal_uInt8* pnData, sal_Size nSize, sal_Unicode cSep = OOX_DUMP_LISTSEP ); + void writeBoolItem( const String& rName, bool bData ); + double writeRkItem( const String& rName, sal_Int32 nRk ); + void writeColorABGRItem( const String& rName, sal_Int32 nColor ); + void writeDateTimeItem( const String& rName, const ::com::sun::star::util::DateTime& rDateTime ); + void writeGuidItem( const String& rName, const ::rtl::OUString& rGuid ); + void writeColIndexItem( const String& rName, sal_Int32 nCol ); + void writeRowIndexItem( const String& rName, sal_Int32 nRow ); + void writeColRangeItem( const String& rName, sal_Int32 nCol1, sal_Int32 nCol2 ); + void writeRowRangeItem( const String& rName, sal_Int32 nRow1, sal_Int32 nRow2 ); + void writeAddressItem( const String& rName, const Address& rPos ); + void writeRangeItem( const String& rName, const Range& rRange ); + void writeRangeListItem( const String& rName, const RangeList& rRanges ); + void writeTokenAddressItem( const String& rName, const TokenAddress& rPos, bool bNameMode ); + void writeTokenAddress3dItem( const String& rName, const ::rtl::OUString& rRef, const TokenAddress& rPos, bool bNameMode ); + void writeTokenRangeItem( const String& rName, const TokenRange& rRange, bool bNameMode ); + void writeTokenRange3dItem( const String& rName, const ::rtl::OUString& rRef, const TokenRange& rRange, bool bNameMode ); + + template< typename Type > + void addNameToItem( Type nData, const NameListWrapper& rListWrp ); + + template< typename Type > + void writeNameItem( const String& rName, Type nData, const NameListWrapper& rListWrp ); + template< typename Type > + void writeDecItem( const String& rName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + void writeHexItem( const String& rName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + void writeShortHexItem( const String& rName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + void writeBinItem( const String& rName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + void writeFixItem( const String& rName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + void writeDecBoolItem( const String& rName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + void writeValueItem( const String& rName, Type nData, FormatType eFmtType, const NameListWrapper& rListWrp = NO_LIST ); + + template< typename Type > + void writeValueItem( const ItemFormat& rItemFmt, Type nData ); + + template< typename Type > + void writeDecPairItem( const String& rName, Type nData1, Type nData2, sal_Unicode cSep = ',' ); + template< typename Type > + void writeHexPairItem( const String& rName, Type nData1, Type nData2, sal_Unicode cSep = ',' ); + +private: + OutputRef mxOut; +}; + +typedef ::boost::shared_ptr< OutputObjectBase > OutputObjectRef; + +// ---------------------------------------------------------------------------- + +template< typename Type > +void OutputObjectBase::addNameToItem( Type nData, const NameListWrapper& rListWrp ) +{ + if( !rListWrp.isEmpty() ) + { + mxOut->contItem(); + mxOut->writeName( cfg(), nData, rListWrp ); + } +} + +template< typename Type > +void OutputObjectBase::writeNameItem( const String& rName, Type nData, const NameListWrapper& rListWrp ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeName( cfg(), nData, rListWrp ); +} + +template< typename Type > +void OutputObjectBase::writeDecItem( const String& rName, Type nData, const NameListWrapper& rListWrp ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeDec( nData ); + addNameToItem( nData, rListWrp ); +} + +template< typename Type > +void OutputObjectBase::writeHexItem( const String& rName, Type nData, const NameListWrapper& rListWrp ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeHex( nData ); + addNameToItem( nData, rListWrp ); +} + +template< typename Type > +void OutputObjectBase::writeShortHexItem( const String& rName, Type nData, const NameListWrapper& rListWrp ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeShortHex( nData ); + addNameToItem( nData, rListWrp ); +} + +template< typename Type > +void OutputObjectBase::writeBinItem( const String& rName, Type nData, const NameListWrapper& rListWrp ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeBin( nData ); + addNameToItem( nData, rListWrp ); +} + +template< typename Type > +void OutputObjectBase::writeFixItem( const String& rName, Type nData, const NameListWrapper& rListWrp ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeFix( nData ); + addNameToItem( nData, rListWrp ); +} + +template< typename Type > +void OutputObjectBase::writeDecBoolItem( const String& rName, Type nData, const NameListWrapper& rListWrp ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeDec( nData ); + aItem.cont(); + mxOut->writeBool( nData != 0 ); + addNameToItem( nData, rListWrp ); +} + +template< typename Type > +void OutputObjectBase::writeValueItem( const String& rName, Type nData, FormatType eFmtType, const NameListWrapper& rListWrp ) +{ + if( eFmtType == FORMATTYPE_BOOL ) + writeDecBoolItem( rName, nData, rListWrp ); + else + { + ItemGuard aItem( *mxOut, rName ); + mxOut->writeValue( nData, eFmtType ); + addNameToItem( nData, rListWrp ); + } +} + +template< typename Type > +void OutputObjectBase::writeValueItem( const ItemFormat& rItemFmt, Type nData ) +{ + ::rtl::OString aNameUtf8 = StringHelper::convertToUtf8( rItemFmt.maItemName ); + writeValueItem( aNameUtf8.getStr(), nData, rItemFmt.meFmtType, rItemFmt.maListName ); +} + +template< typename Type > +void OutputObjectBase::writeDecPairItem( const String& rName, Type nData1, Type nData2, sal_Unicode cSep ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeDec( nData1 ); + mxOut->writeChar( cSep ); + mxOut->writeDec( nData2 ); +} + +template< typename Type > +void OutputObjectBase::writeHexPairItem( const String& rName, Type nData1, Type nData2, sal_Unicode cSep ) +{ + ItemGuard aItem( *mxOut, rName ); + mxOut->writeHex( nData1 ); + mxOut->writeChar( cSep ); + mxOut->writeHex( nData2 ); +} + +// ============================================================================ +// ============================================================================ + +class InputObjectBase : public OutputObjectBase +{ +public: + virtual ~InputObjectBase(); + + // ------------------------------------------------------------------------ +protected: + inline explicit InputObjectBase() {} + + using OutputObjectBase::construct; + void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); + void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const OutputRef& rxOut ); + void construct( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxStrm ); + void construct( const InputObjectBase& rParent ); + + virtual bool implIsValid() const; + + // ------------------------------------------------------------------------ + + inline BinaryInputStream& in() const { return *mxStrm; } + ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + getXInputStream() const; + + // ------------------------------------------------------------------------ + + void skipBlock( sal_Int64 nBytes, bool bShowSize = true ); + void dumpRawBinary( sal_Int64 nBytes, bool bShowOffset = true, bool bStream = false ); + + void dumpBinary( const String& rName, sal_Int64 nBytes, bool bShowOffset = true ); + void dumpRemaining( sal_Int64 nBytes ); + void dumpRemainingTo( sal_Int64 nPos ); + void dumpRemainingStream(); + + void dumpArray( const String& rName, sal_Int32 nBytes, sal_Unicode cSep = OOX_DUMP_LISTSEP ); + inline void dumpUnused( sal_Int32 nBytes ) { dumpArray( OOX_DUMP_UNUSED, nBytes ); } + inline void dumpUnknown( sal_Int32 nBytes ) { dumpArray( OOX_DUMP_UNKNOWN, nBytes ); } + + sal_Unicode dumpChar( const String& rName, rtl_TextEncoding eTextEnc ); + sal_Unicode dumpUnicode( const String& rName ); + + ::rtl::OUString dumpCharArray( const String& rName, sal_Int32 nLen, rtl_TextEncoding eTextEnc, bool bHideTrailingNul = false ); + ::rtl::OUString dumpUnicodeArray( const String& rName, sal_Int32 nLen, bool bHideTrailingNul = false ); + + ::rtl::OUString dumpNullCharArray( const String& rName, rtl_TextEncoding eTextEnc ); + ::rtl::OUString dumpNullUnicodeArray( const String& rName ); + + double dumpRk( const String& rName = EMPTY_STRING ); + sal_Int32 dumpColorABGR( const String& rName = EMPTY_STRING ); + ::com::sun::star::util::DateTime dumpFileTime( const String& rName = EMPTY_STRING ); + ::rtl::OUString dumpGuid( const String& rName = EMPTY_STRING ); + + void dumpItem( const ItemFormat& rItemFmt ); + + template< typename Type > + Type dumpName( const String& rName, const NameListWrapper& rListWrp ); + template< typename Type > + Type dumpDec( const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + Type dumpHex( const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + Type dumpBin( const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + Type dumpFix( const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + Type dumpBool( const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + Type dumpValue( const ItemFormat& rItemFmt ); + + template< typename Type1, typename Type2 > + Type1 dumpName( bool bType1, const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type1, typename Type2 > + Type1 dumpDec( bool bType1, const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type1, typename Type2 > + Type1 dumpHex( bool bType1, const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type1, typename Type2 > + Type1 dumpBin( bool bType1, const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type1, typename Type2 > + Type1 dumpFix( bool bType1, const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type1, typename Type2 > + Type1 dumpBool( bool bType1, const String& rName, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type1, typename Type2 > + Type1 dumpValue( bool bType1, const ItemFormat& rItemFmt ); + + template< typename Type > + void dumpDecPair( const String& rName, sal_Unicode cSep = ',' ); + template< typename Type > + void dumpHexPair( const String& rName, sal_Unicode cSep = ',' ); + +private: + BinaryInputStreamRef mxStrm; +}; + +typedef ::boost::shared_ptr< InputObjectBase > InputObjectRef; + +// ---------------------------------------------------------------------------- + +template< typename Type > +Type InputObjectBase::dumpName( const String& rName, const NameListWrapper& rListWrp ) +{ + Type nData; + *mxStrm >> nData; + writeNameItem( rName, nData, rListWrp ); + return nData; +} + +template< typename Type > +Type InputObjectBase::dumpDec( const String& rName, const NameListWrapper& rListWrp ) +{ + Type nData; + *mxStrm >> nData; + writeDecItem( rName, nData, rListWrp ); + return nData; +} + +template< typename Type > +Type InputObjectBase::dumpHex( const String& rName, const NameListWrapper& rListWrp ) +{ + Type nData; + *mxStrm >> nData; + writeHexItem( rName, nData, rListWrp ); + return nData; +} + +template< typename Type > +Type InputObjectBase::dumpBin( const String& rName, const NameListWrapper& rListWrp ) +{ + Type nData; + *mxStrm >> nData; + writeBinItem( rName, nData, rListWrp ); + return nData; +} + +template< typename Type > +Type InputObjectBase::dumpFix( const String& rName, const NameListWrapper& rListWrp ) +{ + Type nData; + *mxStrm >> nData; + writeFixItem( rName, nData, rListWrp ); + return nData; +} + +template< typename Type > +Type InputObjectBase::dumpBool( const String& rName, const NameListWrapper& rListWrp ) +{ + Type nData; + *mxStrm >> nData; + writeDecBoolItem( rName, nData, rListWrp ); + return nData; +} + +template< typename Type > +Type InputObjectBase::dumpValue( const ItemFormat& rItemFmt ) +{ + Type nData; + *mxStrm >> nData; + writeValueItem( rItemFmt, nData ); + return nData; +} + +template< typename Type1, typename Type2 > +Type1 InputObjectBase::dumpName( bool bType1, const String& rName, const NameListWrapper& rListWrp ) +{ + return bType1 ? dumpName< Type1 >( rName, rListWrp ) : static_cast< Type1 >( dumpName< Type2 >( rName, rListWrp ) ); +} + +template< typename Type1, typename Type2 > +Type1 InputObjectBase::dumpDec( bool bType1, const String& rName, const NameListWrapper& rListWrp ) +{ + return bType1 ? dumpDec< Type1 >( rName, rListWrp ) : static_cast< Type1 >( dumpDec< Type2 >( rName, rListWrp ) ); +} + +template< typename Type1, typename Type2 > +Type1 InputObjectBase::dumpHex( bool bType1, const String& rName, const NameListWrapper& rListWrp ) +{ + return bType1 ? dumpHex< Type1 >( rName, rListWrp ) : static_cast< Type1 >( dumpHex< Type2 >( rName, rListWrp ) ); +} + +template< typename Type1, typename Type2 > +Type1 InputObjectBase::dumpBin( bool bType1, const String& rName, const NameListWrapper& rListWrp ) +{ + return bType1 ? dumpBin< Type1 >( rName, rListWrp ) : static_cast< Type1 >( dumpBin< Type2 >( rName, rListWrp ) ); +} + +template< typename Type1, typename Type2 > +Type1 InputObjectBase::dumpFix( bool bType1, const String& rName, const NameListWrapper& rListWrp ) +{ + return bType1 ? dumpFix< Type1 >( rName, rListWrp ) : static_cast< Type1 >( dumpFix< Type2 >( rName, rListWrp ) ); +} + +template< typename Type1, typename Type2 > +Type1 InputObjectBase::dumpBool( bool bType1, const String& rName, const NameListWrapper& rListWrp ) +{ + return bType1 ? dumpBool< Type1 >( rName, rListWrp ) : static_cast< Type1 >( dumpBool< Type2 >( rName, rListWrp ) ); +} + +template< typename Type1, typename Type2 > +Type1 InputObjectBase::dumpValue( bool bType1, const ItemFormat& rItemFmt ) +{ + return bType1 ? dumpValue< Type1 >( rItemFmt ) : static_cast< Type1 >( dumpValue< Type2 >( rItemFmt ) ); +} + +template< typename Type > +void InputObjectBase::dumpDecPair( const String& rName, sal_Unicode cSep ) +{ + Type nData1, nData2; + *mxStrm >> nData1 >> nData2; + writeDecPairItem( rName, nData1, nData2, cSep ); +} + +template< typename Type > +void InputObjectBase::dumpHexPair( const String& rName, sal_Unicode cSep ) +{ + Type nData1, nData2; + *mxStrm >> nData1 >> nData2; + writeHexPairItem( rName, nData1, nData2, cSep ); +} + +// ============================================================================ +// ============================================================================ + +class BinaryStreamObject : public InputObjectBase +{ +public: + explicit BinaryStreamObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName ); + + explicit BinaryStreamObject( + const OutputObjectBase& rParent, + const BinaryInputStreamRef& rxStrm ); + +protected: + void dumpBinaryStream( bool bShowOffset = true ); + + virtual void implDump(); +}; + +// ============================================================================ + +class TextStreamObject : public InputObjectBase +{ +public: + explicit TextStreamObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + rtl_TextEncoding eTextEnc, + const ::rtl::OUString& rSysFileName ); + + explicit TextStreamObject( + const OutputObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + rtl_TextEncoding eTextEnc ); + +protected: + virtual void implDump(); + virtual void implDumpLine( const ::rtl::OUString& rLine, sal_uInt32 nLine ); + +private: + bool readCharLine( ::rtl::OUString& orLine, sal_Unicode& orcNextLineChar ); + bool readUcs2Line( ::rtl::OUString& orLine, sal_Unicode& orcNextLineChar ); + bool readLine( ::rtl::OUString& orLine, sal_Unicode& orcNextLineChar ); + +private: + rtl_TextEncoding meTextEnc; +}; + +// ============================================================================ + +class XmlStreamObject : public TextStreamObject +{ +public: + explicit XmlStreamObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName ); + +protected: + virtual void implDump(); + virtual void implDumpLine( const ::rtl::OUString& rLine, sal_uInt32 nLine ); + +private: + ::rtl::OUString maIncompleteLine; +}; + +// ============================================================================ +// ============================================================================ + +class RecordObjectBase : public InputObjectBase +{ +protected: + inline explicit RecordObjectBase() {} + + using InputObjectBase::construct; + void construct( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxBaseStrm, + const ::rtl::OUString& rSysFileName, + const BinaryInputStreamRef& rxRecStrm, + const String& rRecNames, + const String& rSimpleRecs = EMPTY_STRING ); + void construct( + const OutputObjectBase& rParent, + const BinaryInputStreamRef& rxBaseStrm, + const BinaryInputStreamRef& rxRecStrm, + const String& rRecNames, + const String& rSimpleRecs = EMPTY_STRING ); + + inline sal_Int64 getRecPos() const { return mnRecPos; } + inline sal_Int64 getRecId() const { return mnRecId; } + inline sal_Int64 getRecSize() const { return mnRecSize; } + inline NameListRef getRecNames() const { return maRecNames.getNameList( cfg() ); } + + inline void setBinaryOnlyMode( bool bBinaryOnly ) { mbBinaryOnly = bBinaryOnly; } + inline bool isBinaryOnlyMode() const { return mbBinaryOnly; } + + virtual bool implIsValid() const; + virtual void implDump(); + + virtual bool implStartRecord( BinaryInputStream& rBaseStrm, sal_Int64& ornRecPos, sal_Int64& ornRecId, sal_Int64& ornRecSize ) = 0; + virtual void implWriteExtHeader(); + virtual void implDumpRecordBody(); + +private: + void constructRecObjBase( + const BinaryInputStreamRef& rxBaseStrm, + const String& rRecNames, + const String& rSimpleRecs ); + + void writeHeader(); + +private: + BinaryInputStreamRef mxBaseStrm; + NameListWrapper maRecNames; + NameListWrapper maSimpleRecs; + sal_Int64 mnRecPos; + sal_Int64 mnRecId; + sal_Int64 mnRecSize; + bool mbShowRecPos; + bool mbBinaryOnly; +}; + +// ============================================================================ + +class SequenceRecordObjectBase : public RecordObjectBase +{ +protected: + inline explicit SequenceRecordObjectBase() : mxRecData( new StreamDataSequence ) {} + + inline StreamDataSequence& getRecordDataSequence() { return *mxRecData; } + + using RecordObjectBase::construct; + void construct( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxBaseStrm, + const ::rtl::OUString& rSysFileName, + const String& rRecNames, + const String& rSimpleRecs = EMPTY_STRING ); + void construct( + const OutputObjectBase& rParent, + const BinaryInputStreamRef& rxBaseStrm, + const String& rRecNames, + const String& rSimpleRecs = EMPTY_STRING ); + + virtual bool implStartRecord( BinaryInputStream& rBaseStrm, sal_Int64& ornRecPos, sal_Int64& ornRecId, sal_Int64& ornRecSize ); + virtual bool implReadRecordHeader( BinaryInputStream& rBaseStrm, sal_Int64& ornRecId, sal_Int64& ornRecSize ) = 0; + +private: + typedef ::boost::shared_ptr< StreamDataSequence > StreamDataSeqRef; + StreamDataSeqRef mxRecData; +}; + +// ============================================================================ +// ============================================================================ + +/** Base class for a file dumper. Derived classes implement the implDump() + function to add functionality. + */ +class DumperBase : public ObjectBase +{ +public: + virtual ~DumperBase(); + + bool isImportEnabled() const; + bool isImportCancelled() const; + +protected: + inline explicit DumperBase() {} + + using ObjectBase::construct; + void construct( const ConfigRef& rxConfig ); +}; + +// ============================================================================ +// ============================================================================ + +} // namespace dump +} // namespace oox + +#define OOX_DUMP_FILE( DumperClassName ) \ +do { \ + DumperClassName aDumper( *this ); \ + aDumper.dump(); \ + bool bCancelled = aDumper.isImportCancelled(); \ + if( !aDumper.isImportEnabled() || bCancelled ) \ + return aDumper.isValid() && !bCancelled; \ +} while( false ) + +#else // OOX_INCLUDE_DUMPER + +#define OOX_DUMP_FILE( DumperClassName ) (void)0 + +#endif // OOX_INCLUDE_DUMPER +#endif + diff --git a/oox/inc/oox/dump/oledumper.hxx b/oox/inc/oox/dump/oledumper.hxx new file mode 100644 index 000000000000..539ca2a412d1 --- /dev/null +++ b/oox/inc/oox/dump/oledumper.hxx @@ -0,0 +1,767 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DUMP_OLEDUMPER_HXX +#define OOX_DUMP_OLEDUMPER_HXX + +#include "oox/helper/storagebase.hxx" +#include "oox/dump/dumperbase.hxx" + +#if OOX_INCLUDE_DUMPER + +namespace com { namespace sun { namespace star { + namespace io { class XInputStream; } +} } } + +namespace oox { +namespace dump { + +// ============================================================================ +// ============================================================================ + +class StdFontObject : public InputObjectBase +{ +public: + explicit StdFontObject( const InputObjectBase& rParent ); + +protected: + virtual void implDump(); +}; + +// ============================================================================ + +class StdPicObject : public InputObjectBase +{ +public: + explicit StdPicObject( const InputObjectBase& rParent ); + +protected: + virtual void implDump(); +}; + +// ============================================================================ + +class StdHlinkObject : public InputObjectBase +{ +public: + explicit StdHlinkObject( const InputObjectBase& rParent ); + +protected: + virtual void implDump(); + +private: + ::rtl::OUString dumpHyperlinkString( const String& rName, bool bUnicode ); + + bool dumpGuidAndMoniker(); + void dumpUrlMoniker(); + void dumpFileMoniker(); + void dumpItemMoniker(); + void dumpAntiMoniker(); + void dumpCompositeMoniker(); +}; + +// ============================================================================ +// ============================================================================ + +class OlePropertyStreamObject : public BinaryStreamObject +{ +public: + explicit OlePropertyStreamObject( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); + +protected: + virtual void implDump(); + +private: + void dumpSection( const ::rtl::OUString& rGuid, sal_uInt32 nStartPos ); + + void dumpProperty( sal_Int32 nPropId, sal_uInt32 nStartPos ); + void dumpCodePageProperty( sal_uInt32 nStartPos ); + void dumpDictionaryProperty( sal_uInt32 nStartPos ); + + void dumpPropertyContents( sal_Int32 nPropId ); + void dumpPropertyValue( sal_Int32 nPropId, sal_Int32 nBaseType ); + + sal_Int32 dumpPropertyType(); + void dumpBlob( const String& rName ); + ::rtl::OUString dumpString8( const String& rName ); + ::rtl::OUString dumpCharArray8( const String& rName, sal_Int32 nLen ); + ::rtl::OUString dumpString16( const String& rName ); + ::rtl::OUString dumpCharArray16( const String& rName, sal_Int32 nLen ); + + bool startElement( sal_uInt32 nStartPos ); + void writeSectionHeader( const ::rtl::OUString& rGuid, sal_uInt32 nStartPos ); + void writePropertyHeader( sal_Int32 nPropId, sal_uInt32 nStartPos ); + +private: + NameListRef mxPropIds; + rtl_TextEncoding meTextEnc; + bool mbIsUnicode; +}; + +// ============================================================================ + +class OleStorageObject : public StorageObjectBase +{ +public: + explicit OleStorageObject( const ObjectBase& rParent, const StorageRef& rxStrg, const ::rtl::OUString& rSysPath ); + +protected: + inline explicit OleStorageObject() {} + + using StorageObjectBase::construct; + void construct( const ObjectBase& rParent, const StorageRef& rxStrg, const ::rtl::OUString& rSysPath ); + void construct( const ObjectBase& rParent ); + + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); +}; + +// ============================================================================ +// ============================================================================ + +struct OcxFormSiteInfo +{ + ::rtl::OUString maProgId; + sal_Int32 mnId; + sal_uInt32 mnLength; + bool mbInStream; + + inline explicit OcxFormSiteInfo() : mnId( 0 ), mnLength( 0 ), mbInStream( false ) {} +}; + +typedef ::std::vector< OcxFormSiteInfo > OcxFormSiteInfoVector; + +// ---------------------------------------------------------------------------- + +struct OcxFormSharedData +{ + OUStringVector maClassInfoProgIds; + OcxFormSiteInfoVector maSiteInfos; +}; + +// ============================================================================ +// ============================================================================ + +class OcxPropertyObjectBase : public InputObjectBase +{ +protected: + inline explicit OcxPropertyObjectBase() {} + + using InputObjectBase::construct; + void construct( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName, + const String& rPropNameList, + bool b64BitPropFlags = false ); + void construct( + const OutputObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const String& rPropNameList, + bool b64BitPropFlags = false ); + void construct( + const InputObjectBase& rParent, + const String& rPropNameList, + bool b64BitPropFlags = false ); + + virtual bool implIsValid() const; + virtual void implDump(); + + virtual void implDumpShortProperties(); + virtual void implDumpExtended(); + + bool ensureValid( bool bCondition = true ); + + template< typename Type > + void alignInput(); + + void setAlignAnchor(); + bool startNextProperty(); + ::rtl::OUString getPropertyName() const; + + template< typename Type > + Type dumpDecProperty( Type nDefault, const NameListWrapper& rListWrp = NO_LIST ); + template< typename Type > + Type dumpHexProperty( Type nDefault, const NameListWrapper& rListWrp = NO_LIST ); + + inline bool dumpBoolProperty() { return startNextProperty(); } + inline sal_Int32 dumpHmmProperty() { return dumpDecProperty< sal_Int32 >( 0, "CONV-HMM-TO-CM" ); } + inline sal_uInt8 dumpMousePtrProperty() { return dumpDecProperty< sal_uInt8 >( 0, "OCX-MOUSEPTR" ); } + template< typename Type > + inline Type dumpBorderStyleProperty( Type nDefault ) { return dumpDecProperty< Type >( nDefault, "OCX-BORDERSTYLE" ); } + template< typename Type > + inline Type dumpSpecialEffectProperty( Type nDefault ) { return dumpDecProperty< Type >( nDefault, "OCX-SPECIALEFFECT" ); } + inline sal_uInt32 dumpEnabledProperty() { return dumpDecProperty< sal_uInt32 >( 1, "OCX-ENABLED" ); } + inline sal_Int32 dumpOrientationProperty() { return dumpDecProperty< sal_Int32 >( -1, "OCX-ORIENTATION" ); } + inline sal_Int32 dumpDelayProperty() { return dumpDecProperty< sal_Int32 >( 50, "OCX-CONV-MS" ); } + inline sal_uInt32 dumpImagePosProperty() { return dumpHexProperty< sal_uInt32 >( 0x00070001, "OCX-IMAGEPOS" ); } + inline sal_uInt8 dumpImageSizeModeProperty() { return dumpDecProperty< sal_uInt8 >( 0, "OCX-IMAGESIZEMODE" ); } + inline sal_uInt8 dumpImageAlignProperty() { return dumpDecProperty< sal_uInt8 >( 2, "OCX-IMAGEALIGN" ); } + + sal_uInt32 dumpFlagsProperty( sal_uInt32 nDefault, const sal_Char* pcNameList = "OCX-FLAGS" ); + sal_uInt32 dumpColorProperty( sal_uInt32 nDefault ); + sal_Unicode dumpUnicodeProperty(); + void dumpUnknownProperty(); + + void dumpPosProperty(); + void dumpSizeProperty(); + void dumpGuidProperty( ::rtl::OUString* pValue = 0 ); + void dumpStringProperty( ::rtl::OUString* pValue = 0 ); + void dumpStringArrayProperty(); + void dumpStreamProperty(); + + void dumpEmbeddedFont(); + void dumpToPosition( sal_Int64 nPos ); + +private: + void constructOcxPropObj( const String& rPropNameList, bool b64BitPropFlags ); + + void dumpVersion(); + ::rtl::OUString dumpString( const String& rName, sal_uInt32 nSize, bool bArray ); + void dumpShortProperties(); + void dumpLargeProperties(); + +private: + struct LargeProperty + { + enum LargePropertyType { PROPTYPE_POS, PROPTYPE_SIZE, PROPTYPE_GUID, PROPTYPE_STRING, PROPTYPE_STRINGARRAY }; + + LargePropertyType mePropType; + ::rtl::OUString maItemName; + sal_uInt32 mnDataSize; + ::rtl::OUString* mpItemValue; + inline explicit LargeProperty( LargePropertyType ePropType, const String& rItemName, sal_uInt32 nDataSize, ::rtl::OUString* pItemValue = 0 ) : + mePropType( ePropType ), maItemName( rItemName ), mnDataSize( nDataSize ), mpItemValue( pItemValue ) {} + }; + typedef ::std::vector< LargeProperty > LargePropertyVector; + + struct StreamProperty + { + ::rtl::OUString maItemName; + sal_uInt16 mnData; + inline explicit StreamProperty( const String& rItemName, sal_uInt16 nData ) : + maItemName( rItemName ), mnData( nData ) {} + }; + typedef ::std::vector< StreamProperty > StreamPropertyVector; + + LargePropertyVector maLargeProps; + StreamPropertyVector maStreamProps; + NameListRef mxPropNames; + sal_Int64 mnPropertiesStart; + sal_Int64 mnPropertiesEnd; + sal_Int64 mnPropFlags; + sal_Int64 mnCurrProp; + bool mb64BitPropFlags; + bool mbValid; +}; + +// ---------------------------------------------------------------------------- + +template< typename Type > +void OcxPropertyObjectBase::alignInput() +{ + in().skip( (sizeof( Type ) - ((in().tell() - mnPropertiesStart) % sizeof( Type ))) % sizeof( Type ) ); +} + +template< typename Type > +Type OcxPropertyObjectBase::dumpDecProperty( Type nDefault, const NameListWrapper& rListWrp ) +{ + if( startNextProperty() ) + { + alignInput< Type >(); + return dumpDec< Type >( getPropertyName(), rListWrp ); + } + return nDefault; +} + +template< typename Type > +Type OcxPropertyObjectBase::dumpHexProperty( Type nDefault, const NameListWrapper& rListWrp ) +{ + if( startNextProperty() ) + { + alignInput< Type >(); + return dumpHex< Type >( getPropertyName(), rListWrp ); + } + return nDefault; +} + +// ============================================================================ + +class OcxCFontNewObject : public OcxPropertyObjectBase +{ +public: + explicit OcxCFontNewObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); +}; + +// ============================================================================ + +class OcxColumnInfoObject : public OcxPropertyObjectBase +{ +public: + explicit OcxColumnInfoObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); +}; + +// ============================================================================ + +class OcxCommandButtonObject : public OcxPropertyObjectBase +{ +public: + explicit OcxCommandButtonObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); + virtual void implDumpExtended(); +}; + +// ============================================================================ + +class OcxMorphControlObject : public OcxPropertyObjectBase +{ +public: + explicit OcxMorphControlObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); + virtual void implDumpExtended(); + +private: + void dumpColumnInfos(); + +private: + sal_uInt16 mnColInfoCount; + sal_uInt8 mnCtrlType; +}; + +// ============================================================================ + +class OcxLabelObject : public OcxPropertyObjectBase +{ +public: + explicit OcxLabelObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); + virtual void implDumpExtended(); +}; + +// ============================================================================ + +class OcxImageObject : public OcxPropertyObjectBase +{ +public: + explicit OcxImageObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); +}; + +// ============================================================================ + +class OcxScrollBarObject : public OcxPropertyObjectBase +{ +public: + explicit OcxScrollBarObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); +}; + +// ============================================================================ + +class OcxSpinButtonObject : public OcxPropertyObjectBase +{ +public: + explicit OcxSpinButtonObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); +}; + +// ============================================================================ + +class OcxTabStripObject : public OcxPropertyObjectBase +{ +public: + explicit OcxTabStripObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); + virtual void implDumpExtended(); + +private: + sal_Int32 mnTabFlagCount; +}; + +// ============================================================================ + +class OcxControlObject : public InputObjectBase +{ +public: + explicit OcxControlObject( + const InputObjectBase& rParent, + const ::rtl::OUString& rProgId, + sal_Int64 nLength ); + +protected: + virtual void implDump(); + +private: + ::rtl::OUString maProgId; + sal_Int64 mnLength; +}; + +// ============================================================================ + +class OcxGuidControlObject : public InputObjectBase +{ +public: + explicit OcxGuidControlObject( + const InputObjectBase& rParent, + sal_Int64 nLength ); + explicit OcxGuidControlObject( + const OutputObjectBase& rParent, + const BinaryInputStreamRef& rxStrm ); + explicit OcxGuidControlObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName ); + +protected: + virtual void implDump(); + +private: + sal_Int64 mnLength; +}; + +// ============================================================================ + +class OcxControlsStreamObject : public InputObjectBase +{ +public: + explicit OcxControlsStreamObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName, + OcxFormSharedData& rFormData ); + +protected: + virtual void implDump(); + +private: + OcxFormSharedData& mrFormData; +}; + +// ============================================================================ +// ============================================================================ + +class OcxPageObject : public OcxPropertyObjectBase +{ +public: + explicit OcxPageObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); +}; + +// ============================================================================ + +class OcxMultiPageObject : public OcxPropertyObjectBase +{ +public: + explicit OcxMultiPageObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); + virtual void implDumpExtended(); + +private: + sal_Int32 mnPageCount; +}; + +// ============================================================================ + +class OcxMultiPageStreamObject : public InputObjectBase +{ +public: + explicit OcxMultiPageStreamObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName, + OcxFormSharedData& rFormData ); + +protected: + virtual void implDump(); + +private: + OcxFormSharedData& mrFormData; +}; + +// ============================================================================ +// ============================================================================ + +class OcxFormClassInfoObject : public OcxPropertyObjectBase +{ +public: + explicit OcxFormClassInfoObject( const InputObjectBase& rParent, OcxFormSharedData& rFormData ); + +protected: + virtual void implDumpShortProperties(); + +private: + OcxFormSharedData& mrFormData; +}; + +// ============================================================================ + +class OcxFormSiteObject : public OcxPropertyObjectBase +{ +public: + explicit OcxFormSiteObject( const InputObjectBase& rParent, OcxFormSharedData& rFormData ); + +protected: + virtual void implDumpShortProperties(); + +private: + OcxFormSharedData& mrFormData; +}; + +// ============================================================================ + +class OcxFormDesignExtObject : public OcxPropertyObjectBase +{ +public: + explicit OcxFormDesignExtObject( const InputObjectBase& rParent ); + +protected: + virtual void implDumpShortProperties(); +}; + +// ============================================================================ + +class OcxFormObject : public OcxPropertyObjectBase +{ +public: + explicit OcxFormObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName, + OcxFormSharedData& rFormData ); + +protected: + virtual void implDumpShortProperties(); + virtual void implDumpExtended(); + +private: + void dumpClassInfos(); + void dumpFormSites( sal_uInt32 nCount ); + void dumpSiteData(); + void dumpDesignExtender(); + +private: + OcxFormSharedData& mrFormData; + sal_uInt32 mnFlags; +}; + +// ============================================================================ + +class OcxFormStorageObject : public OleStorageObject +{ +public: + explicit OcxFormStorageObject( + const ObjectBase& rParent, + const StorageRef& rxStrg, + const ::rtl::OUString& rSysPath ); + +protected: + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); + + virtual void implDumpStorage( + const StorageRef& rxStrg, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rSysPath ); + +private: + bool isFormStorage( const ::rtl::OUString& rStrgPath ) const; + +private: + OcxFormSharedData maFormData; +}; + +// ============================================================================ +// ============================================================================ + +struct VbaSharedData +{ + typedef ::std::map< ::rtl::OUString, sal_Int32 > StreamOffsetMap; + + StreamOffsetMap maStrmOffsets; + rtl_TextEncoding meTextEnc; + + explicit VbaSharedData(); + + bool isModuleStream( const ::rtl::OUString& rStrmName ) const; + sal_Int32 getStreamOffset( const ::rtl::OUString& rStrmName ) const; +}; + +// ============================================================================ + +class VbaDirStreamObject : public SequenceRecordObjectBase +{ +public: + explicit VbaDirStreamObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName, + VbaSharedData& rVbaData ); + +protected: + virtual bool implIsValid() const; + virtual bool implReadRecordHeader( BinaryInputStream& rBaseStrm, sal_Int64& ornRecId, sal_Int64& ornRecSize ); + virtual void implDumpRecordBody(); + +private: + ::rtl::OUString dumpByteString( const String& rName = EMPTY_STRING ); + ::rtl::OUString dumpUniString( const String& rName = EMPTY_STRING ); + + ::rtl::OUString dumpByteStringWithLength( const String& rName = EMPTY_STRING ); + +private: + VbaSharedData& mrVbaData; + BinaryInputStreamRef mxInStrm; + ::rtl::OUString maCurrStream; + sal_Int32 mnCurrOffset; +}; + +// ============================================================================ + +class VbaModuleStreamObject : public InputObjectBase +{ +public: + explicit VbaModuleStreamObject( + const ObjectBase& rParent, + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rSysFileName, + VbaSharedData& rVbaData, + sal_Int32 nStrmOffset ); + +protected: + virtual void implDump(); + +private: + VbaSharedData& mrVbaData; + sal_Int32 mnStrmOffset; +}; + +// ============================================================================ + +class VbaStorageObject : public OleStorageObject +{ +public: + explicit VbaStorageObject( + const ObjectBase& rParent, + const StorageRef& rxStrg, + const ::rtl::OUString& rSysPath, + VbaSharedData& rVbaData ); + +protected: + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); + +private: + VbaSharedData& mrVbaData; +}; + +// ============================================================================ + +class VbaFormStorageObject : public OcxFormStorageObject +{ +public: + explicit VbaFormStorageObject( + const ObjectBase& rParent, + const StorageRef& rxStrg, + const ::rtl::OUString& rSysPath, + VbaSharedData& rVbaData ); + +protected: + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); + +private: + VbaSharedData& mrVbaData; +}; + +// ============================================================================ + +class VbaProjectStorageObject : public OleStorageObject +{ +public: + explicit VbaProjectStorageObject( const ObjectBase& rParent, const StorageRef& rxStrg, const ::rtl::OUString& rSysPath ); + +protected: + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); + + virtual void implDumpStorage( + const StorageRef& rxStrg, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rSysPath ); + +private: + VbaSharedData maVbaData; +}; + +// ============================================================================ +// ============================================================================ + +} // namespace dump +} // namespace oox + +#endif +#endif + diff --git a/oox/inc/oox/dump/pptxdumper.hxx b/oox/inc/oox/dump/pptxdumper.hxx new file mode 100644 index 000000000000..535c7ceadc36 --- /dev/null +++ b/oox/inc/oox/dump/pptxdumper.hxx @@ -0,0 +1,78 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DUMP_PPTXDUMPER_HXX +#define OOX_DUMP_PPTXDUMPER_HXX + +#include "oox/dump/dumperbase.hxx" + +#if OOX_INCLUDE_DUMPER + +namespace oox { +namespace dump { +namespace pptx { + +// ============================================================================ + +class RootStorageObject : public StorageObjectBase +{ +public: + explicit RootStorageObject( const DumperBase& rParent ); + +protected: + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); +}; + +// ============================================================================ + +class Dumper : public DumperBase +{ +public: + explicit Dumper( const ::oox::core::FilterBase& rFilter ); + + explicit Dumper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm, + const ::rtl::OUString& rSysFileName ); + +protected: + virtual void implDump(); +}; + +// ============================================================================ + +} // namespace pptx +} // namespace dump +} // namespace oox + +#endif +#endif + diff --git a/oox/inc/oox/dump/xlsbdumper.hxx b/oox/inc/oox/dump/xlsbdumper.hxx new file mode 100644 index 000000000000..95723f6b8d4e --- /dev/null +++ b/oox/inc/oox/dump/xlsbdumper.hxx @@ -0,0 +1,259 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DUMP_XLSBDUMPER_HXX +#define OOX_DUMP_XLSBDUMPER_HXX + +#include "oox/dump/dumperbase.hxx" +#include "oox/helper/recordinputstream.hxx" + +#if OOX_INCLUDE_DUMPER + +namespace oox { namespace xls { + class FontPortionModelList; + class PhoneticPortionModelList; + struct FunctionInfo; + class FunctionProvider; +} } + +namespace oox { +namespace dump { +namespace xlsb { + +// ============================================================================ + +class RecordObjectBase : public SequenceRecordObjectBase +{ +protected: + explicit RecordObjectBase(); + virtual ~RecordObjectBase(); + + using SequenceRecordObjectBase::construct; + void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); + void construct( const RecordObjectBase& rParent ); + + virtual bool implReadRecordHeader( BinaryInputStream& rBaseStrm, sal_Int64& ornRecId, sal_Int64& ornRecSize ); + + ::rtl::OUString getErrorName( sal_uInt8 nErrCode ) const; + + // ------------------------------------------------------------------------ + + void readAddress( Address& orAddress ); + void readRange( Range& orRange ); + void readRangeList( RangeList& orRanges ); + + // ------------------------------------------------------------------------ + + void writeBooleanItem( const String& rName, sal_uInt8 nBool ); + void writeErrorCodeItem( const String& rName, sal_uInt8 nErrCode ); + + void writeFontPortions( const ::oox::xls::FontPortionModelList& rPortions ); + void writePhoneticPortions( const ::oox::xls::PhoneticPortionModelList& rPhonetics ); + + // ------------------------------------------------------------------------ + + sal_uInt8 dumpBoolean( const String& rName = EMPTY_STRING ); + sal_uInt8 dumpErrorCode( const String& rName = EMPTY_STRING ); + ::rtl::OUString dumpString( const String& rName = EMPTY_STRING, bool bRich = false, bool b32BitLen = true ); + void dumpColor( const String& rName = EMPTY_STRING ); + ::com::sun::star::util::DateTime dumpPivotDateTime( const String& rName = EMPTY_STRING ); + + sal_Int32 dumpColIndex( const String& rName = EMPTY_STRING ); + sal_Int32 dumpRowIndex( const String& rName = EMPTY_STRING ); + sal_Int32 dumpColRange( const String& rName = EMPTY_STRING ); + sal_Int32 dumpRowRange( const String& rName = EMPTY_STRING ); + + Address dumpAddress( const String& rName = EMPTY_STRING ); + Range dumpRange( const String& rName = EMPTY_STRING ); + void dumpRangeList( const String& rName = EMPTY_STRING ); + + // ------------------------------------------------------------------------ +private: + bool readCompressedInt( BinaryInputStream& rStrm, sal_Int32& ornValue ); + +private: + typedef ::boost::shared_ptr< RecordInputStream > RecordInputStreamRef; + + RecordInputStreamRef mxStrm; + NameListRef mxErrCodes; +}; + +// ============================================================================ + +class FormulaObject : public RecordObjectBase +{ +public: + explicit FormulaObject( const RecordObjectBase& rParent ); + virtual ~FormulaObject(); + + void dumpCellFormula( const String& rName = EMPTY_STRING ); + void dumpNameFormula( const String& rName = EMPTY_STRING ); + +protected: + virtual void implDump(); + +private: + void constructFmlaObj(); + + void dumpFormula( const String& rName, bool bNameMode ); + + TokenAddress createTokenAddress( sal_Int32 nCol, sal_Int32 nRow, bool bRelC, bool bRelR, bool bNameMode ) const; + ::rtl::OUString createRef( const ::rtl::OUString& rData ) const; + ::rtl::OUString createName( sal_Int32 nNameId ) const; + ::rtl::OUString createPlaceHolder( size_t nIdx ) const; + ::rtl::OUString createPlaceHolder() const; + + ::rtl::OUString writeFuncIdItem( sal_uInt16 nFuncId, const ::oox::xls::FunctionInfo** oppFuncInfo = 0 ); + + sal_Int32 dumpTokenCol( const String& rName, bool& rbRelC, bool& rbRelR ); + sal_Int32 dumpTokenRow( const String& rName ); + TokenAddress dumpTokenAddress( bool bNameMode ); + TokenRange dumpTokenRange( bool bNameMode ); + + sal_Int16 readTokenRefId(); + ::rtl::OUString dumpTokenRefId(); + + void dumpIntToken(); + void dumpDoubleToken(); + void dumpStringToken(); + void dumpBoolToken(); + void dumpErrorToken(); + void dumpMissArgToken(); + + void dumpArrayToken( const ::rtl::OUString& rTokClass ); + void dumpNameToken( const ::rtl::OUString& rTokClass ); + void dumpNameXToken( const ::rtl::OUString& rTokClass ); + void dumpRefToken( const ::rtl::OUString& rTokClass, bool bNameMode ); + void dumpAreaToken( const ::rtl::OUString& rTokClass, bool bNameMode ); + void dumpRefErrToken( const ::rtl::OUString& rTokClass, bool bArea ); + void dumpRef3dToken( const ::rtl::OUString& rTokClass, bool bNameMode ); + void dumpArea3dToken( const ::rtl::OUString& rTokClass, bool bNameMode ); + void dumpRefErr3dToken( const ::rtl::OUString& rTokClass, bool bArea ); + void dumpMemFuncToken( const ::rtl::OUString& rTokClass ); + void dumpMemAreaToken( const ::rtl::OUString& rTokClass, bool bAddData ); + + void dumpExpToken( const String& rName ); + void dumpUnaryOpToken( const String& rLOp, const String& rROp ); + void dumpBinaryOpToken( const String& rOp ); + void dumpFuncToken( const ::rtl::OUString& rTokClass ); + void dumpFuncVarToken( const ::rtl::OUString& rTokClass ); + bool dumpTableToken(); + bool dumpAttrToken(); + + void dumpAddTokenData(); + void dumpAddDataExp( size_t nIdx ); + void dumpAddDataArray( size_t nIdx ); + void dumpAddDataMemArea( size_t nIdx ); + + void dumpaddDataArrayHeader( sal_Int32& rnCols, sal_Int32& rnRows ); + ::rtl::OUString dumpaddDataArrayValue(); + +private: + enum AddDataType { ADDDATA_EXP, ADDDATA_ARRAY, ADDDATA_MEMAREA }; + + typedef ::boost::shared_ptr< FormulaStack > FormulaStackRef; + typedef ::boost::shared_ptr< ::oox::xls::FunctionProvider > FuncProvRef; + typedef ::std::vector< AddDataType > AddDataTypeVec; + + NameListRef mxTokens; + NameListRef mxClasses; + NameListRef mxRelFlags; + NameListRef mxAttrTypes; + NameListRef mxSpTypes; + sal_Int32 mnColCount; + sal_Int32 mnRowCount; + + FormulaStackRef mxStack; + FuncProvRef mxFuncProv; + AddDataTypeVec maAddData; + ::rtl::OUString maRefPrefix; + ::rtl::OUString maName; + sal_Int32 mnSize; + bool mbNameMode; +}; + +// ============================================================================ + +class RecordStreamObject : public RecordObjectBase +{ +public: + explicit RecordStreamObject( ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); + +protected: + virtual bool implIsValid() const; + virtual void implDumpRecordBody(); + +private: + void dumpGradientHead(); + void dumpCellHeader( bool bWithColumn ); + +private: + typedef ::boost::shared_ptr< FormulaObject > FormulaObjectRef; + + FormulaObjectRef mxFmlaObj; +}; + +// ============================================================================ + +class RootStorageObject : public StorageObjectBase +{ +public: + explicit RootStorageObject( const DumperBase& rParent ); + +protected: + virtual void implDumpStream( + const BinaryInputStreamRef& rxStrm, + const ::rtl::OUString& rStrgPath, + const ::rtl::OUString& rStrmName, + const ::rtl::OUString& rSysFileName ); +}; + +// ============================================================================ + +class Dumper : public DumperBase +{ +public: + explicit Dumper( const ::oox::core::FilterBase& rFilter ); + + explicit Dumper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm, + const ::rtl::OUString& rSysFileName ); + +protected: + virtual void implDump(); +}; + +// ============================================================================ + +} // namespace xlsb +} // namespace dump +} // namespace oox + +#endif +#endif + diff --git a/oox/inc/oox/export/drawingml.hxx b/oox/inc/oox/export/drawingml.hxx new file mode 100644 index 000000000000..0859b15136d9 --- /dev/null +++ b/oox/inc/oox/export/drawingml.hxx @@ -0,0 +1,115 @@ +#ifndef _OOX_EXPORT_DRAWINGML_HXX_ +#define _OOX_EXPORT_DRAWINGML_HXX_ + +#include <oox/dllapi.h> +#include <sax/fshelper.hxx> +#include <rtl/strbuf.hxx> +#include <com/sun/star/awt/FontDescriptor.hpp> +#include <com/sun/star/uno/XReference.hpp> +#include <tools/poly.hxx> +#include <svx/escherex.hxx> + +class Graphic; +class String; + +namespace com { namespace sun { namespace star { +namespace beans { + class XPropertySet; + class XPropertyState; +} +namespace drawing { + class XShape; +} +namespace text { + class XTextContent; + class XTextRange; +} +}}} + +namespace oox { +namespace core { + class XmlFilterBase; +} + +namespace drawingml { + +class OOX_DLLPUBLIC DrawingML { +public: + enum DocumentType { DOCUMENT_DOCX, DOCUMENT_PPTX, DOCUMENT_XLSX }; + +private: + ::sax_fastparser::FSHelperPtr mpFS; + ::oox::core::XmlFilterBase* mpFB; + + static int mnImageCounter; + + /// To specify where write eg. the images to (like 'ppt', or 'word' - according to the OPC). + DocumentType meDocumentType; + +protected: + ::com::sun::star::uno::Any mAny; + + bool GetProperty( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, String aName ); + bool GetPropertyAndState( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState > rXPropState, + String aName, ::com::sun::star::beans::PropertyState& eState ); + const char* GetFieldType( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > rRun ); + + rtl::OUString WriteImage( const rtl::OUString& rURL ); + +public: + DrawingML( ::sax_fastparser::FSHelperPtr pFS, ::oox::core::XmlFilterBase* pFB = NULL, DocumentType eDocumentType = DOCUMENT_PPTX ) : mpFS( pFS ), mpFB( pFB ), meDocumentType( eDocumentType ) {} + void SetFS( ::sax_fastparser::FSHelperPtr pFS ) { mpFS = pFS; } + ::sax_fastparser::FSHelperPtr GetFS() { return mpFS; } + ::oox::core::XmlFilterBase* GetFB() { return mpFB; } + + rtl::OUString WriteImage( const Graphic &rGraphic ); + + void WriteColor( sal_uInt32 nColor ); + void WriteGradientStop( sal_uInt16 nStop, sal_uInt32 nColor ); + void WriteLineArrow( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, sal_Bool bLineStart ); + void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID ); + + void WriteSolidFill( sal_uInt32 nColor ); + void WriteSolidFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet ); + void WriteGradientFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet ); + void WriteBlipFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, String sURLPropName, sal_Int32 nXmlNamespace ); + void WriteBlipFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, String sURLPropName ); + void WriteOutline( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet ); + void WriteStretch(); + + ::rtl::OUString WriteBlip( ::rtl::OUString& rURL ); + void WriteBlipMode( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet ); + + void WriteShapeTransformation( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > rXShape, + sal_Bool bFlipH = false, sal_Bool bFlipV = false, sal_Int32 nRotation = 0 ); + void WriteTransformation( const Rectangle& rRectangle, + sal_Bool bFlipH = false, sal_Bool bFlipV = false, sal_Int32 nRotation = 0 ); + + void WriteText( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > rXShape ); + void WriteParagraph( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > rParagraph ); + void WriteParagraphProperties( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > rParagraph ); + void WriteParagraphNumbering( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, + sal_Int16 nLevel ); + void WriteRun( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > rRun ); + void WriteRunProperties( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > rRun ); + + void WritePresetShape( const char* pShape ); + void WritePresetShape( const char* pShape, MSO_SPT eShapeType, sal_Bool bPredefinedHandlesUsed, sal_Int32 nAdjustmentsWhichNeedsToBeConverted, const ::com::sun::star::beans::PropertyValue& rProp ); + void WritePolyPolygon( const PolyPolygon& rPolyPolygon ); + + static void ResetCounters(); + + void GetUUID( ::rtl::OStringBuffer& rBuffer ); + + static sal_Unicode SubstituteBullet( sal_Unicode cBulletId, ::com::sun::star::awt::FontDescriptor& rFontDesc ); + + sal_uInt32 ColorWithIntensity( sal_uInt32 nColor, sal_uInt32 nIntensity ); + + static const char* GetAlignment( sal_Int32 nAlignment ); +}; + +} +} + +#endif diff --git a/oox/inc/oox/export/shapes.hxx b/oox/inc/oox/export/shapes.hxx new file mode 100644 index 000000000000..ed9cf5b32970 --- /dev/null +++ b/oox/inc/oox/export/shapes.hxx @@ -0,0 +1,162 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef _OOX_EXPORT_SHAPES_HXX_ +#define _OOX_EXPORT_SHAPES_HXX_ + +#include <oox/dllapi.h> +#include <com/sun/star/uno/XReference.hpp> +#include <oox/export/drawingml.hxx> +#include <sax/fshelper.hxx> +#include <vcl/mapmod.hxx> +#include <hash_map> + +namespace com { namespace sun { namespace star { +namespace beans { + class XPropertySet; +} +namespace drawing { + class XShape; + class XShapes; +} +}}} + +namespace oox { namespace drawingml { + +class OOX_DLLPUBLIC ShapeExport : public DrawingML { +private: + sal_Int32 mnXmlNamespace; + sal_Int32 mnShapeIdMax, mnPictureIdMax; + Fraction maFraction; + MapMode maMapModeSrc, maMapModeDest; + + ::com::sun::star::awt::Size MapSize( const ::com::sun::star::awt::Size& ) const; + + struct ShapeCheck + { + bool operator()( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s1, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s2 ) const + { + return s1 == s2; + } + }; + + struct ShapeHash + { + std::hash<const char*> maHashFunction; + + size_t operator()( const ::com::sun::star::uno::Reference < ::com::sun::star::drawing::XShape > ) const; + }; + + typedef std::hash_map< const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape>, sal_Int32, ShapeHash, ShapeCheck> ShapeHashMap; + ShapeHashMap maShapeMap; + +public: + ShapeExport( sal_Int32 nXmlNamespace, ::sax_fastparser::FSHelperPtr pFS, ::oox::core::XmlFilterBase* pFB = NULL, DocumentType eDocumentType = DOCUMENT_PPTX ); + virtual ~ShapeExport() {} + + sal_Int32 GetXmlNamespace() const; + ShapeExport& SetXmlNamespace( sal_Int32 nXmlNamespace ); + + static sal_Bool NonEmptyText( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + + virtual ShapeExport& + WriteBezierShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, sal_Bool bClosed ); + virtual ShapeExport& + WriteClosedBezierShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteConnectorShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteCustomShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteEllipseShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPropSet ); + virtual ShapeExport& + WriteGraphicObjectShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteLineShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteNonVisualDrawingProperties( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, const char* sName ); + virtual ShapeExport& + WriteNonVisualProperties( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteOpenBezierShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteRectangleShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + + /** + * Write the DrawingML for a particular shape. + * + * <p>This is the member function you want. It performs the type lookup and + * invokes the appropriate corresponding Write*() method for the specific + * type.</p> + * + * <p>To write an XShape, XShape::getShapeType() is called to determine + * the shape type, and the corresponding method in this table is + * invoked:</p> + * + * <table> + * <tr><th>Shape Type</th><th>Method</th></tr> + * <tr><td><tt>com.sun.star.drawing.ClosedBezierShape</tt></td> <td>ShapeExport::WriteClosedBezierShape</td></tr> + * <tr><td><tt>com.sun.star.drawing.CustomShape</tt></td> <td>ShapeExport::WriteCustomShape</td></tr> + * <tr><td><tt>com.sun.star.drawing.EllipseShape</tt></td> <td>ShapeExport::WriteEllipseShape</td></tr> + * <tr><td><tt>com.sun.star.drawing.GraphicObjectShape</tt></td> <td>ShapeExport::WriteGraphicObjectShape</td></tr> + * <tr><td><tt>com.sun.star.drawing.LineShape</tt></td> <td>ShapeExport::WriteLineShape</td></tr> + * <tr><td><tt>com.sun.star.drawing.OpenBezierShape</tt></td> <td>ShapeExport::WriteOpenBezierShape</td></tr> + * <tr><td><tt>com.sun.star.drawing.RectangleShape</tt></td> <td>ShapeExport::WriteRectangleShape</td></tr> + * <tr><td><tt>com.sun.star.drawing.TextShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> + * <tr><td><tt>com.sun.star.presentation.DateTimeShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> + * <tr><td><tt>com.sun.star.presentation.FooterShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> + * <tr><td><tt>com.sun.star.presentation.HeaderShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> + * <tr><td><tt>com.sun.star.presentation.NotesShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> + * <tr><td><tt>com.sun.star.presentation.OutlinerShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> + * <tr><td><tt>com.sun.star.presentation.SlideNumberShape</tt></td><td>ShapeExport::WriteTextShape</td></tr> + * <tr><td><tt>com.sun.star.presentation.TitleTextShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> + * </table> + * + * <p>If the shape type is not recognized, then + * <tt>ShapeExport::WriteUnknownShape</tt> is called.</p> + * + * @param xShape The shape to export as DrawingML. + * @return <tt>*this</tt> + */ + virtual ShapeExport& + WriteShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteTextBox( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteTextShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual ShapeExport& + WriteUnknownShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + + sal_Int32 GetNewShapeID( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > rShape ); + sal_Int32 GetShapeID( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > rShape ); +}; + +}} + +#endif /* ndef _OOX_EXPORT_SHAPES_HXX_ */ diff --git a/oox/inc/oox/export/utils.hxx b/oox/inc/oox/export/utils.hxx new file mode 100644 index 000000000000..ab0d2d23ab9d --- /dev/null +++ b/oox/inc/oox/export/utils.hxx @@ -0,0 +1,70 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef _OOX_EXPORT_UTILS_HXX_ +#define _OOX_EXPORT_UTILS_HXX_ + +#define S(x) String( RTL_CONSTASCII_USTRINGPARAM( x ) ) +#define US(x) OUString( RTL_CONSTASCII_USTRINGPARAM( x )) +#define I32S(x) OString::valueOf( (sal_Int32) x ).getStr() +#define I64S(x) OString::valueOf( (sal_Int64) x ).getStr() +#define H32S(x) OString::valueOf( (sal_Int32) x, 16 ).getStr() +#define H64S(x) OString::valueOf( (sal_Int64) x, 16 ).getStr() +#define IS(x) OString::valueOf( x ).getStr() +#define USS(x) OUStringToOString( x, RTL_TEXTENCODING_UTF8 ).getStr() +#define ST(x) ByteString( x, RTL_TEXTENCODING_UTF8 ).GetBuffer() + +#ifndef DBG +# if OSL_DEBUG_LEVEL > 0 +# define DBG(x) x +# else +# define DBG(x) +# endif +#endif + +// --------------------------------------------------------------------------------------------- + +static inline sal_Int64 PPTtoEMU( INT32 nPPT ) +{ + return (sal_Int64)( (double)nPPT * 1587.5 ); +} + +// --------------------------------------------------------------------------------------------- + +static inline sal_Int64 MM100toEMU( INT32 nMM100 ) +{ + return (sal_Int64)nMM100 * 360; +} + +// --------------------------------------------------------------------------------------------- + +static inline sal_Int64 TwipsToEMU( sal_Int32 nTwips ) +{ + return sal_Int64( nTwips ) * 635; +} + +#endif diff --git a/oox/inc/oox/export/vmlexport.hxx b/oox/inc/oox/export/vmlexport.hxx new file mode 100644 index 000000000000..544074b7b18a --- /dev/null +++ b/oox/inc/oox/export/vmlexport.hxx @@ -0,0 +1,115 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <oox/dllapi.h> +#include <sax/fshelper.hxx> +#include <svx/escherex.hxx> + +namespace rtl { + class OString; + class OStringBuffer; +} + +namespace oox { + +namespace vml { + +class OOX_DLLPUBLIC VMLExport : public EscherEx +{ + /// Fast serializer to output the data + ::sax_fastparser::FSHelperPtr m_pSerializer; + + /// Fill the shape attributes as they come. + ::sax_fastparser::FastAttributeList *m_pShapeAttrList; + + /// Remember the shape type. + sal_uInt32 m_nShapeType; + + /// Remember the shape flags. + sal_uInt32 m_nShapeFlags; + + /// Remember style, the most important shape attribute ;-) + rtl::OStringBuffer *m_pShapeStyle; + + /// Remember which shape types we had already written. + bool *m_pShapeTypeWritten; + +public: + VMLExport( ::sax_fastparser::FSHelperPtr pSerializer ); + virtual ~VMLExport(); + + ::sax_fastparser::FSHelperPtr + GetFS() { return m_pSerializer; } + + /// Export the sdr object as VML. + /// + /// Call this when you need to export the object as VML. + using EscherEx::AddSdrObject; + +protected: + /// Add an attribute to the generated <v:shape/> element. + /// + /// This should be called from within StartShape() to ensure that the + /// added attribute is preserved. + void AddShapeAttribute( sal_Int32 nAttribute, const rtl::OString& sValue ); + + /// Start the shape for which we just collected the information. + /// + /// Returns the element's tag number, -1 means we wrote nothing. + virtual sal_Int32 StartShape(); + + /// End the shape. + /// + /// The parameter is just what we got from StartShape(). + virtual void EndShape( sal_Int32 nShapeElement ); + + virtual void Commit( EscherPropertyContainer& rProps, const Rectangle& rRect ); + +private: + + virtual void OpenContainer( UINT16 nEscherContainer, int nRecInstance = 0 ); + virtual void CloseContainer(); + + virtual UINT32 EnterGroup( const String& rShapeName, const Rectangle* pBoundRect = 0 ); + virtual void LeaveGroup(); + + virtual void AddShape( UINT32 nShapeType, UINT32 nShapeFlags, UINT32 nShapeId = 0 ); + +private: + /// Create an OString representing the id from a numerical id. + static rtl::OString ShapeIdString( sal_uInt32 nId ); + + /// Add starting and ending point of a line to the m_pShapeAttrList. + void AddLineDimensions( const Rectangle& rRectangle ); + + /// Add position and size to the OStringBuffer. + void AddRectangleDimensions( rtl::OStringBuffer& rBuffer, const Rectangle& rRectangle ); +}; + +} // namespace vml + +} // namespace oox diff --git a/oox/inc/oox/helper/attributelist.hxx b/oox/inc/oox/helper/attributelist.hxx new file mode 100644 index 000000000000..89981160b699 --- /dev/null +++ b/oox/inc/oox/helper/attributelist.hxx @@ -0,0 +1,185 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_ATTRIBUTELIST_HXX +#define OOX_HELPER_ATTRIBUTELIST_HXX + +#include <com/sun/star/util/DateTime.hpp> +#include <com/sun/star/xml/sax/XFastAttributeList.hpp> +#include "oox/helper/helper.hxx" +#include "tokens.hxx" + +namespace oox { + +// ============================================================================ + +/** Provides access to attribute values of an element. + + Wraps a com.sun.star.xml.sax.XFastAttributeList object. Provides + convenience functions that convert the string value of an attribute to + various other data types. + */ +class AttributeList +{ +public: + explicit AttributeList( + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& rxAttribs ); + + /** Returns the wrapped com.sun.star.xml.sax.XFastAttributeList object. */ + inline ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList > + getFastAttributeList() const { return mxAttribs; } + + /** Returns true, if the specified attribute is present. */ + bool hasAttribute( sal_Int32 nElement ) const; + + // static string conversion ----------------------------------------------- + + /** Returns the decoded string value. All characters in the format + '_xHHHH_' (H being a hexadecimal digit), will be decoded. */ + static ::rtl::OUString decodeXString( const ::rtl::OUString& rValue ); + + /** Returns the double value from the passed string. */ + static double decodeDouble( const ::rtl::OUString& rValue ); + + /** Returns the 32-bit signed integer value from the passed string (decimal). */ + static sal_Int32 decodeInteger( const ::rtl::OUString& rValue ); + + /** Returns the 32-bit unsigned integer value from the passed string (decimal). */ + static sal_uInt32 decodeUnsigned( const ::rtl::OUString& rValue ); + + /** Returns the 64-bit signed integer value from the passed string (decimal). */ + static sal_Int64 decodeHyper( const ::rtl::OUString& rValue ); + + /** Returns the 32-bit signed integer value from the passed string (hexadecimal). */ + static sal_Int32 decodeIntegerHex( const ::rtl::OUString& rValue ); + + /** Returns the 32-bit unsigned integer value from the passed string (hexadecimal). */ + static sal_uInt32 decodeUnsignedHex( const ::rtl::OUString& rValue ); + + /** Returns the 64-bit signed integer value from the passed string (hexadecimal). */ + static sal_Int64 decodeHyperHex( const ::rtl::OUString& rValue ); + + // optional return values ------------------------------------------------- + + /** Returns the token identifier of the value of the specified attribute. */ + OptValue< sal_Int32 > getToken( sal_Int32 nElement ) const; + + /** Returns the string value of the specified attribute. */ + OptValue< ::rtl::OUString > getString( sal_Int32 nElement ) const; + + /** Returns the string value of the specified attribute. All characters in + the format '_xHHHH_' (H being a hexadecimal digit), will be decoded. */ + OptValue< ::rtl::OUString > getXString( sal_Int32 nElement ) const; + + /** Returns the double value of the specified attribute. */ + OptValue< double > getDouble( sal_Int32 nElement ) const; + + /** Returns the 32-bit signed integer value of the specified attribute (decimal). */ + OptValue< sal_Int32 > getInteger( sal_Int32 nElement ) const; + + /** Returns the 32-bit unsigned integer value of the specified attribute (decimal). */ + OptValue< sal_uInt32 > getUnsigned( sal_Int32 nElement ) const; + + /** Returns the 64-bit signed integer value of the specified attribute (decimal). */ + OptValue< sal_Int64 > getHyper( sal_Int32 nElement ) const; + + /** Returns the 32-bit signed integer value of the specified attribute (hexadecimal). */ + OptValue< sal_Int32 > getIntegerHex( sal_Int32 nElement ) const; + + /** Returns the 32-bit unsigned integer value of the specified attribute (hexadecimal). */ + OptValue< sal_uInt32 > getUnsignedHex( sal_Int32 nElement ) const; + + /** Returns the 64-bit signed integer value of the specified attribute (hexadecimal). */ + OptValue< sal_Int64 > getHyperHex( sal_Int32 nElement ) const; + + /** Returns the boolean value of the specified attribute. */ + OptValue< bool > getBool( sal_Int32 nElement ) const; + + /** Returns the date/time value of the specified attribute. */ + OptValue< ::com::sun::star::util::DateTime > getDateTime( sal_Int32 nElement ) const; + + // defaulted return values ------------------------------------------------ + + /** Returns the token identifier of the value of the specified attribute, + or the passed default identifier if the attribute is missing. */ + sal_Int32 getToken( sal_Int32 nElement, sal_Int32 nDefault ) const; + + /** Returns the string value of the specified attribute, or the passed + default string if the attribute is missing. */ + ::rtl::OUString getString( sal_Int32 nElement, const ::rtl::OUString& rDefault ) const; + + /** Returns the decoded string value of the specified attribute, or the + passed default string if the attribute is missing. */ + ::rtl::OUString getXString( sal_Int32 nElement, const ::rtl::OUString& rDefault ) const; + + /** Returns the double value of the specified attribute, or the passed + default value if the attribute is missing or not convertible to a double. */ + double getDouble( sal_Int32 nElement, double fDefault ) const; + + /** Returns the 32-bit signed integer value of the specified attribute, or the + passed default value if the attribute is missing or not convertible to integer. */ + sal_Int32 getInteger( sal_Int32 nElement, sal_Int32 nDefault ) const; + + /** Returns the 32-bit unsigned integer value of the specified attribute, or the + passed default value if the attribute is missing or not convertible to unsigned. */ + sal_uInt32 getUnsigned( sal_Int32 nElement, sal_uInt32 nDefault ) const; + + /** Returns the 64-bit signed integer value of the specified attribute, or the + passed default value if the attribute is missing or not convertible to integer. */ + sal_Int64 getHyper( sal_Int32 nElement, sal_Int64 nDefault ) const; + + /** Returns the 32-bit signed integer value of the specified attribute (hexadecimal), + or the passed default value if the attribute is missing or not convertible. */ + sal_Int32 getIntegerHex( sal_Int32 nElement, sal_Int32 nDefault ) const; + + /** Returns the 32-bit unsigned integer value of the specified attribute (hexadecimal), + or the passed default value if the attribute is missing or not convertible. */ + sal_uInt32 getUnsignedHex( sal_Int32 nElement, sal_uInt32 nDefault ) const; + + /** Returns the 64-bit signed integer value of the specified attribute (hexadecimal), + or the passed default value if the attribute is missing or not convertible. */ + sal_Int64 getHyperHex( sal_Int32 nElement, sal_Int64 nDefault ) const; + + /** Returns the boolean value of the specified attribute, or the passed + default value if the attribute is missing or not convertible to bool. */ + bool getBool( sal_Int32 nElement, bool bDefault ) const; + + /** Returns the date/time value of the specified attribute, or the default + value if the attribute is missing or not convertible to a date/time value. */ + ::com::sun::star::util::DateTime getDateTime( sal_Int32 nElement, const ::com::sun::star::util::DateTime& rDefault ) const; + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList > + mxAttribs; +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/binaryinputstream.hxx b/oox/inc/oox/helper/binaryinputstream.hxx new file mode 100644 index 000000000000..19933ca03c04 --- /dev/null +++ b/oox/inc/oox/helper/binaryinputstream.hxx @@ -0,0 +1,222 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_BINARYINPUTSTREAM_HXX +#define OOX_HELPER_BINARYINPUTSTREAM_HXX + +#include <boost/shared_ptr.hpp> +#include <com/sun/star/io/XInputStream.hpp> +#include "oox/helper/binarystreambase.hxx" + +namespace oox { + +// ============================================================================ + +/** Interface for binary input stream classes. + + The binary data in the stream is assumed to be in little-endian format. + */ +class BinaryInputStream : public virtual BinaryStreamBase +{ +public: + /** Derived classes implement reading nBytes bytes to the passed sequence. + @return Number of bytes really read. */ + virtual sal_Int32 readData( StreamDataSequence& orData, sal_Int32 nBytes ) = 0; + /** Derived classes implement reading nBytes bytes to the (existing) buffer opMem. + @return Number of bytes really read. */ + virtual sal_Int32 readMemory( void* opMem, sal_Int32 nBytes ) = 0; + /** Derived classes implement seeking the stream forward by the passed + number of bytes. This should work for non-seekable streams too. */ + virtual void skip( sal_Int32 nBytes ) = 0; + + /** Reads a value from the stream and converts it to platform byte order. + Supported types: SAL integers (8 to 64 bit), float, double. */ + template< typename Type > + void readValue( Type& ornValue ); + /** Reads a value from the stream and converts it to platform byte order. + Supported types: SAL integers (8 to 64 bit), float, double. */ + template< typename Type > + inline Type readValue() { Type nValue; readValue( nValue ); return nValue; } + /** Stream operator for integral and floating-point types. */ + template< typename Type > + inline BinaryInputStream& operator>>( Type& ornValue ) { readValue( ornValue ); return *this; } + + inline sal_Int8 readInt8() { return readValue< sal_Int8 >(); } + inline sal_uInt8 readuInt8() { return readValue< sal_uInt8 >(); } + inline sal_Int16 readInt16() { return readValue< sal_Int16 >(); } + inline sal_uInt16 readuInt16() { return readValue< sal_uInt16 >(); } + inline sal_Int32 readInt32() { return readValue< sal_Int32 >(); } + inline sal_uInt32 readuInt32() { return readValue< sal_uInt32 >(); } + inline sal_Int64 readInt64() { return readValue< sal_Int64 >(); } + inline sal_uInt64 readuInt64() { return readValue< sal_uInt64 >(); } + inline float readFloat() { return readValue< float >(); } + inline double readDouble() { return readValue< double >(); } + + /** Reads a NUL-terminated byte character array and returns the string. */ + ::rtl::OString readNulCharArray(); + + /** Reads a NUL-terminated byte character array and returns a Unicode string. + @param eTextEnc The text encoding used to create the Unicode string. */ + ::rtl::OUString readNulCharArrayUC( rtl_TextEncoding eTextEnc ); + + /** Reads a NUL-terminated Unicode character array and returns the string. */ + ::rtl::OUString readNulUnicodeArray(); + + /** Reads nChar byte characters and returns the string. + @param nChars Number of characters (bytes) to read from the stream. + @param bAllowNulChars + True = NUL characters are inserted into the imported string. + False = NUL characters are replaced by question marks (default). */ + ::rtl::OString readCharArray( sal_Int32 nChars, bool bAllowNulChars = false ); + + /** Reads nChar byte characters and returns a Unicode string. + @param nChars Number of characters (bytes) to read from the stream. + @param eTextEnc The text encoding used to create the Unicode string. + @param bAllowNulChars + True = NUL characters are inserted into the imported string. + False = NUL characters are replaced by question marks (default). */ + ::rtl::OUString readCharArrayUC( sal_Int32 nChars, rtl_TextEncoding eTextEnc, bool bAllowNulChars = false ); + + /** Reads nChars Unicode characters and returns the string. + @param nChars Number of 16-bit characters to read from the stream. + @param bAllowNulChars + True = NUL characters are inserted into the imported string. + False = NUL characters are replaced by question marks (default). */ + ::rtl::OUString readUnicodeArray( sal_Int32 nChars, bool bAllowNulChars = false ); + + +private: + /** Used by the readValue() template functions to read built-in types. + @descr Derived classes may overwrite this default implementation which + simply calls readMemory() with something own. */ + virtual void readAtom( void* opMem, sal_uInt8 nSize ); +}; + +typedef ::boost::shared_ptr< BinaryInputStream > BinaryInputStreamRef; + +// ---------------------------------------------------------------------------- + +template< typename Type > +void BinaryInputStream::readValue( Type& ornValue ) +{ + // can be instanciated for all types supported in class ByteOrderConverter + readAtom( &ornValue, static_cast< sal_Int32 >( sizeof( Type ) ) ); + ByteOrderConverter::convertLittleEndian( ornValue ); +} + +// ============================================================================ + +/** Wraps a com.sun.star.io.XInputStream and provides convenient access functions. + + The binary data in the stream is assumed to be in little-endian format. + */ +class BinaryXInputStream : public BinaryXSeekableStream, public BinaryInputStream +{ +public: + /** Constructs the wrapper object for the passed input stream. + + @param rxInStream The com.sun.star.io.XInputStream interface of the + input stream to be wrapped. + @param bAutoClose True = automatically close the wrapped input stream + on destruction of this wrapper. + */ + explicit BinaryXInputStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm, + bool bAutoClose ); + + virtual ~BinaryXInputStream(); + + /** Reads nBytes bytes to the passed sequence. + @return Number of bytes really read. */ + virtual sal_Int32 readData( StreamDataSequence& orData, sal_Int32 nBytes ); + /** Reads nBytes bytes to the (existing) buffer opMem. + @return Number of bytes really read. */ + virtual sal_Int32 readMemory( void* opMem, sal_Int32 nBytes ); + /** Seeks the stream forward by the passed number of bytes. This works for + non-seekable streams too. */ + virtual void skip( sal_Int32 nBytes ); + + /** Stream operator for integral and floating-point types. */ + template< typename Type > + inline BinaryXInputStream& operator>>( Type& ornValue ) { readValue( ornValue ); return *this; } + + /** Returns the XInputStream interface of the wrapped input stream. */ + inline ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + getXInputStream() const { return mxInStrm; } + /** Closes the wrapped XInputStream. */ + void close(); + +private: + StreamDataSequence maBuffer; /// Data buffer used in readMemory() function. + ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + mxInStrm; /// Reference to the input stream. + bool mbAutoClose; /// True = automatically close stream on destruction. +}; + +typedef ::boost::shared_ptr< BinaryXInputStream > BinaryXInputStreamRef; + +// ============================================================================ + +/** Wraps a StreamDataSequence and provides convenient access functions. + + The binary data in the stream is assumed to be in little-endian format. + */ +class SequenceInputStream : public SequenceSeekableStream, public BinaryInputStream +{ +public: + /** Constructs the wrapper object for the passed data sequence. + + @attention + The passed data sequence MUST live at least as long as this stream + wrapper. The data sequence MUST NOT be changed from outside as long + as this stream wrapper is used to read from it. + */ + explicit SequenceInputStream( const StreamDataSequence& rData ); + + /** Reads nBytes bytes to the passed sequence. + @return Number of bytes really read. */ + virtual sal_Int32 readData( StreamDataSequence& orData, sal_Int32 nBytes ); + /** Reads nBytes bytes to the (existing) buffer opMem. + @return Number of bytes really read. */ + virtual sal_Int32 readMemory( void* opMem, sal_Int32 nBytes ); + /** Seeks the stream forward by the passed number of bytes. This works for + non-seekable streams too. */ + virtual void skip( sal_Int32 nBytes ); + + /** Stream operator for integral and floating-point types. */ + template< typename Type > + inline SequenceInputStream& operator>>( Type& ornValue ) { readValue( ornValue ); return *this; } +}; + +typedef ::boost::shared_ptr< SequenceInputStream > SequenceInputStreamRef; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/binaryoutputstream.hxx b/oox/inc/oox/helper/binaryoutputstream.hxx new file mode 100644 index 000000000000..b229dbd18901 --- /dev/null +++ b/oox/inc/oox/helper/binaryoutputstream.hxx @@ -0,0 +1,166 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_BINARYOUTPUTSTREAM_HXX +#define OOX_HELPER_BINARYOUTPUTSTREAM_HXX + +#include <boost/shared_ptr.hpp> +#include <com/sun/star/io/XOutputStream.hpp> +#include "oox/helper/binarystreambase.hxx" + +namespace oox { + +class BinaryInputStream; + +// ============================================================================ + +/** Interface for binary output stream classes. + + The binary data in the stream is written in little-endian format. + */ +class BinaryOutputStream : public virtual BinaryStreamBase +{ +public: + /** Derived classes implement writing the passed data sequence. */ + virtual void writeData( const StreamDataSequence& rData ) = 0; + /** Derived classes implement writing from the (existing) buffer pMem. */ + virtual void writeMemory( const void* pMem, sal_Int32 nBytes ) = 0; + + /** Copies nBytes bytes from the current position of the passed input stream. */ + void copyStream( BinaryInputStream& rInStrm, sal_Int64 nBytes = SAL_MAX_INT64 ); + + /** Writes a value to the stream and converts it to platform byte order. + Supported types: SAL integers (8 to 64 bit), float, double. */ + template< typename Type > + void writeValue( Type nValue ); + /** Stream operator for integral and floating-point types. */ + template< typename Type > + inline BinaryOutputStream& operator<<( Type nValue ) { writeValue( nValue ); return *this; } + +private: + /** Used by the writeValue() template function to write built-in types. + @descr Derived classes may overwrite this default implementation which + simply calls writeMemory() with something own. */ + virtual void writeAtom( const void* pMem, sal_uInt8 nSize ); +}; + +typedef ::boost::shared_ptr< BinaryOutputStream > BinaryOutputStreamRef; + +// ---------------------------------------------------------------------------- + +template< typename Type > +void BinaryOutputStream::writeValue( Type nValue ) +{ + // can be instanciated for all types supported in class ByteOrderConverter + ByteOrderConverter::convertLittleEndian( nValue ); + writeMemory( &nValue, static_cast< sal_Int32 >( sizeof( Type ) ) ); +} + +// ============================================================================ + +/** Wraps a com.sun.star.io.XOutputStream and provides convenient access functions. + + The binary data in the stream is written in little-endian format. + */ +class BinaryXOutputStream : public BinaryXSeekableStream, public BinaryOutputStream +{ +public: + /** Constructs the wrapper object for the passed output stream. + + @param rxOutStream The com.sun.star.io.XOutputStream interface of the + output stream to be wrapped. + @param bAutoClose True = automatically close the wrapped output stream + on destruction of this wrapper. + */ + explicit BinaryXOutputStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream >& rxOutStrm, + bool bAutoClose ); + + virtual ~BinaryXOutputStream(); + + /** Writes the passed data sequence. */ + virtual void writeData( const StreamDataSequence& rData ); + /** Write nBytes bytes from the (existing) buffer pMem. */ + virtual void writeMemory( const void* pMem, sal_Int32 nBytes ); + + /** Stream operator for integral and floating-point types. */ + template< typename Type > + inline BinaryXOutputStream& operator<<( Type nValue ) { writeValue( nValue ); return *this; } + + /** Returns the XOutputStream interface of the wrapped output stream. */ + inline ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + getXOutputStream() const { return mxOutStrm; } + /** Flushes and closes the wrapped XOutputStream. */ + void close(); + +private: + StreamDataSequence maBuffer; /// Data buffer used in writeMemory() function. + ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + mxOutStrm; /// Reference to the output stream. + bool mbAutoClose; /// True = automatically close stream on destruction. +}; + +typedef ::boost::shared_ptr< BinaryXOutputStream > BinaryXOutputStreamRef; + +// ============================================================================ + +/** Wraps a StreamDataSequence and provides convenient access functions. + + The binary data in the stream is written in little-endian format. After + construction, the stream points to the beginning of the passed data + sequence. The data sequence is expanded automatically while writing to it. + */ +class SequenceOutputStream : public SequenceSeekableStream, public BinaryOutputStream +{ +public: + /** Constructs the wrapper object for the passed data sequence. + + @attention + The passed data sequence MUST live at least as long as this stream + wrapper. The data sequence MUST NOT be changed from outside as long + as this stream wrapper is used to write to it. + */ + explicit SequenceOutputStream( StreamDataSequence& rData ); + + /** Writes the passed data sequence. */ + virtual void writeData( const StreamDataSequence& rData ); + /** Write nBytes bytes from the (existing) buffer pMem. */ + virtual void writeMemory( const void* pMem, sal_Int32 nBytes ); + + /** Stream operator for integral and floating-point types. */ + template< typename Type > + inline SequenceOutputStream& operator<<( Type nValue ) { writeValue( nValue ); return *this; } +}; + +typedef ::boost::shared_ptr< SequenceOutputStream > SequenceOutputStreamRef; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/binarystreambase.hxx b/oox/inc/oox/helper/binarystreambase.hxx new file mode 100644 index 000000000000..18d868660faa --- /dev/null +++ b/oox/inc/oox/helper/binarystreambase.hxx @@ -0,0 +1,140 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_BINARYSTREAMBASE_HXX +#define OOX_HELPER_BINARYSTREAMBASE_HXX + +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/io/XSeekable.hpp> +#include "oox/helper/helper.hxx" + +namespace oox { + +typedef ::com::sun::star::uno::Sequence< sal_Int8 > StreamDataSequence; + +// ============================================================================ + +/** Base interface for seekable binary stream classes. */ +class BinaryStreamBase +{ +public: + virtual ~BinaryStreamBase(); + + /** Derived classes return whether the stream is seekable. Default: false. */ + virtual bool isSeekable() const; + /** Derived classes returns the size of the stream, if seekable, otherwise/default: -1. */ + virtual sal_Int64 getLength() const; + /** Derived classes return the current stream position, if seekable, otherwise/default: -1. */ + virtual sal_Int64 tell() const; + /** Derived classes implement seeking the stream to the passed position, if seekable. */ + virtual void seek( sal_Int64 nPos ); + + /** Returns true, if the stream position is invalid (EOF). This flag turns + true *after* the first attempt to seek/read beyond the stream end. */ + inline bool isEof() const { return mbEof; } + + /** Returns the size of the remaining data, if stream is seekable, otherwise -1. */ + sal_Int64 getRemaining() const; + /** Seeks the stream to the beginning, if stream is seekable. */ + inline void seekToStart() { seek( 0 ); } + /** Seeks the stream to the end, if stream is seekable. */ + inline void seekToEnd() { seek( getLength() ); } + +protected: + inline explicit BinaryStreamBase() : mbEof( false ) {} + +private: + BinaryStreamBase( const BinaryStreamBase& ); + BinaryStreamBase& operator=( const BinaryStreamBase& ); + +protected: + bool mbEof; +}; + +// ============================================================================ + +/** Base class for binary input and output streams wrapping an API stream, + seekable via the com.sun.star.io.XSeekable interface. + */ +class BinaryXSeekableStream : public virtual BinaryStreamBase +{ +public: + /** Returns true, if the wrapped stream is seekable. */ + virtual bool isSeekable() const; + /** Returns the size of the stream, if stream is seekable, otherwise -1. */ + virtual sal_Int64 getLength() const; + /** Returns the current stream position, if stream is seekable, otherwise -1. */ + virtual sal_Int64 tell() const; + /** Seeks the stream to the passed position, if stream is seekable. */ + virtual void seek( sal_Int64 nPos ); + +protected: + explicit BinaryXSeekableStream( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XSeekable >& rxSeekable ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::io::XSeekable > + mxSeekable; /// Stream seeking interface. +}; + +// ============================================================================ + +/** Base class for binary input and output streams wrapping a + StreamDataSequence, which is always seekable. */ +class SequenceSeekableStream : public virtual BinaryStreamBase +{ +public: + /** Returns true (data sequence streams are always seekable). */ + virtual bool isSeekable() const; + /** Returns the size of the wrapped data sequence. */ + virtual sal_Int64 getLength() const; + /** Returns the current stream position. */ + virtual sal_Int64 tell() const; + /** Seeks the stream to the passed position. */ + virtual void seek( sal_Int64 nPos ); + +protected: + /** Constructs the wrapper object for the passed data sequence. + + @attention + The passed data sequence MUST live at least as long as this stream + wrapper. The data sequence MUST NOT be changed from outside as long + as this stream wrapper is used to modify it. + */ + inline explicit SequenceSeekableStream( const StreamDataSequence& rData ) : mrData( rData ), mnPos( 0 ) {} + +protected: + const StreamDataSequence& mrData; /// Wrapped data sequence. + sal_Int32 mnPos; /// Current position in the sequence. +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/containerhelper.hxx b/oox/inc/oox/helper/containerhelper.hxx new file mode 100644 index 000000000000..a077c667ae4c --- /dev/null +++ b/oox/inc/oox/helper/containerhelper.hxx @@ -0,0 +1,621 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_CONTAINERHELPER_HXX +#define OOX_HELPER_CONTAINERHELPER_HXX + +#include <vector> +#include <map> +#include <boost/shared_ptr.hpp> +#include <boost/bind.hpp> +#include <com/sun/star/uno/Reference.h> +#include <com/sun/star/uno/Sequence.h> + +namespace rtl { class OUString; } + +namespace com { namespace sun { namespace star { + namespace container { class XIndexAccess; } + namespace container { class XIndexContainer; } + namespace container { class XNameAccess; } + namespace container { class XNameContainer; } + namespace lang { class XMultiServiceFactory; } +} } } + +namespace oox { + +// ============================================================================ + +/** Template for a vector of ref-counted objects with additional accessor functions. + + An instance of the class RefVector< Type > stores elements of the type + ::boost::shared_ptr< Type >. The new accessor functions has() and get() + work correctly for indexes out of the current range, there is no need to + check the passed index before. + */ +template< typename ObjType > +class RefVector : public ::std::vector< ::boost::shared_ptr< ObjType > > +{ +public: + typedef ::std::vector< ::boost::shared_ptr< ObjType > > container_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::size_type size_type; + +public: + /** Returns true, if the object with the passed index exists. Returns + false, if the vector element exists but is an empty reference. */ + inline bool has( sal_Int32 nIndex ) const + { + const value_type* pxRef = getRef( nIndex ); + return pxRef && pxRef->get(); + } + + /** Returns a reference to the object with the passed index, or 0 on error. */ + inline value_type get( sal_Int32 nIndex ) const + { + if( const value_type* pxRef = getRef( nIndex ) ) return *pxRef; + return value_type(); + } + + /** Returns the index of the last element, or -1, if the vector is empty. + Does *not* check whether the last element is an empty reference. */ + inline sal_Int32 getLastIndex() const { return static_cast< sal_Int32 >( this->size() ) - 1; } + + /** Calls the passed member function of ObjType on every contained object. */ + template< typename FunctorType > + inline void forEach( const FunctorType& rFunctor ) const + { + ::std::for_each( this->begin(), this->end(), ForEachFunctor< FunctorType >( rFunctor ) ); + } + + /** Calls the passed member function of ObjType on every contained object. */ + template< typename FuncType > + inline void forEachMem( FuncType pFunc ) const + { + forEach( ::boost::bind( pFunc, _1 ) ); + } + + /** Calls the passed member function of ObjType on every contained object. */ + template< typename FuncType, typename ParamType > + inline void forEachMem( FuncType pFunc, ParamType aParam ) const + { + forEach( ::boost::bind( pFunc, _1, aParam ) ); + } + + /** Calls the passed member function of ObjType on every contained object. */ + template< typename FuncType, typename ParamType1, typename ParamType2 > + inline void forEachMem( FuncType pFunc, ParamType1 aParam1, ParamType2 aParam2 ) const + { + forEach( ::boost::bind( pFunc, _1, aParam1, aParam2 ) ); + } + + /** Searches for an element by using the passed functor that takes a + constant reference of the object type (const ObjType&). */ + template< typename FunctorType > + inline value_type findIf( const FunctorType& rFunctor ) const + { + typename container_type::const_iterator aIt = ::std::find_if( this->begin(), this->end(), FindFunctor< FunctorType >( rFunctor ) ); + return (aIt == this->end()) ? value_type() : *aIt; + } + +private: + template< typename FunctorType > + struct ForEachFunctor + { + const FunctorType& mrFunctor; + inline explicit ForEachFunctor( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {} + inline void operator()( const value_type& rxValue ) const { if( rxValue.get() ) mrFunctor( *rxValue ); } + }; + + template< typename FunctorType > + struct FindFunctor + { + const FunctorType& mrFunctor; + inline explicit FindFunctor( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {} + inline bool operator()( const value_type& rxValue ) const { return rxValue.get() && mrFunctor( *rxValue ); } + }; + + inline const value_type* getRef( sal_Int32 nIndex ) const + { + return ((0 <= nIndex) && (static_cast< size_type >( nIndex ) < this->size())) ? + &(*this)[ static_cast< size_type >( nIndex ) ] : 0; + } +}; + +// ============================================================================ + +/** Template for a map of ref-counted objects with additional accessor functions. + + An instance of the class RefMap< Type > stores elements of the type + ::boost::shared_ptr< Type >. The new accessor functions has() and get() + work correctly for nonexisting keys, there is no need to check the passed + key before. + */ +template< typename KeyType, typename ObjType, typename CompType = ::std::less< KeyType > > +class RefMap : public ::std::map< KeyType, ::boost::shared_ptr< ObjType >, CompType > +{ +public: + typedef ::std::map< KeyType, ::boost::shared_ptr< ObjType >, CompType > container_type; + typedef typename container_type::key_type key_type; + typedef typename container_type::mapped_type mapped_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::key_compare key_compare; + +public: + /** Returns true, if the object accossiated to the passed key exists. + Returns false, if the key exists but points to an empty reference. */ + inline bool has( key_type nKey ) const + { + const mapped_type* pxRef = getRef( nKey ); + return pxRef && pxRef->get(); + } + + /** Returns a reference to the object accossiated to the passed key, or 0 on error. */ + inline mapped_type get( key_type nKey ) const + { + if( const mapped_type* pxRef = getRef( nKey ) ) return *pxRef; + return mapped_type(); + } + + /** Calls the passed functor for every contained object. */ + template< typename FunctorType > + inline void forEach( const FunctorType& rFunctor ) const + { + ::std::for_each( this->begin(), this->end(), ForEachFunctor< FunctorType >( rFunctor ) ); + } + + /** Calls the passed member function of ObjType on every contained object. */ + template< typename FuncType > + inline void forEachMem( FuncType pFunc ) const + { + forEach( ::boost::bind( pFunc, _1 ) ); + } + + /** Calls the passed member function of ObjType on every contained object. */ + template< typename FuncType, typename ParamType > + inline void forEachMem( FuncType pFunc, ParamType aParam ) const + { + forEach( ::boost::bind( pFunc, _1, aParam ) ); + } + + /** Calls the passed member function of ObjType on every contained object. */ + template< typename FuncType, typename ParamType1, typename ParamType2 > + inline void forEachMem( FuncType pFunc, ParamType1 aParam1, ParamType2 aParam2 ) const + { + forEach( ::boost::bind( pFunc, _1, aParam1, aParam2 ) ); + } + + /** Calls the passed functor for every contained object. Passes the key as + first argument and the object reference as second argument to rFunctor. */ + template< typename FunctorType > + inline void forEachWithKey( const FunctorType& rFunctor ) const + { + ::std::for_each( this->begin(), this->end(), ForEachFunctorWithKey< FunctorType >( rFunctor ) ); + } + + /** Calls the passed member function of ObjType on every contained object. + Passes the object key as argument to the member function. */ + template< typename FuncType > + inline void forEachMemWithKey( FuncType pFunc ) const + { + forEachWithKey( ::boost::bind( pFunc, _2, _1 ) ); + } + + /** Calls the passed member function of ObjType on every contained object. + Passes the object key as first argument to the member function. */ + template< typename FuncType, typename ParamType > + inline void forEachMemWithKey( FuncType pFunc, ParamType aParam ) const + { + forEachWithKey( ::boost::bind( pFunc, _2, _1, aParam ) ); + } + + /** Calls the passed member function of ObjType on every contained object. + Passes the object key as first argument to the member function. */ + template< typename FuncType, typename ParamType1, typename ParamType2 > + inline void forEachMemWithKey( FuncType pFunc, ParamType1 aParam1, ParamType2 aParam2 ) const + { + forEachWithKey( ::boost::bind( pFunc, _2, _1, aParam1, aParam2 ) ); + } + +private: + template< typename FunctorType > + struct ForEachFunctor + { + const FunctorType& mrFunctor; + inline explicit ForEachFunctor( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {} + inline void operator()( const value_type& rValue ) const { if( rValue.second.get() ) mrFunctor( *rValue.second ); } + }; + + template< typename FunctorType > + struct ForEachFunctorWithKey + { + const FunctorType& mrFunctor; + inline explicit ForEachFunctorWithKey( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {} + inline void operator()( const value_type& rValue ) const { if( rValue.second.get() ) mrFunctor( rValue.first, *rValue.second ); } + }; + + inline const mapped_type* getRef( key_type nKey ) const + { + typename container_type::const_iterator aIt = find( nKey ); + return (aIt == this->end()) ? 0 : &aIt->second; + } +}; + +// ============================================================================ + +/** Template for a 2-dimensional array of objects. + + This class template provides a similar interface to the ::std::vector + template. + */ +template< typename Type > +class Matrix +{ +public: + typedef ::std::vector< Type > container_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::pointer pointer; + typedef typename container_type::reference reference; + typedef typename container_type::const_reference const_reference; + typedef typename container_type::size_type size_type; + typedef typename container_type::iterator iterator; + typedef typename container_type::const_iterator const_iterator; + + inline explicit Matrix() : mnWidth( 0 ) {} + inline explicit Matrix( size_type nWidth, size_type nHeight ) { this->resize( nWidth, nHeight ); } + inline explicit Matrix( size_type nWidth, size_type nHeight, const_reference rData ) { this->resize( nWidth, nHeight, rData ); } + + inline size_type capacity() const { return maData.capacity(); } + inline bool empty() const { return maData.empty(); } + inline size_type size() const { return maData.size(); } + inline size_type width() const { return mnWidth; } + inline size_type height() const { return this->empty() ? 0 : (this->size() / this->width()); } + inline bool has( size_type nX, size_type nY ) const { return (nX < this->width()) && (nY < this->height()); } + + inline void reserve( size_type nWidth, size_type nHeight ) { maData.reserve( nWidth * nHeight ); } + inline void clear() { this->resize( 0, 0 ); } + inline void resize( size_type nWidth, size_type nHeight ) { mnWidth = nWidth; maData.resize( nWidth * nHeight ); } + inline void resize( size_type nWidth, size_type nHeight, const_reference rData ) { mnWidth = nWidth; maData.resize( nWidth * nHeight, rData ); } + + inline iterator at( size_type nX, size_type nY ) { return maData.begin() + mnWidth * nY + nX; } + inline const_iterator at( size_type nX, size_type nY ) const { return maData.begin() + mnWidth * nY + nX; } + + inline reference operator()( size_type nX, size_type nY ) { return *this->at( nX, nY ); } + inline const_reference operator()( size_type nX, size_type nY ) const { return *this->at( nX, nY ); } + + inline iterator begin() { return maData.begin(); } + inline const_iterator begin() const { return maData.begin(); } + inline iterator end() { return maData.end(); } + inline const_iterator end() const { return maData.end(); } + + inline reference front() { return maData.front(); } + inline const_reference front() const { return maData.front(); } + inline reference back() { return maData.back(); } + inline const_reference back() const { return maData.back(); } + + inline iterator row_begin( size_type nY ) { return this->at( 0, nY ); } + inline const_iterator row_begin( size_type nY ) const { return this->at( 0, nY ); } + inline iterator row_end( size_type nY ) { return this->at( mnWidth, nY ); } + inline const_iterator row_end( size_type nY ) const { return this->at( mnWidth, nY ); } + + inline reference row_front( size_type nY ) { return (*this)( 0, nY ); } + inline const_reference row_front( size_type nY ) const { return (*this)( 0, nY ); } + inline reference row_back( size_type nY ) { return (*this)( mnWidth - 1, nY ); } + inline const_reference row_back( size_type nY ) const { return (*this)( mnWidth - 1, nY ); } + + inline void swap( Matrix& rMatrix ) { maData.swap( rMatrix.maData ); } + +private: + container_type maData; + size_type mnWidth; +}; + +// ============================================================================ + +/** Static helper functions for improved API container handling. */ +class ContainerHelper +{ +public: + // com.sun.star.container.XIndexContainer --------------------------------- + + /** Creates a new index container object from scratch. */ + static ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer > + createIndexContainer( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory ); + + /** Inserts an object into an indexed container. + + @param rxIndexContainer com.sun.star.container.XIndexContainer + interface of the indexed container. + + @param nIndex Insertion index for the object. + + @param rObject The object to be inserted. + + @return True = object successfully inserted. + */ + static bool insertByIndex( + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer >& rxIndexContainer, + sal_Int32 nIndex, + const ::com::sun::star::uno::Any& rObject ); + + // com.sun.star.container.XNameContainer ---------------------------------- + + /** Creates a new name container object from scratch. */ + static ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > + createNameContainer( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory ); + + /** Returns a name that is not used in the passed name container. + + @param rxNameAccess com.sun.star.container.XNameAccess interface of + the name container. + + @param rSuggestedName Suggested name for the object. + + @return An unused name. Will be equal to the suggested name, if not + contained, otherwise a numerical index will be appended. + */ + static ::rtl::OUString getUnusedName( + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& rxNameAccess, + const ::rtl::OUString& rSuggestedName, + sal_Unicode cSeparator, + sal_Int32 nFirstIndexToAppend = 1 ); + + /** Inserts an object into a name container. + + @param rxNameContainer com.sun.star.container.XNameContainer interface + of the name container. + + @param rName Exact name for the object. + + @param rObject The object to be inserted. + + @return True = object successfully inserted. + */ + static bool insertByName( + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& rxNameContainer, + const ::rtl::OUString& rName, + const ::com::sun::star::uno::Any& rObject, + bool bReplaceOldExisting = true ); + + /** Inserts an object into a name container. + + The function will use an unused name to insert the object, based on the + suggested object name. It is possible to specify whether the existing + object or the new inserted object will be renamed, if the container + already has an object with the name suggested for the new object. + + @param rxNameContainer com.sun.star.container.XNameContainer interface + of the name container. + + @param rSuggestedName Suggested name for the object. + + @param rObject The object to be inserted. + + @param bRenameOldExisting Specifies behaviour if an object with the + suggested name already exists. If false (default), the new object + will be inserted with a name not yet extant in the container (this + is done by appending a numerical index to the suggested name). If + true, the existing object will be removed and inserted with an + unused name, and the new object will be inserted with the suggested + name. + + @return The final name the object is inserted with. Will always be + equal to the suggested name, if parameter bRenameOldExisting is + true. + */ + static ::rtl::OUString insertByUnusedName( + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& rxNameContainer, + const ::rtl::OUString& rSuggestedName, + sal_Unicode cSeparator, + const ::com::sun::star::uno::Any& rObject, + bool bRenameOldExisting = false ); + + // std::vector and std::map element access -------------------------------- + + /** Returns the pointer to an existing element of the passed vector, or a + null pointer, if the passed index is out of bounds. */ + template< typename Type > + static const Type* getVectorElement( const ::std::vector< Type >& rVector, sal_Int32 nIndex ); + + /** Returns the pointer to an existing element of the passed vector, or a + null pointer, if the passed index is out of bounds. */ + template< typename Type > + static Type* getVectorElement( ::std::vector< Type >& rVector, sal_Int32 nIndex ); + + /** Returns the reference to an existing element of the passed vector, or + the passed default value, if the passed index is out of bounds. */ + template< typename Type > + static const Type& getVectorElement( const ::std::vector< Type >& rVector, sal_Int32 nIndex, const Type& rDefault ); + + /** Returns the reference to an existing element of the passed vector, or + the passed default value, if the passed index is out of bounds. */ + template< typename Type > + static Type& getVectorElement( const ::std::vector< Type >& rVector, sal_Int32 nIndex, Type& rDefault ); + + /** Returns the pointer to an existing element of the passed map, or a null + pointer, if an element with the passed key does not exist. */ + template< typename Type, typename KeyType > + static const Type* getMapElement( const ::std::map< KeyType, Type >& rMap, KeyType nKey ); + + /** Returns the pointer to an existing element of the passed map, or a null + pointer, if an element with the passed key does not exist. */ + template< typename Type, typename KeyType > + static Type* getMapElement( ::std::map< KeyType, Type >& rMap, KeyType nKey ); + + /** Returns the reference to an existing element of the passed map, or the + passed default value, if an element with the passed key does not exist. */ + template< typename Type, typename KeyType > + static const Type& getMapElement( const ::std::map< KeyType, Type >& rMap, KeyType nKey, const Type& rDefault ); + + /** Returns the reference to an existing element of the passed map, or the + passed default value, if an element with the passed key does not exist. */ + template< typename Type, typename KeyType > + static Type& getMapElement( ::std::map< KeyType, Type >& rMap, KeyType nKey, Type& rDefault ); + + // vector/matrix to Sequence ---------------------------------------------- + + /** Creates a UNO sequence from a std::vector with copies of all elements. + + @param rVector The vector to be converted to a sequence. + + @return A com.sun.star.uno.Sequence object with copies of all objects + contained in the passed vector. + */ + template< typename Type > + static ::com::sun::star::uno::Sequence< Type > + vectorToSequence( const ::std::vector< Type >& rVector ); + + /** Creates a UNO sequence of sequences from a matrix with copies of all elements. + + @param rMatrix The matrix to be converted to a sequence of sequences. + + @return A com.sun.star.uno.Sequence object containing + com.sun.star.uno.Sequence objects with copies of all objects + contained in the passed matrix. + */ + template< typename Type > + static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< Type > > + matrixToSequenceSequence( const Matrix< Type >& rMatrix ); +}; + +// ---------------------------------------------------------------------------- + +template< typename Type > +const Type* ContainerHelper::getVectorElement( const ::std::vector< Type >& rVector, sal_Int32 nIndex ) +{ + return ((0 <= nIndex) && (static_cast< size_t >( nIndex ) < rVector.size())) ? &rVector[ static_cast< size_t >( nIndex ) ] : 0; +} + +template< typename Type > +Type* ContainerHelper::getVectorElement( ::std::vector< Type >& rVector, sal_Int32 nIndex ) +{ + return ((0 <= nIndex) && (static_cast< size_t >( nIndex ) < rVector.size())) ? &rVector[ static_cast< size_t >( nIndex ) ] : 0; +} + +template< typename Type > +const Type& ContainerHelper::getVectorElement( const ::std::vector< Type >& rVector, sal_Int32 nIndex, const Type& rDefault ) +{ + return ((0 <= nIndex) && (static_cast< size_t >( nIndex ) < rVector.size())) ? rVector[ static_cast< size_t >( nIndex ) ] : rDefault; +} + +template< typename Type > +Type& ContainerHelper::getVectorElement( const ::std::vector< Type >& rVector, sal_Int32 nIndex, Type& rDefault ) +{ + return ((0 <= nIndex) && (static_cast< size_t >( nIndex ) < rVector.size())) ? rVector[ static_cast< size_t >( nIndex ) ] : rDefault; +} + +template< typename Type, typename KeyType > +const Type* ContainerHelper::getMapElement( const ::std::map< KeyType, Type >& rMap, KeyType nKey ) +{ + typename ::std::map< KeyType, Type >::const_iterator aIt = rMap.find( nKey ); + return (aIt == rMap.end()) ? 0 : &aIt->second; +} + +template< typename Type, typename KeyType > +Type* ContainerHelper::getMapElement( ::std::map< KeyType, Type >& rMap, KeyType nKey ) +{ + typename ::std::map< KeyType, Type >::iterator aIt = rMap.find( nKey ); + return (aIt == rMap.end()) ? 0 : &aIt->second; +} + +template< typename Type, typename KeyType > +const Type& ContainerHelper::getMapElement( const ::std::map< KeyType, Type >& rMap, KeyType nKey, const Type& rDefault ) +{ + typename ::std::map< KeyType, Type >::const_iterator aIt = rMap.find( nKey ); + return (aIt == rMap.end()) ? rDefault : aIt->second; +} + +template< typename Type, typename KeyType > +Type& ContainerHelper::getMapElement( ::std::map< KeyType, Type >& rMap, KeyType nKey, Type& rDefault ) +{ + typename ::std::map< KeyType, Type >::iterator aIt = rMap.find( nKey ); + return (aIt == rMap.end()) ? rDefault : aIt->second; +} + +template< typename Type > +::com::sun::star::uno::Sequence< Type > ContainerHelper::vectorToSequence( const ::std::vector< Type >& rVector ) +{ + if( rVector.empty() ) + return ::com::sun::star::uno::Sequence< Type >(); + return ::com::sun::star::uno::Sequence< Type >( &rVector.front(), static_cast< sal_Int32 >( rVector.size() ) ); +} + +template< typename Type > +::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< Type > > ContainerHelper::matrixToSequenceSequence( const Matrix< Type >& rMatrix ) +{ + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< Type > > aSeq; + if( !rMatrix.empty() ) + { + aSeq.realloc( static_cast< sal_Int32 >( rMatrix.height() ) ); + for( size_t nRow = 0, nHeight = rMatrix.height(); nRow < nHeight; ++nRow ) + aSeq[ static_cast< sal_Int32 >( nRow ) ] = + ::com::sun::star::uno::Sequence< Type >( &rMatrix.row_front( nRow ), static_cast< sal_Int32 >( rMatrix.width() ) ); + } + return aSeq; +} + +// ============================================================================ + +/** This helper manages named objects in a container, which is created on demand. + */ +class ObjectContainer +{ +public: + explicit ObjectContainer( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::rtl::OUString& rServiceName ); + ~ObjectContainer(); + + /** Returns true, if the object with the passed name exists in the container. */ + bool hasObject( const ::rtl::OUString& rObjName ) const; + + /** Returns the object with the passed name from the container. */ + ::com::sun::star::uno::Any getObject( const ::rtl::OUString& rObjName ) const; + + /** Inserts the passed object into the container, returns its final name. */ + ::rtl::OUString insertObject( + const ::rtl::OUString& rObjName, + const ::com::sun::star::uno::Any& rObj, + bool bInsertByUnusedName ); + +private: + void createContainer() const; + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > + mxFactory; /// Factory to create the container. + mutable ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > + mxContainer; /// Container for the objects. + ::rtl::OUString maServiceName; /// Service name to create the container. + sal_Int32 mnIndex; /// Index to create unique identifiers. +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/graphichelper.hxx b/oox/inc/oox/helper/graphichelper.hxx new file mode 100644 index 000000000000..d6e01d0fff6b --- /dev/null +++ b/oox/inc/oox/helper/graphichelper.hxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_GRAPHICHELPER_HXX +#define OOX_HELPER_GRAPHICHELPER_HXX + +#include <deque> +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include "oox/helper/binarystreambase.hxx" + +namespace com { namespace sun { namespace star { + namespace uno { class XComponentContext; } + namespace lang { class XMultiServiceFactory; } + namespace io { class XInputStream; } + namespace graphic { class XGraphic; } + namespace graphic { class XGraphicObject; } + namespace graphic { class XGraphicProvider; } +} } } + +namespace oox { + +// ============================================================================ + +/** Provides helper functions for graphics and graphic objects handling. + + All createGraphicObject() and importGraphicObject() functions create + persistent graphic objects internally and store them in an internal + container to prevent their early destruction. This makes it possible to use + the returned URL of the graphic object in any way (e.g. insert it into a + property map) without needing to store it immediatly at an object that + resolves the graphic object from the passed URL and thus prevents it from + being destroyed. + */ +class GraphicHelper +{ +public: + explicit GraphicHelper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory ); + ~GraphicHelper(); + + /** Imports a graphic from the passed input stream. */ + ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > + importGraphic( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm ); + + /** Imports a graphic from the passed binary memory block. */ + ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > + importGraphic( const StreamDataSequence& rGraphicData ); + + /** Creates a persistent graphic object from the passed graphic. + @return The URL of the created and internally cached graphic object. */ + ::rtl::OUString createGraphicObject( + const ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >& rxGraphic ); + + /** Creates a persistent graphic object from the passed input stream. + @return The URL of the created and internally cached graphic object. */ + ::rtl::OUString importGraphicObject( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm ); + + /** Creates a persistent graphic object from the passed binary memory block. + @return The URL of the created and internally cached graphic object. */ + ::rtl::OUString importGraphicObject( const StreamDataSequence& rGraphicData ); + +private: + typedef ::std::deque< ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphicObject > > GraphicObjectDeque; + + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > mxCompContext; + ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphicProvider > mxGraphicProvider; + GraphicObjectDeque maGraphicObjects; + const ::rtl::OUString maGraphicObjScheme; +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/helper.hxx b/oox/inc/oox/helper/helper.hxx new file mode 100644 index 000000000000..5884855bc50d --- /dev/null +++ b/oox/inc/oox/helper/helper.hxx @@ -0,0 +1,303 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_HELPER_HXX +#define OOX_HELPER_HELPER_HXX + +#include <algorithm> +#include <limits> +#include <boost/static_assert.hpp> +#include <osl/endian.h> +#include <rtl/math.hxx> +#include <rtl/string.hxx> +#include <rtl/ustring.hxx> +#include <string.h> + +namespace oox { + +// Helper macros ============================================================== + +/** Expands to the number of elements in a STATIC data array. */ +#define STATIC_ARRAY_SIZE( array ) \ + (sizeof(array)/sizeof(*(array))) + +/** Expands to a pointer behind the last element of a STATIC data array (like + STL end()). */ +#define STATIC_ARRAY_END( array ) \ + ((array)+STATIC_ARRAY_SIZE(array)) + +/** Expands to the 'index'-th element of a STATIC data array, or to 'def', if + 'index' is out of the array limits. */ +#define STATIC_ARRAY_SELECT( array, index, def ) \ + ((static_cast<size_t>(index) < STATIC_ARRAY_SIZE(array)) ? ((array)[static_cast<size_t>(index)]) : (def)) + +/** Expands to a temporary ::rtl::OString, created from a literal(!) character + array. */ +#define CREATE_OSTRING( ascii ) \ + ::rtl::OString( RTL_CONSTASCII_STRINGPARAM( ascii ) ) + +/** Expands to a temporary ::rtl::OUString, created from a literal(!) ASCII(!) + character array. */ +#define CREATE_OUSTRING( ascii ) \ + ::rtl::OUString::intern( RTL_CONSTASCII_USTRINGPARAM( ascii ) ) + +/** Convert an OUString to an ASCII C string. Use for debug purposes only. */ +#define OUSTRING_TO_CSTR( str ) \ + ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US ).getStr() + +// ============================================================================ + +const sal_Int32 API_RGB_TRANSPARENT = -1; /// Transparent color for API calls. +const sal_Int32 API_RGB_BLACK = 0x00000; /// Black color for API calls. +const sal_Int32 API_RGB_WHITE = 0xFFFFF; /// White color for API calls. + +const sal_Int16 API_LINE_NONE = 0; +const sal_Int16 API_LINE_HAIR = 2; +const sal_Int16 API_LINE_THIN = 35; +const sal_Int16 API_LINE_MEDIUM = 88; +const sal_Int16 API_LINE_THICK = 141; + +const sal_Int16 API_ESCAPE_NONE = 0; /// No escapement. +const sal_Int16 API_ESCAPE_SUPERSCRIPT = 101; /// Superscript: raise characters automatically (magic value 101). +const sal_Int16 API_ESCAPE_SUBSCRIPT = -101; /// Subscript: lower characters automatically (magic value -101). + +const sal_Int8 API_ESCAPEHEIGHT_NONE = 100; /// Relative character height if not escaped. +const sal_Int8 API_ESCAPEHEIGHT_DEFAULT = 58; /// Relative character height if escaped. + +// ============================================================================ + +// Limitate values ------------------------------------------------------------ + +template< typename ReturnType, typename Type > +inline ReturnType getLimitedValue( Type nValue, Type nMin, Type nMax ) +{ + return static_cast< ReturnType >( ::std::min( ::std::max( nValue, nMin ), nMax ) ); +} + +template< typename ReturnType, typename Type > +inline ReturnType getIntervalValue( Type nValue, Type nBegin, Type nEnd ) +{ +// this BOOST_STATIC_ASSERT fails with suncc +// BOOST_STATIC_ASSERT( ::std::numeric_limits< Type >::is_integer ); + Type nInterval = nEnd - nBegin; + Type nCount = (nValue < nBegin) ? -((nBegin - nValue - 1) / nInterval + 1) : ((nValue - nBegin) / nInterval); + return static_cast< ReturnType >( nValue - nCount * nInterval ); +} + +template< typename ReturnType > +inline ReturnType getDoubleIntervalValue( double fValue, double fBegin, double fEnd ) +{ + double fInterval = fEnd - fBegin; + double fCount = (fValue < fBegin) ? -(::rtl::math::approxFloor( (fBegin - fValue - 1.0) / fInterval ) + 1.0) : ::rtl::math::approxFloor( (fValue - fBegin) / fInterval ); + return static_cast< ReturnType >( fValue - fCount * fInterval ); +} + +// Read from bitfields -------------------------------------------------------- + +/** Returns true, if at least one of the bits set in nMask is set in nBitField. */ +template< typename Type > +inline bool getFlag( Type nBitField, Type nMask ) +{ + return (nBitField & nMask) != 0; +} + +/** Returns nSet, if at least one bit of nMask is set in nBitField, otherwise nUnset. */ +template< typename ReturnType, typename Type > +inline ReturnType getFlagValue( Type nBitField, Type nMask, ReturnType nSet, ReturnType nUnset ) +{ + return getFlag( nBitField, nMask ) ? nSet : nUnset; +} + +/** Extracts a value from a bit field. + + Returns the data fragment from nBitField, that starts at bit nStartBit + (0-based, bit 0 is rightmost) with the width of nBitCount. The returned + value will be right-aligned (normalized). + For instance: extractValue<T>(0x4321,8,4) returns 3 (value in bits 8-11). + */ +template< typename ReturnType, typename Type > +inline ReturnType extractValue( Type nBitField, sal_uInt8 nStartBit, sal_uInt8 nBitCount ) +{ + sal_uInt64 nMask = 1; nMask <<= nBitCount; --nMask; + return static_cast< ReturnType >( nMask & (nBitField >> nStartBit) ); +} + +// Write to bitfields --------------------------------------------------------- + +/** Sets or clears (according to bSet) all set bits of nMask in ornBitField. */ +template< typename Type > +inline void setFlag( Type& ornBitField, Type nMask, bool bSet = true ) +{ + if( bSet ) ornBitField |= nMask; else ornBitField &= ~nMask; +} + +/** Inserts a value into a bitfield. + + Inserts the lower nBitCount bits of nValue into ornBitField, starting + there at bit nStartBit. Other contents of ornBitField keep unchanged. + */ +template< typename Type, typename InsertType > +void insertValue( Type& ornBitField, InsertType nValue, sal_uInt8 nStartBit, sal_uInt8 nBitCount ) +{ + sal_uInt64 nMask = 1; nMask <<= nBitCount; --nMask; + Type nNewValue = static_cast< Type >( nValue & nMask ); + (ornBitField &= ~(nMask << nStartBit)) |= (nNewValue << nStartBit); +} + +// ============================================================================ + +/** Optional value, similar to ::boost::optional<>, with convenience accessors. + */ +template< typename Type > +class OptValue +{ +public: + inline explicit OptValue() : mbHasValue( false ) {} + inline explicit OptValue( const Type& rValue ) : maValue( rValue ), mbHasValue( true ) {} + inline explicit OptValue( bool bHasValue, const Type& rValue ) : maValue( rValue ), mbHasValue( bHasValue ) {} + + inline bool has() const { return mbHasValue; } + inline bool operator!() const { return !mbHasValue; } + inline bool differsFrom( const Type& rValue ) const { return mbHasValue && (maValue != rValue); } + + inline const Type& get() const { return maValue; } + inline const Type& get( const Type& rDefValue ) const { return mbHasValue ? maValue : rDefValue; } + + inline void reset() { mbHasValue = false; } + inline void set( const Type& rValue ) { maValue = rValue; mbHasValue = true; } + inline Type& use() { mbHasValue = true; return maValue; } + + inline OptValue& operator=( const Type& rValue ) { set( rValue ); return *this; } + inline void assignIfUsed( const OptValue& rValue ) { if( rValue.mbHasValue ) set( rValue.maValue ); } + +private: + Type maValue; + bool mbHasValue; +}; + +// ============================================================================ + +/** Provides platform independent functions to convert from or to little-endian + byte order, e.g. for reading data from or writing data to memory or a + binary stream. + + On big-endian platforms, the byte order in the passed values is swapped, + this can be used for converting big-endian to and from little-endian data. + + On little-endian platforms, the conversion functions are implemented empty, + thus compilers should completely optimize away the function call. + */ +class ByteOrderConverter +{ +public: + inline static void convertLittleEndian( sal_Int8& ) {} // present for usage in templates + inline static void convertLittleEndian( sal_uInt8& ) {} // present for usage in templates +#ifdef OSL_BIGENDIAN + inline static void convertLittleEndian( sal_Int16& rnValue ) { swap2( reinterpret_cast< sal_uInt8* >( &rnValue ) ); } + inline static void convertLittleEndian( sal_uInt16& rnValue ) { swap2( reinterpret_cast< sal_uInt8* >( &rnValue ) ); } + inline static void convertLittleEndian( sal_Int32& rnValue ) { swap4( reinterpret_cast< sal_uInt8* >( &rnValue ) ); } + inline static void convertLittleEndian( sal_uInt32& rnValue ) { swap4( reinterpret_cast< sal_uInt8* >( &rnValue ) ); } + inline static void convertLittleEndian( sal_Int64& rnValue ) { swap8( reinterpret_cast< sal_uInt8* >( &rnValue ) ); } + inline static void convertLittleEndian( sal_uInt64& rnValue ) { swap8( reinterpret_cast< sal_uInt8* >( &rnValue ) ); } + inline static void convertLittleEndian( float& rfValue ) { swap4( reinterpret_cast< sal_uInt8* >( &rfValue ) ); } + inline static void convertLittleEndian( double& rfValue ) { swap8( reinterpret_cast< sal_uInt8* >( &rfValue ) ); } +#else + inline static void convertLittleEndian( sal_Int16& ) {} + inline static void convertLittleEndian( sal_uInt16& ) {} + inline static void convertLittleEndian( sal_Int32& ) {} + inline static void convertLittleEndian( sal_uInt32& ) {} + inline static void convertLittleEndian( sal_Int64& ) {} + inline static void convertLittleEndian( sal_uInt64& ) {} + inline static void convertLittleEndian( float& ) {} + inline static void convertLittleEndian( double& ) {} +#endif + + /** Reads a value from memory, assuming memory buffer in little-endian. + @param ornValue (out-parameter) Contains the value read from memory. + @param pSrcBuffer The memory buffer to read the value from. + */ + template< typename Type > + inline static void readLittleEndian( Type& ornValue, const void* pSrcBuffer ); + + /** Writes a value to memory, while converting it to little-endian. + @param pDstBuffer The memory buffer to write the value to. + @param nValue The value to be written to memory in little-endian. + */ + template< typename Type > + inline static void writeLittleEndian( void* pDstBuffer, Type nValue ); + +#ifdef OSL_BIGENDIAN +private: + inline static void swap2( sal_uInt8* pnData ); + inline static void swap4( sal_uInt8* pnData ); + inline static void swap8( sal_uInt8* pnData ); +#endif +}; + +// ---------------------------------------------------------------------------- + +template< typename Type > +inline void ByteOrderConverter::readLittleEndian( Type& ornValue, const void* pSrcBuffer ) +{ + memcpy( &ornValue, pSrcBuffer, sizeof( Type ) ); + convertLittleEndian( ornValue ); +} + +template< typename Type > +inline void ByteOrderConverter::writeLittleEndian( void* pDstBuffer, Type nValue ) +{ + convertLittleEndian( nValue ); + memcpy( pDstBuffer, &nValue, sizeof( Type ) ); +} + +#ifdef OSL_BIGENDIAN +inline void ByteOrderConverter::swap2( sal_uInt8* pnData ) +{ + ::std::swap( pnData[ 0 ], pnData[ 1 ] ); +} + +inline void ByteOrderConverter::swap4( sal_uInt8* pnData ) +{ + ::std::swap( pnData[ 0 ], pnData[ 3 ] ); + ::std::swap( pnData[ 1 ], pnData[ 2 ] ); +} + +inline void ByteOrderConverter::swap8( sal_uInt8* pnData ) +{ + ::std::swap( pnData[ 0 ], pnData[ 7 ] ); + ::std::swap( pnData[ 1 ], pnData[ 6 ] ); + ::std::swap( pnData[ 2 ], pnData[ 5 ] ); + ::std::swap( pnData[ 3 ], pnData[ 4 ] ); +} +#endif + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/modelobjecthelper.hxx b/oox/inc/oox/helper/modelobjecthelper.hxx new file mode 100644 index 000000000000..cead2ad74fb1 --- /dev/null +++ b/oox/inc/oox/helper/modelobjecthelper.hxx @@ -0,0 +1,94 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_MODELOBJECTHELPER_HXX +#define OOX_HELPER_MODELOBJECTHELPER_HXX + +#include <com/sun/star/uno/Reference.hxx> +#include "oox/helper/containerhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace lang { class XMultiServiceFactory; } + namespace awt { struct Gradient; } + namespace drawing { struct LineDash; } + namespace drawing { struct PolyPolygonBezierCoords; } +} } } + +namespace oox { + +// ============================================================================ + +/** Contains tables for named drawing objects for a document model. + + Contains tables for named line markers, line dashes, fill gradients, and + fill bitmaps. The class is needed to handle different document models in + the same filter (e.g. embedded charts) which carry their own drawing object + tables. + */ +class ModelObjectHelper +{ +public: + explicit ModelObjectHelper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory ); + + /** Returns true, if the model contains a line marker with the passed name. */ + bool hasLineMarker( const ::rtl::OUString& rMarkerName ) const; + + /** Inserts a new named line marker, overwrites an existing line marker + with the same name. Returns true, if the marker could be inserted. */ + bool insertLineMarker( + const ::rtl::OUString& rMarkerName, + const ::com::sun::star::drawing::PolyPolygonBezierCoords& rMarker ); + + /** Inserts a new named line dash, returns the line dash name, based on an + internal constant name with a new unused index appended. */ + ::rtl::OUString insertLineDash( const ::com::sun::star::drawing::LineDash& rDash ); + + /** Inserts a new named fill gradient, returns the gradient name, based on + an internal constant name with a new unused index appended. */ + ::rtl::OUString insertFillGradient( const ::com::sun::star::awt::Gradient& rGradient ); + + /** Inserts a new named fill bitmap, returns the bitmap name, based on an + internal constant name with a new unused index appended. */ + ::rtl::OUString insertFillBitmap( const ::rtl::OUString& rGraphicUrl ); + +private: + ObjectContainer maMarkerContainer; + ObjectContainer maDashContainer; + ObjectContainer maGradientContainer; + ObjectContainer maBitmapContainer; + const ::rtl::OUString maDashNameBase; + const ::rtl::OUString maGradientNameBase; + const ::rtl::OUString maBitmapNameBase; +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/olestorage.hxx b/oox/inc/oox/helper/olestorage.hxx new file mode 100644 index 000000000000..a8174a167729 --- /dev/null +++ b/oox/inc/oox/helper/olestorage.hxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_OLESTORAGE_HXX +#define OOX_HELPER_OLESTORAGE_HXX + +#include "oox/helper/storagebase.hxx" + +namespace com { namespace sun { namespace star { + namespace lang { class XMultiServiceFactory; } + namespace container { class XNameContainer; } + namespace container { class XNameAccess; } +} } } + +namespace oox { + +// ============================================================================ + +/** Implements stream access for binary OLE storages. */ +class OleStorage : public StorageBase +{ +public: + explicit OleStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream, + bool bBaseStreamAccess ); + + explicit OleStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxStream, + bool bBaseStreamAccess ); + + virtual ~OleStorage(); + +private: + explicit OleStorage( + const OleStorage& rParentStorage, + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& rxElementsAccess, + const ::rtl::OUString& rElementName ); + + /** Returns true, if the object represents a valid storage. */ + virtual bool implIsStorage() const; + + /** Returns the com.sun.star.embed.XStorage interface of the current storage. + + @attention + This function is not implemented for binary OLE storages. + */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > + implGetXStorage() const; + + /** Returns the names of all elements of this storage. */ + virtual void implGetElementNames( ::std::vector< ::rtl::OUString >& orElementNames ) const; + + /** Opens and returns the specified sub storage from the storage. */ + virtual StorageRef implOpenSubStorage( const ::rtl::OUString& rElementName, bool bCreate ); + + /** Opens and returns the specified input stream from the storage. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + implOpenInputStream( const ::rtl::OUString& rElementName ); + + /** Opens and returns the specified output stream from the storage. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + implOpenOutputStream( const ::rtl::OUString& rElementName ); + +private: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > XNameContainerRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > XNameAccessRef; + + XNameContainerRef mxStorage; /// Complete storage based on input or output stream. + XNameAccessRef mxElements; /// Access to elements of current sub storage. +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/progressbar.hxx b/oox/inc/oox/helper/progressbar.hxx new file mode 100644 index 000000000000..f5ea98816915 --- /dev/null +++ b/oox/inc/oox/helper/progressbar.hxx @@ -0,0 +1,145 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_PROGRESSBAR_HXX +#define OOX_HELPER_PROGRESSBAR_HXX + +#include <boost/shared_ptr.hpp> +#include <com/sun/star/uno/Reference.hxx> + +namespace rtl { class OUString; } + +namespace com { namespace sun { namespace star { + namespace task { class XStatusIndicator; } +} } } + +namespace oox { + +// Interfaces ================================================================= + +/** Interface for progress bar classes. + */ +class IProgressBar +{ +public: + virtual ~IProgressBar(); + + /** Returns the current position of the progress bar. + + @return Position of the progress bar, in the range from 0.0 (beginning + of the progress bar) to 1.0 (end of the progress bar) inclusive. + */ + virtual double getPosition() const = 0; + + /** Sets the current position of the progress bar. + + @param fPosition New position of the progress bar, in the range from + 0.0 (beginning of the progress bar) to 1.0 (end of the progress bar) + inclusive. + */ + virtual void setPosition( double fPosition ) = 0; +}; + +typedef ::boost::shared_ptr< IProgressBar > IProgressBarRef; + +// ---------------------------------------------------------------------------- + +class ISegmentProgressBar; +typedef ::boost::shared_ptr< ISegmentProgressBar > ISegmentProgressBarRef; + +/** Interface for a segment in a progress bar, that is able to create sub + segments from itself. + */ +class ISegmentProgressBar : public IProgressBar +{ +public: + virtual ~ISegmentProgressBar(); + + /** Returns the length that is still free for creating sub segments. */ + virtual double getFreeLength() const = 0; + + /** Adds a new segment with the specified length. */ + virtual ISegmentProgressBarRef createSegment( double fLength ) = 0; +}; + +// ============================================================================ +// ============================================================================ + +/** A simple progress bar. + */ +class ProgressBar : public IProgressBar +{ +public: + explicit ProgressBar( + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XStatusIndicator >& rxIndicator, + const ::rtl::OUString& rText ); + + virtual ~ProgressBar(); + + /** Returns the current position of the progress bar. */ + virtual double getPosition() const; + /** Sets the current position of the progress bar. */ + virtual void setPosition( double fPosition ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::task::XStatusIndicator > + mxIndicator; + double mfPosition; +}; + +// ============================================================================ + +/** A progress bar containing several independent segments. + */ +class SegmentProgressBar : public ISegmentProgressBar +{ +public: + explicit SegmentProgressBar( + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XStatusIndicator >& rxIndicator, + const ::rtl::OUString& rText ); + + /** Returns the current position of the progress bar segment. */ + virtual double getPosition() const; + /** Sets the current position of the progress bar segment. */ + virtual void setPosition( double fPosition ); + + /** Returns the length that is still free for creating sub segments. */ + virtual double getFreeLength() const; + /** Adds a new segment with the specified length. */ + virtual ISegmentProgressBarRef createSegment( double fLength ); + +private: + ProgressBar maProgress; + double mfFreeStart; +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/propertymap.hxx b/oox/inc/oox/helper/propertymap.hxx new file mode 100644 index 000000000000..30df15d7e5c6 --- /dev/null +++ b/oox/inc/oox/helper/propertymap.hxx @@ -0,0 +1,101 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_PROPERTYMAP_HXX +#define OOX_HELPER_PROPERTYMAP_HXX + +#include <vector> +#include <map> +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Sequence.hxx> + +namespace com { namespace sun { namespace star { namespace beans { + struct PropertyValue; + class XPropertySet; +} } } } + +namespace oox { + +struct PropertyList; + +// ============================================================================ + +typedef ::std::map< sal_Int32, ::com::sun::star::uno::Any > PropertyMapBase; + +/** A helper that maps property identifiers to property values. + + The property identifiers are generated on compile time and refer to the + property name strings that are held by a static vector. The identifier to + name mapping is done internally while the properties are written to + property sets. + */ +class PropertyMap : public PropertyMapBase +{ +public: + explicit PropertyMap(); + ~PropertyMap(); + + /** Returns the name of the passed property identifier. */ + static const ::rtl::OUString& getPropertyName( sal_Int32 nPropId ); + + /** Returns true, if the map contains a property with the passed identifier. */ + inline bool hasProperty( sal_Int32 nPropId ) const + { return find( nPropId ) != end(); } + + /** Returns the property value of the specified property, or 0 if not found. */ + const ::com::sun::star::uno::Any* getProperty( sal_Int32 nPropId ) const; + + /** Sets the specified property to the passed value. Does nothing, if the + identifier is invalid. */ + template< typename Type > + inline void setProperty( sal_Int32 nPropId, const Type& rValue ) + { if( nPropId >= 0 ) (*this)[ nPropId ] <<= rValue; } + + /** Returns a sequence of property values, filled with all contained properties. */ + ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > + makePropertyValueSequence() const; + + /** Fills the passed sequences of names and anys with all contained properties. */ + void fillSequences( + ::com::sun::star::uno::Sequence< ::rtl::OUString >& rNames, + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rValues ) const; + + /** Creates and fills a new instance supporting the XPropertySet interface. */ + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > + makePropertySet() const; + +private: + const PropertyList* mpPropNames; +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/propertyset.hxx b/oox/inc/oox/helper/propertyset.hxx new file mode 100644 index 000000000000..bdb81c6c3e83 --- /dev/null +++ b/oox/inc/oox/helper/propertyset.hxx @@ -0,0 +1,162 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_PROPERTYSET_HXX +#define OOX_HELPER_PROPERTYSET_HXX + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XMultiPropertySet.hpp> + +namespace oox { + +class PropertyMap; + +// ============================================================================ + +/** A wrapper for a UNO property set. + + This class provides functions to silently get and set properties (without + exceptions, without the need to check validity of the UNO property set). + + An instance is constructed with the reference to a UNO property set or any + other interface (the constructor will query for the + com.sun.star.beans.XPropertySet interface then). The reference to the + property set will be kept as long as the instance of this class is alive. + + The functions getProperties() and setProperties() try to handle all passed + values at once, using the com.sun.star.beans.XMultiPropertySet interface. + If the implementation does not support the XMultiPropertySet interface, all + properties are handled separately in a loop. + */ +class PropertySet +{ +public: + inline explicit PropertySet() {} + + /** Constructs a property set wrapper with the passed UNO property set. */ + inline explicit PropertySet( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& rxPropSet ) + { set( rxPropSet ); } + + /** Constructs a property set wrapper after querying the XPropertySet interface. */ + template< typename Type > + inline explicit PropertySet( const Type& rObject ) { set( rObject ); } + + /** Sets the passed UNO property set and releases the old UNO property set. */ + void set( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& rxPropSet ); + + /** Queries the passed object (interface or any) for an XPropertySet and releases the old UNO property set. */ + template< typename Type > + inline void set( const Type& rObject ) + { set( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >( rObject, ::com::sun::star::uno::UNO_QUERY ) ); } + + /** Returns true, if the contained XPropertySet interface is valid. */ + inline bool is() const { return mxPropSet.is(); } + + /** Returns the contained XPropertySet interface. */ + inline ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > + getXPropertySet() const { return mxPropSet; } + + // Get properties --------------------------------------------------------- + + /** Gets the specified property from the property set. + @return true, if the any could be filled with the property value. */ + bool getAnyProperty( ::com::sun::star::uno::Any& orValue, sal_Int32 nPropId ) const; + + /** Gets the specified property from the property set. + @return true, if the passed variable could be filled with the property value. */ + template< typename Type > + inline bool getProperty( Type& orValue, sal_Int32 nPropId ) const; + + /** Gets the specified boolean property from the property set. + @return true = property contains true; false = property contains false or error occured. */ + bool getBoolProperty( sal_Int32 nPropId ) const; + + /** Gets the specified properties from the property set. Tries to use the XMultiPropertySet interface. + @param orValues (out-parameter) The related property values. + @param rPropNames The property names. MUST be ordered alphabetically. */ + void getProperties( + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& orValues, + const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rPropNames ) const; + + // Set properties --------------------------------------------------------- + + /** Puts the passed any into the property set. */ + void setAnyProperty( sal_Int32 nPropId, const ::com::sun::star::uno::Any& rValue ); + + /** Puts the passed value into the property set. */ + template< typename Type > + inline void setProperty( sal_Int32 nPropId, const Type& rValue ); + + /** Puts the passed properties into the property set. Tries to use the XMultiPropertySet interface. + @param rPropNames The property names. MUST be ordered alphabetically. + @param rValues The related property values. */ + void setProperties( + const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rPropNames, + const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rValues ); + + /** Puts the passed property map into the property set. Tries to use the XMultiPropertySet interface. + @param rPropertyMap The property map. */ + void setProperties( const PropertyMap& rPropertyMap ); + + // ------------------------------------------------------------------------ +private: + /** Gets the specified property from the property set. + @return true, if the any could be filled with the property value. */ + bool getAnyProperty( ::com::sun::star::uno::Any& orValue, const ::rtl::OUString& rPropName ) const; + + /** Puts the passed any into the property set. */ + void setAnyProperty( const ::rtl::OUString& rPropName, const ::com::sun::star::uno::Any& rValue ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > + mxPropSet; /// The mandatory property set interface. + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet > + mxMultiPropSet; /// The optional multi property set interface. +}; + +// ---------------------------------------------------------------------------- + +template< typename Type > +inline bool PropertySet::getProperty( Type& orValue, sal_Int32 nPropId ) const +{ + ::com::sun::star::uno::Any aAny; + return getAnyProperty( aAny, nPropId ) && (aAny >>= orValue); +} + +template< typename Type > +inline void PropertySet::setProperty( sal_Int32 nPropId, const Type& rValue ) +{ + setAnyProperty( nPropId, ::com::sun::star::uno::Any( rValue ) ); +} + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/recordinputstream.hxx b/oox/inc/oox/helper/recordinputstream.hxx new file mode 100644 index 000000000000..ee05ce480a75 --- /dev/null +++ b/oox/inc/oox/helper/recordinputstream.hxx @@ -0,0 +1,58 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_RECORDINPUTSTREAM_HXX +#define OOX_HELPER_RECORDINPUTSTREAM_HXX + +#include "oox/helper/binaryinputstream.hxx" + +namespace oox { + +// ============================================================================ + +/** Reads the contents of a record from a binary OOBIN stream. */ +class RecordInputStream : public SequenceInputStream +{ +public: + explicit RecordInputStream( const StreamDataSequence& rData ); + + /** Reads a string with leading 16-bit or 32-bit length field. */ + ::rtl::OUString readString( bool b32BitLen = true ); + + /** Stream operator for integral types. */ + template< typename Type > + inline RecordInputStream& operator>>( Type& ornValue ) { readValue( ornValue ); return *this; } + /** Stream operator for an ::rtl::OUString, reads 32-bit string length and Unicode array. */ + inline RecordInputStream& operator>>( ::rtl::OUString& orString ) { orString = readString(); return *this; } +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/storagebase.hxx b/oox/inc/oox/helper/storagebase.hxx new file mode 100644 index 000000000000..b23032fe2ac0 --- /dev/null +++ b/oox/inc/oox/helper/storagebase.hxx @@ -0,0 +1,172 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_STORAGEBASE_HXX +#define OOX_HELPER_STORAGEBASE_HXX + +#include <vector> +#include <map> +#include <boost/shared_ptr.hpp> +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <oox/dllapi.h> + +namespace com { namespace sun { namespace star { + namespace embed { class XStorage; } + namespace io { class XInputStream; } + namespace io { class XOutputStream; } + namespace io { class XStream; } +} } } + +namespace oox { + +// ============================================================================ + +class StorageBase; +typedef ::boost::shared_ptr< StorageBase > StorageRef; + +/** Base class for storage access implementations. + + Derived classes will be used to encapsulate storage access implementations + for ZIP storages containing XML streams, and OLE storages containing binary + data streams. + */ +class OOX_DLLPUBLIC StorageBase +{ +public: + explicit StorageBase( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream, + bool bBaseStreamAccess ); + + explicit StorageBase( + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream, + bool bBaseStreamAccess ); + + virtual ~StorageBase(); + + /** Returns true, if the object represents a valid storage. */ + bool isStorage() const; + + /** Returns the com.sun.star.embed.XStorage interface of the current storage. */ + ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > + getXStorage() const; + + /** Returns the element name of this storage. */ + const ::rtl::OUString& getName() const; + + /** Returns the full path of this storage. */ + ::rtl::OUString getPath() const; + + /** Fills the passed vector with the names of all elements of this storage. */ + void getElementNames( ::std::vector< ::rtl::OUString >& orElementNames ) const; + + /** Opens and returns the specified sub storage from the storage. + + @param rStorageName + The name of the embedded storage. The name may contain slashes to + open storages from embedded substorages. + @param bCreate + True = create missing sub storages (for export filters). + */ + StorageRef openSubStorage( const ::rtl::OUString& rStorageName, bool bCreate ); + + /** Opens and returns the specified input stream from the storage. + + @param rStreamName + The name of the embedded storage stream. The name may contain + slashes to open streams from embedded substorages. If base stream + access has been enabled in the constructor, the base stream can be + accessed by passing an empty string as stream name. + */ + ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + openInputStream( const ::rtl::OUString& rStreamName ); + + /** Opens and returns the specified output stream from the storage. + + @param rStreamName + The name of the embedded storage stream. The name may contain + slashes to create and open streams in embedded substorages. If base + stream access has been enabled in the constructor, the base stream + can be accessed by passing an empty string as stream name. + */ + ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + openOutputStream( const ::rtl::OUString& rStreamName ); + + /** Commits the changes to the storage and all the substorages. (in case it is transacted object) + */ + void commit(); + +protected: + /** Special constructor for sub storage objects. */ + explicit StorageBase( const StorageBase& rParentStorage, const ::rtl::OUString& rStorageName ); + +private: + StorageBase( const StorageBase& ); + StorageBase& operator=( const StorageBase& ); + + /** Returns true, if the object represents a valid storage. */ + virtual bool implIsStorage() const = 0; + + /** Returns the com.sun.star.embed.XStorage interface of the current storage. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > + implGetXStorage() const = 0; + + /** Returns the names of all elements of this storage. */ + virtual void implGetElementNames( ::std::vector< ::rtl::OUString >& orElementNames ) const = 0; + + /** Implementation of opening a storage element. */ + virtual StorageRef implOpenSubStorage( const ::rtl::OUString& rElementName, bool bCreate ) = 0; + + /** Implementation of opening an input stream element. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + implOpenInputStream( const ::rtl::OUString& rElementName ) = 0; + + /** Implementation of opening an output stream element. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + implOpenOutputStream( const ::rtl::OUString& rElementName ) = 0; + + StorageRef getSubStorage( const ::rtl::OUString& rElementName, bool bCreate ); + +private: + typedef ::std::map< ::rtl::OUString, StorageRef > SubStorageMap; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > XInputStreamRef; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > XStreamRef; + + SubStorageMap maSubStorages; /// Map of direct sub storages. + XInputStreamRef mxInStream; /// Cached base input stream (to keep it alive). + XStreamRef mxOutStream; /// Cached base output stream (to keep it alive). + ::rtl::OUString maStorageName; /// Name of this storage, if it is a substorage. + const StorageBase* mpParentStorage; /// Parent storage if this is a sub storage. + bool mbBaseStreamAccess; /// True = access base streams with empty stream name. +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/helper/zipstorage.hxx b/oox/inc/oox/helper/zipstorage.hxx new file mode 100644 index 000000000000..b6eef63b47de --- /dev/null +++ b/oox/inc/oox/helper/zipstorage.hxx @@ -0,0 +1,93 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_HELPER_ZIPSTORAGE_HXX +#define OOX_HELPER_ZIPSTORAGE_HXX + +#include "oox/helper/storagebase.hxx" + +namespace com { namespace sun { namespace star { + namespace lang { class XMultiServiceFactory; } +} } } + +namespace oox { + +// ============================================================================ + +/** Implements stream access for ZIP storages containing XML streams. */ +class ZipStorage : public StorageBase +{ +public: + explicit ZipStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream ); + + explicit ZipStorage( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxStream ); + + virtual ~ZipStorage(); + +private: + explicit ZipStorage( + const ZipStorage& rParentStorage, + const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& rxStorage, + const ::rtl::OUString& rElementName ); + + /** Returns true, if the object represents a valid storage. */ + virtual bool implIsStorage() const; + + /** Returns the com.sun.star.embed.XStorage interface of the current storage. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > + implGetXStorage() const; + + /** Returns the names of all elements of this storage. */ + virtual void implGetElementNames( ::std::vector< ::rtl::OUString >& orElementNames ) const; + + /** Opens and returns the specified sub storage from the storage. */ + virtual StorageRef implOpenSubStorage( const ::rtl::OUString& rElementName, bool bCreate ); + + /** Opens and returns the specified input stream from the storage. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + implOpenInputStream( const ::rtl::OUString& rElementName ); + + /** Opens and returns the specified output stream from the storage. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > + implOpenOutputStream( const ::rtl::OUString& rElementName ); + +private: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > XStorageRef; + + XStorageRef mxStorage; /// Storage based on input or output stream. +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/ole/axbinaryreader.hxx b/oox/inc/oox/ole/axbinaryreader.hxx new file mode 100644 index 000000000000..3db0bae7cee4 --- /dev/null +++ b/oox/inc/oox/ole/axbinaryreader.hxx @@ -0,0 +1,185 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_OLE_AXBINARYREADER_HXX +#define OOX_OLE_AXBINARYREADER_HXX + +#include "oox/helper/binaryinputstream.hxx" +#include "oox/helper/containerhelper.hxx" + +namespace oox { +namespace ole { + +// ============================================================================ + +/** A wrapper for an unseekable binary input stream. */ +class AxAlignedInputStream : public BinaryInputStream +{ +public: + explicit AxAlignedInputStream( BinaryInputStream& rInStrm ); + + /** Return the current stream position (relative to position at construction time). */ + virtual sal_Int64 tell() const; + /** Seeks the stream to the passed position, if it is behind the current position. */ + virtual void seek( sal_Int64 nPos ); + + /** Reads nBytes bytes to the passed sequence. + @return Number of bytes really read. */ + virtual sal_Int32 readData( StreamDataSequence& orData, sal_Int32 nBytes ); + /** Reads nBytes bytes to the (existing) buffer opMem. + @return Number of bytes really read. */ + virtual sal_Int32 readMemory( void* opMem, sal_Int32 nBytes ); + /** Seeks the stream forward by the passed number of bytes. */ + virtual void skip( sal_Int32 nBytes ); + + /** Aligns the stream to a multiple of the passed size. */ + void align( size_t nSize ); + + /** Aligns the stream according to the passed type and reads an atomar value. */ + template< typename Type > + inline Type readAligned() { align( sizeof( Type ) ); return readValue< Type >(); } + /** Aligns the stream according to the passed type and skips the size of the type. */ + template< typename Type > + inline void skipAligned() { align( sizeof( Type ) ); skip( sizeof( Type ) ); } + +private: + BinaryInputStream& mrInStrm; /// The wrapped input stream. + sal_Int64 mnStrmPos; /// Tracks relative position in the stream. +}; + +// ============================================================================ + +/** Import helper to read simple and complex ActiveX form control properties + from a binary input stream. */ +class AxBinaryPropertyReader +{ +public: + explicit AxBinaryPropertyReader( BinaryInputStream& rInStrm, bool b64BitPropFlags = false ); + + /** Reads the next integer property value from the stream, if the + respective flag in the property mask is set. */ + template< typename StreamType, typename DataType > + inline void readIntProperty( DataType& ornValue ) + { if( startNextProperty() ) ornValue = maInStrm.readAligned< StreamType >(); } + /** Reads the next boolean property value from the stream, if the + respective flag in the property mask is set. */ + void readBoolProperty( bool& orbValue, bool bReverse = false ); + /** Reads the next pair property from the stream, if the respective flag in + the property mask is set. */ + void readPairProperty( sal_Int32& ornValue1, sal_Int32& ornValue2 ); + /** Reads the next string property from the stream, if the respective flag + in the property mask is set. */ + void readStringProperty( ::rtl::OUString& orValue ); + /** Reads the next picture property from the stream, if the respective flag + in the property mask is set. */ + void readPictureProperty( StreamDataSequence& orPicData ); + + /** Skips the next integer property value in the stream, if the respective + flag in the property mask is set. */ + template< typename StreamType > + inline void skipIntProperty() { if( startNextProperty() ) maInStrm.skipAligned< StreamType >(); } + /** Skips the next boolean property value in the stream, if the respective + flag in the property mask is set. */ + inline void skipBoolProperty() { startNextProperty(); } + /** Skips the next string property in the stream, if the respective flag in + the property mask is set. */ + inline void skipStringProperty() { readStringProperty( maDummyString ); } + /** Skips the next picture property in the stream, if the respective flag + in the property mask is set. */ + inline void skipPictureProperty() { readPictureProperty( maDummyPicData ); } + /** Has to be called for undefined properties. If the respective flag in + the mask is set, the property import cannot be finished successfully. */ + inline void skipUndefinedProperty() { ensureValid( !startNextProperty() ); } + + /** Final processing, reads contents of all complex properties. */ + bool finalizeImport(); + +private: + bool ensureValid( bool bCondition = true ); + bool startNextProperty(); + +private: + /** Base class for complex properties such as string, point, size, GUID, picture. */ + struct ComplexProperty + { + virtual ~ComplexProperty(); + virtual bool readProperty( AxAlignedInputStream& rInStrm ) = 0; + }; + + /** Complex property for a 32-bit value pair, e.g. point or size. */ + struct PairProperty : public ComplexProperty + { + sal_Int32& mrnValue1; + sal_Int32& mrnValue2; + + inline explicit PairProperty( sal_Int32& rnValue1, sal_Int32& rnValue2 ) : + mrnValue1( rnValue1 ), mrnValue2( rnValue2 ) {} + virtual bool readProperty( AxAlignedInputStream& rInStrm ); + }; + + /** Complex property for a string value. */ + struct StringProperty : public ComplexProperty + { + ::rtl::OUString& mrValue; + sal_uInt32 mnSize; + + inline explicit StringProperty( ::rtl::OUString& rValue, sal_uInt32 nSize ) : + mrValue( rValue ), mnSize( nSize ) {} + virtual bool readProperty( AxAlignedInputStream& rInStrm ); + }; + + /** Stream property for a picture or mouse icon. */ + struct PictureProperty : public ComplexProperty + { + StreamDataSequence& mrPicData; + + inline explicit PictureProperty( StreamDataSequence& rPicData ) : + mrPicData( rPicData ) {} + virtual bool readProperty( AxAlignedInputStream& rInStrm ); + }; + + typedef RefVector< ComplexProperty > ComplexPropVector; + +private: + AxAlignedInputStream maInStrm; /// The input stream to read from. + ComplexPropVector maLargeProps; /// Stores info for all used large properties. + ComplexPropVector maStreamProps; /// Stores info for all used stream data properties. + StreamDataSequence maDummyPicData; /// Dummy picture for unsupported properties. + ::rtl::OUString maDummyString; /// Dummy string for unsupported properties. + sal_Int64 mnPropFlags; /// Flags specifying existing properties. + sal_Int64 mnNextProp; /// Next property to read. + sal_Int64 mnPropsEnd; /// End position of simple/large properties. + bool mbValid; /// True = stream still valid. +}; + +// ============================================================================ + +} // namespace ole +} // namespace oox + +#endif + diff --git a/oox/inc/oox/ole/axcontrol.hxx b/oox/inc/oox/ole/axcontrol.hxx new file mode 100644 index 000000000000..b5a5741d134d --- /dev/null +++ b/oox/inc/oox/ole/axcontrol.hxx @@ -0,0 +1,352 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_OLE_AXCONTROL_HXX +#define OOX_OLE_AXCONTROL_HXX + +#include <memory> +#include "oox/helper/binarystreambase.hxx" + +namespace com { namespace sun { namespace star { + namespace awt { class XControlModel; } +} } } + +namespace oox { + class BinaryInputStream; + class PropertyMap; +} + +namespace oox { +namespace ole { + +class AxControlHelper; + +// ============================================================================ + +/** Base class for all models of ActiveX form controls. */ +class AxControlModelBase +{ +public: + virtual ~AxControlModelBase(); + + /** Derived classes set specific OOXML properties at the model structure. */ + virtual void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue ); + /** Derived classes set binary data (picture, mouse icon) at the model structure. */ + virtual void importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ); + /** Derived classes import a form control model from the passed input stream. */ + virtual void importBinaryModel( BinaryInputStream& rInStrm ); + + /** Derived classes return the UNO service name used to construct the control component. */ + virtual ::rtl::OUString getServiceName() const = 0; + /** Derived classes convert all control properties. */ + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; + +protected: + explicit AxControlModelBase(); + +protected: + sal_Int32 mnWidth; + sal_Int32 mnHeight; +}; + +// ============================================================================ + +class AxFontDataModel : public AxControlModelBase +{ +public: + explicit AxFontDataModel(); + + virtual void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue ); + virtual void importBinaryModel( BinaryInputStream& rInStrm ); + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; + +private: + ::rtl::OUString maFontName; /// Name of the used font. + sal_uInt32 mnFontEffects; /// Font effect flags. + sal_Int32 mnFontHeight; /// Height of the font (not really twips, see code). + sal_Int32 mnFontCharSet; /// Windows character set of the font. + sal_Int32 mnHorAlign; /// Horizontal text alignment. +}; + +// ============================================================================ + +class AxCommandButtonModel : public AxFontDataModel +{ +public: + explicit AxCommandButtonModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue ); + virtual void importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ); + virtual void importBinaryModel( BinaryInputStream& rInStrm ); + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; + +private: + StreamDataSequence maPictureData; /// Binary picture stream. + ::rtl::OUString maCaption; /// Visible caption of the button. + sal_uInt32 mnTextColor; /// Text color. + sal_uInt32 mnBackColor; /// Fill color. + sal_uInt32 mnFlags; /// Various flags. + sal_uInt32 mnPicturePos; /// Position of the picture relative to text. + bool mbFocusOnClick; /// True = take focus on click. +}; + +// ============================================================================ + +class AxLabelModel : public AxFontDataModel +{ +public: + explicit AxLabelModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue ); + virtual void importBinaryModel( BinaryInputStream& rInStrm ); + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; + +private: + ::rtl::OUString maCaption; /// Visible caption of the button. + sal_uInt32 mnTextColor; /// Text color. + sal_uInt32 mnBackColor; /// Fill color. + sal_uInt32 mnFlags; /// Various flags. + sal_uInt32 mnBorderColor; /// Flat border color. + sal_Int32 mnBorderStyle; /// Flat border style. + sal_Int32 mnSpecialEffect; /// 3D border effect. +}; + +// ============================================================================ + +class AxImageModel : public AxControlModelBase +{ +public: + explicit AxImageModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue ); + virtual void importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ); + virtual void importBinaryModel( BinaryInputStream& rInStrm ); + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; + +private: + StreamDataSequence maPictureData; /// Binary picture stream. + sal_uInt32 mnBackColor; /// Fill color. + sal_uInt32 mnFlags; /// Various flags. + sal_uInt32 mnBorderColor; /// Flat border color. + sal_Int32 mnBorderStyle; /// Flat border style. + sal_Int32 mnSpecialEffect; /// 3D border effect. + sal_Int32 mnPicSizeMode; /// Clip, stretch, zoom. + sal_Int32 mnPicAlign; /// Anchor position of the picture. + bool mbPicTiling; /// True = picture is repeated. +}; + +// ============================================================================ + +class AxMorphDataModel : public AxFontDataModel +{ +public: + explicit AxMorphDataModel(); + + virtual void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue ); + virtual void importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ); + virtual void importBinaryModel( BinaryInputStream& rInStrm ); + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; + +protected: + StreamDataSequence maPictureData; /// Binary picture stream. + ::rtl::OUString maCaption; /// Visible caption of the button. + ::rtl::OUString maValue; /// Current value of the control. + ::rtl::OUString maGroupName; /// Group name for option buttons. + sal_uInt32 mnTextColor; /// Text color. + sal_uInt32 mnBackColor; /// Fill color. + sal_uInt32 mnFlags; /// Various flags. + sal_uInt32 mnPicturePos; /// Position of the picture relative to text. + sal_uInt32 mnBorderColor; /// Flat border color. + sal_Int32 mnBorderStyle; /// Flat border style. + sal_Int32 mnSpecialEffect; /// 3D border effect. + sal_Int32 mnDisplayStyle; /// Type of the morph control. + sal_Int32 mnMultiSelect; /// Selection mode. + sal_Int32 mnScrollBars; /// Horizontal/vertical scroll bar. + sal_Int32 mnMatchEntry; /// Auto completion mode. + sal_Int32 mnShowDropButton; /// When to show the dropdown button. + sal_Int32 mnMaxLength; /// Maximum character count. + sal_Int32 mnPasswordChar; /// Password character in edit fields. + sal_Int32 mnListRows; /// Number of rows in dropdown box. +}; + +// ============================================================================ + +class AxToggleButtonModel : public AxMorphDataModel +{ +public: + explicit AxToggleButtonModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; +}; + +// ============================================================================ + +class AxCheckBoxModel : public AxMorphDataModel +{ +public: + explicit AxCheckBoxModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; +}; + +// ============================================================================ + +class AxOptionButtonModel : public AxMorphDataModel +{ +public: + explicit AxOptionButtonModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; +}; + +// ============================================================================ + +class AxTextBoxModel : public AxMorphDataModel +{ +public: + explicit AxTextBoxModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; +}; + +// ============================================================================ + +class AxListBoxModel : public AxMorphDataModel +{ +public: + explicit AxListBoxModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; +}; + +// ============================================================================ + +class AxComboBoxModel : public AxMorphDataModel +{ +public: + explicit AxComboBoxModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; +}; + +// ============================================================================ + +class AxSpinButtonModel : public AxControlModelBase +{ +public: + explicit AxSpinButtonModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue ); + virtual void importBinaryModel( BinaryInputStream& rInStrm ); + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; + +private: + sal_uInt32 mnArrowColor; /// Button arrow color. + sal_uInt32 mnBackColor; /// Fill color. + sal_uInt32 mnFlags; /// Various flags. + sal_Int32 mnOrientation; /// Orientation of the buttons. + sal_Int32 mnMin; /// Minimum of the value range. + sal_Int32 mnMax; /// Maximum of the value range. + sal_Int32 mnPosition; /// Value of the spin button. + sal_Int32 mnSmallChange; /// Increment step size. + sal_Int32 mnDelay; /// Repeat delay in milliseconds. +}; + +// ============================================================================ + +class AxScrollBarModel : public AxControlModelBase +{ +public: + explicit AxScrollBarModel(); + + virtual ::rtl::OUString getServiceName() const; + virtual void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue ); + virtual void importBinaryModel( BinaryInputStream& rInStrm ); + virtual void convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const; + +private: + sal_uInt32 mnArrowColor; /// Button arrow color. + sal_uInt32 mnBackColor; /// Fill color. + sal_uInt32 mnFlags; /// Various flags. + sal_Int32 mnOrientation; /// Orientation of the buttons. + sal_Int32 mnPropThumb; /// Proportional thumb size. + sal_Int32 mnMin; /// Minimum of the value range. + sal_Int32 mnMax; /// Maximum of the value range. + sal_Int32 mnPosition; /// Value of the spin button. + sal_Int32 mnSmallChange; /// Increment step size (buttons). + sal_Int32 mnLargeChange; /// Increment step size (thumb). + sal_Int32 mnDelay; /// Repeat delay in milliseconds. +}; + +// ============================================================================ + +/** Container for all ActiveX form control model implementations. */ +class AxControl +{ +public: + explicit AxControl( const ::rtl::OUString& rName ); + ~AxControl(); + + /** Creates and returns the internal control model according to the passed + MS class identifier. */ + AxControlModelBase* createModel( const ::rtl::OUString& rClassId ); + /** Imports a form control model from the passed input stream. */ + void importBinaryModel( BinaryInputStream& rInStrm ); + + /** Returns the internal control model. */ + inline const AxControlModelBase* getModel() const { return mxModel.get(); } + /** Returns the MS class identifier used to create the internal control model. */ + inline const ::rtl::OUString& getClassId() const { return maClassId; } + + /** Creates and returns the UNO form component object for this control and + inserts it into the form wrapped by the passed helper. */ + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > + convertAndInsert( AxControlHelper& rHelper ) const; + +private: + ::std::auto_ptr< AxControlModelBase > mxModel; + ::rtl::OUString maClassId; /// Class identifier of the control model. + ::rtl::OUString maName; /// Name of the control. +}; + +// ============================================================================ + +} // namespace ole +} // namespace oox + +#endif + diff --git a/oox/inc/oox/ole/axcontrolfragment.hxx b/oox/inc/oox/ole/axcontrolfragment.hxx new file mode 100644 index 000000000000..9bccbd11a0de --- /dev/null +++ b/oox/inc/oox/ole/axcontrolfragment.hxx @@ -0,0 +1,81 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_OLE_AXCONTROLFRAGMENT_HXX +#define OOX_OLE_AXCONTROLFRAGMENT_HXX + +#include "oox/core/fragmenthandler2.hxx" + +namespace oox { +namespace ole { + +class AxControl; +class AxControlModelBase; + +// ============================================================================ + +/** Context handler for ActiveX form control model properties. */ +class AxControlPropertyContext : public ::oox::core::ContextHandler2 +{ +public: + explicit AxControlPropertyContext( + ::oox::core::FragmentHandler2& rFragment, + AxControlModelBase& rModel ); + + virtual ::oox::core::ContextHandlerRef + onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + AxControlModelBase& mrModel; + sal_Int32 mnPropId; /// Identifier of currently processed property. +}; + +// ============================================================================ + +/** Fragment handler for an ActiveX form control fragment. */ +class AxControlFragment : public ::oox::core::FragmentHandler2 +{ +public: + explicit AxControlFragment( + ::oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + AxControl& rControl ); + + virtual ::oox::core::ContextHandlerRef + onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + AxControl& mrControl; +}; + +// ============================================================================ + +} // namespace ole +} // namespace oox + +#endif + diff --git a/oox/inc/oox/ole/axcontrolhelper.hxx b/oox/inc/oox/ole/axcontrolhelper.hxx new file mode 100644 index 000000000000..d34cf45f3654 --- /dev/null +++ b/oox/inc/oox/ole/axcontrolhelper.hxx @@ -0,0 +1,118 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_OLE_AXCONTROLHELPER_HXX +#define OOX_OLE_AXCONTROLHELPER_HXX + +#include <com/sun/star/uno/Reference.hxx> + +namespace com { namespace sun { namespace star { + namespace graphic { class XGraphic; } + namespace drawing { class XDrawPage; } + namespace form { class XForm; } +} } } + +namespace oox { namespace core { class FilterBase; } } + +namespace oox { +namespace ole { + +// ============================================================================ + +const sal_uInt32 AX_SYSCOLOR_WINDOWBACK = 0x80000005; +const sal_uInt32 AX_SYSCOLOR_WINDOWFRAME = 0x80000006; +const sal_uInt32 AX_SYSCOLOR_WINDOWTEXT = 0x80000008; +const sal_uInt32 AX_SYSCOLOR_BUTTONFACE = 0x8000000F; +const sal_uInt32 AX_SYSCOLOR_BUTTONTEXT = 0x80000012; + +// ============================================================================ + +enum AxDefaultColorMode +{ + AX_DEFAULTCOLORMODE_BGR, /// OLE default color type is interpreted as BGR color. + AX_DEFAULTCOLORMODE_PALETTE /// OLE default color type is interpreted as palette color. +}; + +// ============================================================================ + +/** Helper functions and callbacks for ActiveX form control filters. */ +class AxControlHelper +{ +public: + explicit AxControlHelper( + const ::oox::core::FilterBase& rFilter, + AxDefaultColorMode eColorMode = AX_DEFAULTCOLORMODE_BGR ); + virtual ~AxControlHelper(); + + /** Returns the filter object that imports/exports the form controls. */ + inline const ::oox::core::FilterBase& getFilter() const { return mrFilter; } + /** Returns the UNO form used to insert the control models. */ + ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > + getControlForm() const; + /** Returns the UNO RGB color from the passed encoded OLE color. */ + sal_Int32 convertColor( sal_uInt32 nAxColor ) const; + +protected: + /** Derived classes returns the UNO form of the current context. Called exactly once. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > + createControlForm() const = 0; + +private: + const ::oox::core::FilterBase& mrFilter; + const AxDefaultColorMode meColorMode; + mutable ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > mxForm; + mutable bool mbHasFormQuerried; +}; + +// ============================================================================ + +/** Helper functions and callbacks for ActiveX form controls embedded in a + document. */ +class AxEmbeddedControlHelper : public AxControlHelper +{ +public: + explicit AxEmbeddedControlHelper( + const ::oox::core::FilterBase& rFilter, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& rxDrawPage, + AxDefaultColorMode eColorMode = AX_DEFAULTCOLORMODE_BGR ); + +protected: + /** Creates and returns the standard UNO form in the wrapped draw page. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > + createControlForm() const; + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > mxDrawPage; +}; + +// ============================================================================ + +} // namespace ole +} // namespace oox + +#endif + diff --git a/oox/inc/oox/ole/olehelper.hxx b/oox/inc/oox/ole/olehelper.hxx new file mode 100644 index 000000000000..91ca73a38a67 --- /dev/null +++ b/oox/inc/oox/ole/olehelper.hxx @@ -0,0 +1,76 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_OLE_OLEHELPER_HXX +#define OOX_OLE_OLEHELPER_HXX + +#include <rtl/ustring.hxx> +#include "oox/helper/binarystreambase.hxx" + +namespace oox { class BinaryInputStream; } + +namespace oox { +namespace ole { + +// ============================================================================ + +/** Stores data about a StdHlink hyperlink. */ +struct StdHlinkInfo +{ + ::rtl::OUString maTarget; + ::rtl::OUString maLocation; + ::rtl::OUString maDisplay; + ::rtl::OUString maFrame; +}; + +// ============================================================================ + +/** Static helper functions for OLE import/export. */ +class OleHelper +{ +public: + /** Imports a GUID from the passed binary stream and returns its string representation. */ + static ::rtl::OUString importGuid( BinaryInputStream& rInStrm ); + + /** Imports an OLE StdPic picture from the current position of the passed binary stream. */ + static bool importStdPic( StreamDataSequence& orGraphicData, BinaryInputStream& rInStrm, bool bWithGuid ); + + /** Imports an OLE StdHlink from the current position of the passed binary stream. */ + static bool importStdHlink( StdHlinkInfo& orHlinkInfo, BinaryInputStream& rInStrm, rtl_TextEncoding eTextEnc, bool bWithGuid ); + +private: + OleHelper(); // not implemented + ~OleHelper(); // not implemented +}; + +// ============================================================================ + +} // namespace ole +} // namespace oox + +#endif + diff --git a/oox/inc/oox/ole/oleobjecthelper.hxx b/oox/inc/oox/ole/oleobjecthelper.hxx new file mode 100644 index 000000000000..ef3570c4fa20 --- /dev/null +++ b/oox/inc/oox/ole/oleobjecthelper.hxx @@ -0,0 +1,86 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_OLE_OLEOBJECTHELPER_HXX +#define OOX_OLE_OLEOBJECTHELPER_HXX + +#include "oox/helper/binarystreambase.hxx" + +namespace com { namespace sun { namespace star { + namespace awt { struct Size; } + namespace lang { class XMultiServiceFactory; } + namespace document { class XEmbeddedObjectResolver; } +} } } + +namespace oox { class PropertyMap; } + +namespace oox { +namespace ole { + +// ============================================================================ + +/** Contains generic information about an OLE object. */ +struct OleObjectInfo +{ + StreamDataSequence maEmbeddedData; /// Data of an embedded OLE object. + ::rtl::OUString maTargetLink; /// Path to external data for linked OLE object. + ::rtl::OUString maProgId; + bool mbLinked; /// True = linked OLE object, false = embedded OLE object. + bool mbShowAsIcon; /// True = show as icon, false = show contents. + bool mbAutoUpdate; + + explicit OleObjectInfo(); +}; + +// ============================================================================ + +/** Helper for OLE object handling. */ +class OleObjectHelper +{ +public: + explicit OleObjectHelper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory ); + ~OleObjectHelper(); + + bool importOleObject( + PropertyMap& rPropMap, + const OleObjectInfo& rOleObject, + const ::com::sun::star::awt::Size& rObjSize ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::document::XEmbeddedObjectResolver > mxResolver; + const ::rtl::OUString maEmbeddedObjScheme; + sal_Int32 mnObjectId; +}; + +// ============================================================================ + +} // namespace ole +} // namespace oox + +#endif + diff --git a/oox/inc/oox/ole/vbainputstream.hxx b/oox/inc/oox/ole/vbainputstream.hxx new file mode 100644 index 000000000000..4de0a91a622f --- /dev/null +++ b/oox/inc/oox/ole/vbainputstream.hxx @@ -0,0 +1,72 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_OLE_VBAINPUTSTREAM_HXX +#define OOX_OLE_VBAINPUTSTREAM_HXX + +#include <vector> +#include "oox/helper/binaryinputstream.hxx" + +namespace oox { +namespace ole { + +// ============================================================================ + +/** A non-seekable input stream that implements run-length decompression. */ +class VbaInputStream : public BinaryInputStream +{ +public: + explicit VbaInputStream( BinaryInputStream& rInStrm ); + + /** Reads nBytes bytes to the passed sequence. + @return Number of bytes really read. */ + virtual sal_Int32 readData( StreamDataSequence& orData, sal_Int32 nBytes ); + /** Reads nBytes bytes to the (existing) buffer opMem. + @return Number of bytes really read. */ + virtual sal_Int32 readMemory( void* opMem, sal_Int32 nBytes ); + /** Seeks the stream forward by the passed number of bytes. */ + virtual void skip( sal_Int32 nBytes ); + +private: + /** If no data left in chunk buffer, reads the next chunk from stream. */ + bool updateChunk(); + +private: + typedef ::std::vector< sal_uInt8 > ChunkBuffer; + + BinaryInputStream& mrInStrm; + ChunkBuffer maChunk; + size_t mnChunkPos; +}; + +// ============================================================================ + +} // namespace ole +} // namespace oox + +#endif + diff --git a/oox/inc/oox/ppt/animationspersist.hxx b/oox/inc/oox/ppt/animationspersist.hxx new file mode 100644 index 000000000000..0ff930bfa080 --- /dev/null +++ b/oox/inc/oox/ppt/animationspersist.hxx @@ -0,0 +1,132 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_PPT_ANIMATIONPERSIST +#define OOX_PPT_ANIMATIONPERSIST + +#include <list> +#include <boost/shared_ptr.hpp> +#include <boost/array.hpp> + +#include <rtl/ustring.hxx> + +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/drawing/XShape.hpp> + +#include "oox/drawingml/drawingmltypes.hxx" +#include "oox/ppt/slidepersist.hxx" + +namespace oox { namespace ppt { + + enum { + NP_TO = 0, + NP_FROM, NP_BY, NP_USERDATA, NP_ATTRIBUTENAME, + NP_ACCELERATION, NP_AUTOREVERSE, NP_DECELERATE, NP_DURATION, NP_FILL, + NP_REPEATCOUNT, NP_REPEATDURATION, NP_RESTART, + NP_DIRECTION, NP_COLORINTERPOLATION, NP_CALCMODE, NP_TRANSFORMTYPE, + NP_PATH, + NP_ENDSYNC, NP_ITERATETYPE, NP_ITERATEINTERVAL, + NP_SUBITEM, NP_TARGET, NP_COMMAND, NP_PARAMETER, + NP_VALUES, NP_FORMULA, NP_KEYTIMES, NP_DISPLAY, + _NP_SIZE + }; + + typedef boost::array< ::com::sun::star::uno::Any, _NP_SIZE > NodePropertyMap; + + + /** data for CT_TLShapeTargetElement */ + struct ShapeTargetElement + { + ShapeTargetElement() + : mnType( 0 ) + {} + void convert( ::com::sun::star::uno::Any & aAny, sal_Int16 & rSubType ) const; + + sal_Int32 mnType; + sal_Int32 mnRangeType; + drawingml::IndexRange maRange; + ::rtl::OUString msSubShapeId; + }; + + + /** data for CT_TLTimeTargetElement */ + struct AnimTargetElement + { + AnimTargetElement() + : mnType( 0 ) + {} + /** convert to a set of properties */ + ::com::sun::star::uno::Any convert(const SlidePersistPtr & pSlide, sal_Int16 & nSubType) const; + + sal_Int32 mnType; + ::rtl::OUString msValue; + + ShapeTargetElement maShapeTarget; + }; + + typedef boost::shared_ptr< AnimTargetElement > AnimTargetElementPtr; + + struct AnimationCondition; + + typedef ::std::list< AnimationCondition > AnimationConditionList; + + /** data for CT_TLTimeCondition */ + struct AnimationCondition + { + AnimationCondition() + : mnType( 0 ) + {} + + ::com::sun::star::uno::Any convert(const SlidePersistPtr & pSlide) const; + static ::com::sun::star::uno::Any convertList(const SlidePersistPtr & pSlide, const AnimationConditionList & l); + + AnimTargetElementPtr & getTarget() + { if(!mpTarget) mpTarget.reset( new AnimTargetElement ); return mpTarget; } + ::com::sun::star::uno::Any maValue; + sal_Int32 mnType; + private: + AnimTargetElementPtr mpTarget; + }; + + + struct TimeAnimationValue + { + ::rtl::OUString msFormula; + ::rtl::OUString msTime; + ::com::sun::star::uno::Any maValue; + }; + + typedef ::std::list< TimeAnimationValue > TimeAnimationValueList; + +} } + + + + + +#endif diff --git a/oox/inc/oox/ppt/backgroundproperties.hxx b/oox/inc/oox/ppt/backgroundproperties.hxx new file mode 100644 index 000000000000..7972d20844e1 --- /dev/null +++ b/oox/inc/oox/ppt/backgroundproperties.hxx @@ -0,0 +1,50 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_POWERPOINT_BACKGROUNDPROPERTIES_HXX +#define OOX_POWERPOINT_BACKGROUNDPROPERTIES_HXX + +#include "oox/core/contexthandler.hxx" +#include "oox/drawingml/fillproperties.hxx" + +namespace oox { namespace ppt { + +// --------------------------------------------------------------------- + +class BackgroundPropertiesContext : public ::oox::core::ContextHandler +{ +public: + BackgroundPropertiesContext( ::oox::core::ContextHandler& rParent, ::oox::drawingml::FillProperties& rFillProperties ) throw(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + ::oox::drawingml::FillProperties& mrFillProperties; +}; + +} } + +#endif // OOX_POWERPOINT_BACKGROUNDPROPERTIES_HXX diff --git a/oox/inc/oox/ppt/headerfooter.hxx b/oox/inc/oox/ppt/headerfooter.hxx new file mode 100644 index 000000000000..f29124240cb7 --- /dev/null +++ b/oox/inc/oox/ppt/headerfooter.hxx @@ -0,0 +1,51 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_HEADERFOOTER +#define OOX_PPT_HEADERFOOTER + +#include <sal/types.h> + +namespace oox { namespace ppt { + + struct HeaderFooter + { + sal_Bool mbSlideNumber; + sal_Bool mbHeader; + sal_Bool mbFooter; + sal_Bool mbDateTime; + + HeaderFooter() + : mbSlideNumber( sal_True ) + , mbHeader( sal_True ) + , mbFooter( sal_True ) + , mbDateTime( sal_True ) {}; + }; + +} } + +#endif diff --git a/oox/inc/oox/ppt/layoutfragmenthandler.hxx b/oox/inc/oox/ppt/layoutfragmenthandler.hxx new file mode 100644 index 000000000000..bde8a46b0a94 --- /dev/null +++ b/oox/inc/oox/ppt/layoutfragmenthandler.hxx @@ -0,0 +1,49 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_LAYOUTFRAGMENTHANDLER +#define OOX_PPT_LAYOUTFRAGMENTHANDLER + +#include "oox/ppt/slidefragmenthandler.hxx" + +#include <vector> + +namespace oox { namespace ppt { + +class LayoutFragmentHandler : public SlideFragmentHandler +{ +public: + LayoutFragmentHandler( ::oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, SlidePersistPtr pMasterPersistPtr ) throw(); + virtual ~LayoutFragmentHandler() throw(); + + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); +}; + +} } + +#endif // OOX_PPT_LAYOUTFRAGMENTHANDLER diff --git a/oox/inc/oox/ppt/pptimport.hxx b/oox/inc/oox/ppt/pptimport.hxx new file mode 100644 index 000000000000..7d04e1c492fa --- /dev/null +++ b/oox/inc/oox/ppt/pptimport.hxx @@ -0,0 +1,88 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_POWERPOINT_POWERPOINTIMPORT_HXX +#define OOX_POWERPOINT_POWERPOINTIMPORT_HXX + +#include "oox/core/xmlfilterbase.hxx" + +#include <com/sun/star/animations/XAnimationNode.hpp> +#include <oox/drawingml/theme.hxx> +#include "oox/ppt/presentationfragmenthandler.hxx" +#include "oox/ppt/slidepersist.hxx" +#include "tokens.hxx" +#include <vector> +#include <map> + +namespace oox { namespace ppt { + +// --------------------------------------------------------------------- + +class PowerPointImport : public oox::core::XmlFilterBase +{ +public: + + PowerPointImport( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > & rSMgr ); + virtual ~PowerPointImport(); + + // from FilterBase + virtual bool importDocument() throw(); + virtual bool exportDocument() throw(); + + virtual sal_Int32 getSchemeColor( sal_Int32 nToken ) const; + + virtual const ::oox::drawingml::Theme* getCurrentTheme() const; + virtual ::oox::vml::Drawing* getVmlDrawing(); + virtual const oox::drawingml::table::TableStyleListPtr getTableStyles(); + virtual ::oox::drawingml::chart::ChartConverter& getChartConverter(); + + void setActualSlidePersist( SlidePersistPtr pActualSlidePersist ){ mpActualSlidePersist = pActualSlidePersist; }; + std::map< rtl::OUString, oox::drawingml::ThemePtr >& getThemes(){ return maThemes; }; + std::vector< SlidePersistPtr >& getDrawPages(){ return maDrawPages; }; + std::vector< SlidePersistPtr >& getMasterPages(){ return maMasterPages; }; + std::vector< SlidePersistPtr >& getNotesPages(){ return maNotesPages; }; + +private: + virtual ::rtl::OUString implGetImplementationName() const; + +private: + rtl::OUString maTableStyleListPath; + oox::drawingml::table::TableStyleListPtr mpTableStyleList; + + SlidePersistPtr mpActualSlidePersist; + std::map< rtl::OUString, oox::drawingml::ThemePtr > maThemes; + + std::vector< SlidePersistPtr > maDrawPages; + std::vector< SlidePersistPtr > maMasterPages; + std::vector< SlidePersistPtr > maNotesPages; + + ::boost::shared_ptr< ::oox::drawingml::chart::ChartConverter > mxChartConv; +}; + +} } + +#endif // OOX_POWERPOINT_POWERPOINTIMPORT_HXX diff --git a/oox/inc/oox/ppt/pptshape.hxx b/oox/inc/oox/ppt/pptshape.hxx new file mode 100644 index 000000000000..59f1beb39677 --- /dev/null +++ b/oox/inc/oox/ppt/pptshape.hxx @@ -0,0 +1,71 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_PRESENTATION_PPTSHAPE_HXX +#define OOX_PPT_PRESENTATION_PPTSHAPE_HXX + +#include "oox/drawingml/shape.hxx" +#include "oox/ppt/slidepersist.hxx" + +namespace oox { namespace ppt { + +class PPTShape : public oox::drawingml::Shape +{ + ShapeLocation meShapeLocation; // placeholdershapes (mnSubType != 0) on Master are never displayed + sal_Bool mbReferenced; // placeholdershapes on Layout are displayed only, if they are not referenced + // placeholdershapes on Slide are displayed always + +public: + + PPTShape( const oox::ppt::ShapeLocation eShapeLocation, + const sal_Char* pServiceType = NULL ); + virtual ~PPTShape(); + + using oox::drawingml::Shape::addShape; + // addShape is creating and inserting the corresponding XShape. + void addShape( + const oox::core::XmlFilterBase& rFilterBase, + const SlidePersist& rPersist, + const oox::drawingml::Theme* pTheme, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const com::sun::star::awt::Rectangle* pShapeRect = 0, + ::oox::drawingml::ShapeIdMap* pShapeMap = 0 ); + + virtual void applyShapeReference( const oox::drawingml::Shape& rReferencedShape ); + + void setShapeLocation( const oox::ppt::ShapeLocation eShapeLocation ) { meShapeLocation = eShapeLocation; }; + ShapeLocation getShapeLocation() const { return meShapeLocation; }; + sal_Bool isReferenced() const { return mbReferenced; }; + void setReferenced( sal_Bool bReferenced ){ mbReferenced = bReferenced; }; + +protected: + +}; + +} } + +#endif // OOX_PPT_PRESENTATION_PPTSHAPE_HXX diff --git a/oox/inc/oox/ppt/pptshapecontext.hxx b/oox/inc/oox/ppt/pptshapecontext.hxx new file mode 100644 index 000000000000..aff410db7fb7 --- /dev/null +++ b/oox/inc/oox/ppt/pptshapecontext.hxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_PPTSHAPECONTEXT_HXX +#define OOX_PPT_PPTSHAPECONTEXT_HXX + +#include "oox/drawingml/shapecontext.hxx" + +namespace oox { namespace ppt { + +class PPTShapeContext : public ::oox::drawingml::ShapeContext +{ + SlidePersistPtr mpSlidePersistPtr; + +public: + PPTShapeContext( ::oox::core::ContextHandler& rParent, const SlidePersistPtr pSlidePersistPtr, oox::drawingml::ShapePtr pMasterShapePtr, oox::drawingml::ShapePtr pShapePtr ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); +}; + +} } + +#endif // OOX_PPT_PPTSHAPEGROUPCONTEXT_HXX diff --git a/oox/inc/oox/ppt/pptshapegroupcontext.hxx b/oox/inc/oox/ppt/pptshapegroupcontext.hxx new file mode 100644 index 000000000000..c69a6de78155 --- /dev/null +++ b/oox/inc/oox/ppt/pptshapegroupcontext.hxx @@ -0,0 +1,58 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_PPTSHAPEGROUPCONTEXT_HXX +#define OOX_PPT_PPTSHAPEGROUPCONTEXT_HXX + +#include "oox/drawingml/shapegroupcontext.hxx" +#include "oox/ppt/slidepersist.hxx" + +namespace oox { namespace ppt { + +class PPTShapeGroupContext : public ::oox::drawingml::ShapeGroupContext +{ + SlidePersistPtr mpSlidePersistPtr; + ShapeLocation meShapeLocation; + +public: + PPTShapeGroupContext( + ::oox::core::ContextHandler& rParent, + const oox::ppt::SlidePersistPtr pSlidePersistPtr, + const oox::ppt::ShapeLocation eShapeLocation, + oox::drawingml::ShapePtr pMasterShapePtr, + oox::drawingml::ShapePtr pGroupShapePtr ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + +}; + +} } + +#endif // OOX_PPT_PPTSHAPEGROUPCONTEXT_HXX diff --git a/oox/inc/oox/ppt/pptshapepropertiescontext.hxx b/oox/inc/oox/ppt/pptshapepropertiescontext.hxx new file mode 100644 index 000000000000..9cbab5755b51 --- /dev/null +++ b/oox/inc/oox/ppt/pptshapepropertiescontext.hxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_PPTSHAPEPROPERTIESCONTEXT_HXX +#define OOX_PPT_PPTSHAPEPROPERTIESCONTEXT_HXX + +#include "oox/drawingml/shapepropertiescontext.hxx" + +namespace oox { namespace ppt { + +class PPTShapePropertiesContext : public ::oox::drawingml::ShapePropertiesContext +{ +public: + PPTShapePropertiesContext( ::oox::core::ContextHandler& rParent, ::oox::drawingml::Shape& rShape ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); +}; + +} } + +#endif // OOX_PPT_PPTSHAPEGROUPCONTEXT_HXX diff --git a/oox/inc/oox/ppt/presentationfragmenthandler.hxx b/oox/inc/oox/ppt/presentationfragmenthandler.hxx new file mode 100644 index 000000000000..281b3d333d56 --- /dev/null +++ b/oox/inc/oox/ppt/presentationfragmenthandler.hxx @@ -0,0 +1,72 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_PRESENTATION_FRAGMENTHANDLER +#define OOX_PPT_PRESENTATION_FRAGMENTHANDLER + +#include <com/sun/star/drawing/XDrawPage.hpp> +#include <com/sun/star/awt/Size.hpp> +#include "oox/drawingml/textliststyle.hxx" +#include "oox/ppt/slidepersist.hxx" +#include "oox/core/fragmenthandler.hxx" +#include "oox/core/relations.hxx" +#include "customshowlistcontext.hxx" + +#include <stack> +#include <vector> + +namespace oox { namespace ppt { + +class PresentationFragmentHandler : public ::oox::core::FragmentHandler +{ +public: + PresentationFragmentHandler( ::oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath ) throw(); + virtual ~PresentationFragmentHandler() throw(); + + virtual void SAL_CALL startDocument( ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endDocument( ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + bool importSlide( const ::oox::core::FragmentHandlerRef& rxSlideFragmentHandler, + const oox::ppt::SlidePersistPtr pPersist ); + +private: + std::vector< rtl::OUString > maSlideMasterVector; + std::vector< rtl::OUString > maSlidesVector; + std::vector< rtl::OUString > maNotesMasterVector; + ::oox::drawingml::TextListStylePtr mpTextListStyle; + + ::com::sun::star::awt::Size maSlideSize; + ::com::sun::star::awt::Size maNotesSize; + + std::vector< CustomShow > maCustomShowList; +}; + +} } + +#endif // OOX_PPT_PRESENTATION_FRAGMENTHANDLER diff --git a/oox/inc/oox/ppt/slidefragmenthandler.hxx b/oox/inc/oox/ppt/slidefragmenthandler.hxx new file mode 100644 index 000000000000..4fe0e3f6a30f --- /dev/null +++ b/oox/inc/oox/ppt/slidefragmenthandler.hxx @@ -0,0 +1,62 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_SLIDEFRAGMENTHANDLER +#define OOX_PPT_SLIDEFRAGMENTHANDLER + +#include <com/sun/star/drawing/XDrawPage.hpp> +#include "oox/helper/propertymap.hxx" +#include "oox/core/fragmenthandler.hxx" +#include "oox/ppt/slidepersist.hxx" + +#include <stack> +#include <vector> +#include <map> + +namespace oox { namespace ppt { + +class SlideFragmentHandler : public ::oox::core::FragmentHandler +{ +public: + SlideFragmentHandler( ::oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, SlidePersistPtr pPersistPtr, const ShapeLocation eShapeLocation ) throw(); + virtual ~SlideFragmentHandler() throw(); + + virtual void SAL_CALL endDocument( ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + SlidePersistPtr mpSlidePersistPtr; + ShapeLocation meShapeLocation; + +private: + ::rtl::OUString maSlideName; + PropertyMap maSlideProperties; +}; + +} } + +#endif // OOX_PPT_SLIDEFRAGMENTHANDLER diff --git a/oox/inc/oox/ppt/slidemastertextstylescontext.hxx b/oox/inc/oox/ppt/slidemastertextstylescontext.hxx new file mode 100644 index 000000000000..03b7a51faa2e --- /dev/null +++ b/oox/inc/oox/ppt/slidemastertextstylescontext.hxx @@ -0,0 +1,51 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SLIDEMASTERTEXTSTYLESCONTEXT_HXX +#define OOX_DRAWINGML_SLIDEMASTERTEXTSTYLESCONTEXT_HXX + +#include "oox/drawingml/theme.hxx" +#include "oox/core/contexthandler.hxx" +#include "oox/core/fragmenthandler.hxx" +#include "oox/ppt/slidepersist.hxx" + +namespace oox { namespace ppt { + +class SlideMasterTextStylesContext : public oox::core::ContextHandler +{ +public: + SlideMasterTextStylesContext( ::oox::core::ContextHandler& rParent, SlidePersistPtr pSlidePersistPtr ); + ~SlideMasterTextStylesContext(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + SlidePersistPtr mpSlidePersistPtr; +}; + +} } + +#endif // OOX_DRAWINGML_SLIDEMASTERTEXTSTYLESCONTEXT_HXX diff --git a/oox/inc/oox/ppt/slidepersist.hxx b/oox/inc/oox/ppt/slidepersist.hxx new file mode 100644 index 000000000000..31156a56ee84 --- /dev/null +++ b/oox/inc/oox/ppt/slidepersist.hxx @@ -0,0 +1,153 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_POWERPOINT_SLIDEPERSIST_HXX +#define OOX_POWERPOINT_SLIDEPERSIST_HXX + +#include "tokens.hxx" +#include <boost/shared_ptr.hpp> +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/theme.hxx" +#include "oox/drawingml/clrscheme.hxx" +#include "oox/drawingml/textliststyle.hxx" +#include "oox/drawingml/textparagraphproperties.hxx" +#include <oox/ppt/headerfooter.hxx> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/drawing/XDrawPage.hpp> +#include <com/sun/star/animations/XAnimationNode.hpp> +#include "oox/core/fragmenthandler.hxx" + +#include <list> + +namespace oox { namespace vml { class Drawing; } } + +namespace oox { namespace ppt { + +enum ShapeLocation +{ + Master, + Layout, + Slide +}; + +// --------------------------------------------------------------------- +class TimeNode; +class SlidePersist; + +typedef boost::shared_ptr< SlidePersist > SlidePersistPtr; + +class SlidePersist : public boost::enable_shared_from_this< SlidePersist > +{ + +public: + SlidePersist( oox::core::XmlFilterBase& rFilter, sal_Bool bMaster, sal_Bool bNotes, + const com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage >&, + oox::drawingml::ShapePtr pShapesPtr, const ::oox::drawingml::TextListStylePtr & ); + ~SlidePersist(); + + com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > getPage() const { return mxPage; }; + + void setMasterPersist( SlidePersistPtr pMasterPersistPtr ){ mpMasterPagePtr = pMasterPersistPtr; } + SlidePersistPtr getMasterPersist() const { return mpMasterPagePtr; } + + void setPath( const rtl::OUString& rPath ) { maPath = rPath; } + const rtl::OUString getPath() const { return maPath; } + + void setLayoutPath( const rtl::OUString& rLayoutPath ) { maLayoutPath = rLayoutPath; } + const rtl::OUString getLayoutPath() const { return maLayoutPath; } + + void setTheme( const oox::drawingml::ThemePtr pThemePtr ){ mpThemePtr = pThemePtr; } + oox::drawingml::ThemePtr getTheme() const { return mpThemePtr; } + + void setClrScheme( const oox::drawingml::ClrSchemePtr pClrSchemePtr ){ mpClrSchemePtr = pClrSchemePtr; } + oox::drawingml::ClrSchemePtr getClrScheme() const { return mpClrSchemePtr; } + + void setClrMap( const oox::drawingml::ClrMapPtr pClrMapPtr ){ mpClrMapPtr = pClrMapPtr; } + oox::drawingml::ClrMapPtr getClrMap() const { return mpClrMapPtr; } + + void setBackgroundProperties( const oox::drawingml::FillPropertiesPtr pFillPropertiesPtr ){ mpBackgroundPropertiesPtr = pFillPropertiesPtr; } + oox::drawingml::FillPropertiesPtr getBackgroundProperties() const { return mpBackgroundPropertiesPtr; } + + sal_Bool isMasterPage() const { return mbMaster; } + sal_Bool isNotesPage() const { return mbNotes; } + + void setLayoutValueToken( sal_Int32 nLayoutValueToken ) { mnLayoutValueToken = nLayoutValueToken; } + short getLayoutFromValueToken(); + + + oox::drawingml::TextListStylePtr getDefaultTextStyle() const { return maDefaultTextStylePtr; } + oox::drawingml::TextListStylePtr getTitleTextStyle() const { return maTitleTextStylePtr; } + oox::drawingml::TextListStylePtr getBodyTextStyle() const { return maBodyTextStylePtr; } + oox::drawingml::TextListStylePtr getNotesTextStyle() const { return maNotesTextStylePtr; } + oox::drawingml::TextListStylePtr getOtherTextStyle() const { return maOtherTextStylePtr; } + + oox::drawingml::ShapePtr getShapes() { return maShapesPtr; } + ::std::list< boost::shared_ptr< TimeNode > >& getTimeNodeList() { return maTimeNodeList; } + oox::ppt::HeaderFooter& getHeaderFooter(){ return maHeaderFooter; }; + + oox::vml::Drawing* getDrawing() { return mpDrawingPtr.get(); } + + void createXShapes( const oox::core::XmlFilterBase& rFilterBase ); + void createBackground( const oox::core::XmlFilterBase& rFilterBase ); + void applyTextStyles( const oox::core::XmlFilterBase& rFilterBase ); + + std::map< ::rtl::OUString, ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode > >& getAnimNodesMap() { return maAnimNodesMap; }; + ::oox::drawingml::ShapePtr getShape( const ::rtl::OUString & id ) { return maShapeMap[ id ]; } + ::oox::drawingml::ShapeIdMap& getShapeMap() { return maShapeMap; } + +private: + rtl::OUString maPath; + rtl::OUString maLayoutPath; + ::boost::shared_ptr< oox::vml::Drawing > mpDrawingPtr; + com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > mxPage; + oox::drawingml::ThemePtr mpThemePtr; // the theme that is used + oox::drawingml::ClrSchemePtr mpClrSchemePtr; // the local color scheme (if any) + oox::drawingml::ClrMapPtr mpClrMapPtr; // color mapping (if any) + SlidePersistPtr mpMasterPagePtr; + + oox::drawingml::ShapePtr maShapesPtr; + oox::drawingml::FillPropertiesPtr mpBackgroundPropertiesPtr; + ::std::list< boost::shared_ptr< TimeNode > > maTimeNodeList; + + oox::ppt::HeaderFooter maHeaderFooter; + sal_Int32 mnLayoutValueToken; + sal_Bool mbMaster; + sal_Bool mbNotes; + + oox::drawingml::TextListStylePtr maDefaultTextStylePtr; + oox::drawingml::TextListStylePtr maTitleTextStylePtr; + oox::drawingml::TextListStylePtr maBodyTextStylePtr; + oox::drawingml::TextListStylePtr maNotesTextStylePtr; + oox::drawingml::TextListStylePtr maOtherTextStylePtr; + + std::map< ::rtl::OUString, ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode > > maAnimNodesMap; + std::map< ::rtl::OUString, ::oox::drawingml::ShapePtr > maShapeMap; +}; + +} } + +#endif // OOX_POWERPOINT_SLIDEPERSIST_HXX diff --git a/oox/inc/oox/ppt/slidetimingcontext.hxx b/oox/inc/oox/ppt/slidetimingcontext.hxx new file mode 100644 index 000000000000..911b6cbcdfb4 --- /dev/null +++ b/oox/inc/oox/ppt/slidetimingcontext.hxx @@ -0,0 +1,57 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_SLIDETIMINGCONTEXT +#define OOX_PPT_SLIDETIMINGCONTEXT + +#include <com/sun/star/animations/XTimeContainer.hpp> +#include "oox/ppt/timenode.hxx" +#include "oox/core/contexthandler.hxx" + +#include <stack> +#include <vector> + +namespace oox { namespace ppt { + +class SlideTimingContext : public ::oox::core::ContextHandler +{ +public: + SlideTimingContext( ::oox::core::ContextHandler& rParent, TimeNodePtrList & aTimeNodeList ) throw(); + virtual ~SlideTimingContext() throw(); + + virtual void SAL_CALL endDocument( ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endFastElement( sal_Int32 aElement ) throw ( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + TimeNodePtrList & maTimeNodeList; +}; + +} } + +#endif // OOX_PPT_SLIDETIMINGCONTEXT diff --git a/oox/inc/oox/ppt/slidetransition.hxx b/oox/inc/oox/ppt/slidetransition.hxx new file mode 100644 index 000000000000..5427d90a5e35 --- /dev/null +++ b/oox/inc/oox/ppt/slidetransition.hxx @@ -0,0 +1,73 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_PPT_SLIDETRANSITION +#define OOX_PPT_SLIDETRANSITION + +#include <rtl/ustring.hxx> + +#include <com/sun/star/animations/XTransitionFilter.hpp> + +namespace oox { class PropertyMap; } + +namespace oox { namespace ppt { + + class SlideTransition + { + public: + SlideTransition(); + explicit SlideTransition(const ::rtl::OUString & ); + + void setSlideProperties( PropertyMap& props ); + void setTransitionFilterProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XTransitionFilter > & xFilter ); + + void setOoxTransitionSpeed( sal_Int32 nToken ); + void setFadeColor( sal_Int32 nColor ) + { mnFadeColor = nColor; } + void setMode( sal_Bool bMode ) + { mbMode = bMode; } + + static sal_Int16 ooxToOdpDirection( ::sal_Int32 nOoxType ); + static sal_Int16 ooxToOdpEightDirections( ::sal_Int32 nOoxType ); + static sal_Int16 ooxToOdpCornerDirections( ::sal_Int32 nOoxType ); + static sal_Int16 ooxToOdpBorderDirections( ::sal_Int32 nOoxType ); + + void setOoxTransitionType( ::sal_Int32 OoxType, + ::sal_Int32 param1, ::sal_Int32 param2 ); + private: + ::sal_Int16 mnTransitionType; + ::sal_Int16 mnTransitionSubType; + ::sal_Bool mbTransitionDirectionNormal; + ::sal_Int16 mnAnimationSpeed; + ::sal_Int32 mnFadeColor; + ::sal_Bool mbMode; /**< http://api.openoffice.org/docs/common/ref/com/sun/star/animations/XTransitionFilter.html Mode property */ + }; + +} } + +#endif diff --git a/oox/inc/oox/ppt/slidetransitioncontext.hxx b/oox/inc/oox/ppt/slidetransitioncontext.hxx new file mode 100644 index 000000000000..047c417936e7 --- /dev/null +++ b/oox/inc/oox/ppt/slidetransitioncontext.hxx @@ -0,0 +1,60 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_SLIDETRANSITIONCONTEXT +#define OOX_PPT_SLIDETRANSITIONCONTEXT + +#include "oox/core/contexthandler.hxx" +#include "oox/ppt/slidetransition.hxx" + +namespace oox { class PropertyMap; } + +namespace oox { namespace ppt { + + class SlideTransitionContext : public ::oox::core::ContextHandler + { + public: + SlideTransitionContext( ::oox::core::ContextHandler& rParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, + PropertyMap & aProperties ) throw(); + virtual ~SlideTransitionContext() throw(); + + virtual void SAL_CALL endFastElement( sal_Int32 aElement ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( ::sal_Int32 Element, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + + private: + PropertyMap& maSlideProperties; + ::sal_Bool mbHasTransition; + SlideTransition maTransition; + }; + +} } + +#endif // OOX_PPT_SLIDEFRAGMENTHANDLER diff --git a/oox/inc/oox/ppt/soundactioncontext.hxx b/oox/inc/oox/ppt/soundactioncontext.hxx new file mode 100644 index 000000000000..48cfb072be78 --- /dev/null +++ b/oox/inc/oox/ppt/soundactioncontext.hxx @@ -0,0 +1,61 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_PPT_SOUNDACTIONCONTEXT +#define OOX_PPT_SOUNDACTIONCONTEXT + +#include "oox/core/contexthandler.hxx" + +namespace oox { class PropertyMap; } + +namespace oox { namespace ppt { + +class SoundActionContext : public ::oox::core::ContextHandler +{ +public: + SoundActionContext( ::oox::core::ContextHandler& rParent, PropertyMap & aProperties ) throw(); + virtual ~SoundActionContext() throw(); + + virtual void SAL_CALL endFastElement( sal_Int32 aElement ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + PropertyMap& maSlideProperties; + bool mbHasStartSound; + bool mbLoopSound; + bool mbStopSound; + ::rtl::OUString msEmbedded; + ::rtl::OUString msLink; + ::rtl::OUString msSndName; +}; + +} } + + + +#endif diff --git a/oox/inc/oox/ppt/timenode.hxx b/oox/inc/oox/ppt/timenode.hxx new file mode 100644 index 000000000000..117d9ee7161c --- /dev/null +++ b/oox/inc/oox/ppt/timenode.hxx @@ -0,0 +1,134 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#ifndef OOX_DRAWINGML_TIMENODE_HXX +#define OOX_DRAWINGML_TIMENODE_HXX + +#include <boost/shared_ptr.hpp> +#include <vector> +#include <list> +#include <rtl/ustring.hxx> + +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/animations/XAnimationNode.hpp> +#include "oox/helper/propertymap.hxx" +#include "oox/ppt/slidetransition.hxx" +#include "oox/ppt/slidepersist.hxx" +#include "oox/ppt/animationspersist.hxx" +#include "oox/ppt/timenode.hxx" + +namespace oox { namespace ppt { + + class TimeNode; + class SlideTransition; + + typedef boost::shared_ptr< TimeNode > TimeNodePtr; + typedef ::std::list< TimeNodePtr > TimeNodePtrList; + + class TimeNode + { + public: + typedef ::std::map< ::rtl::OUString, ::com::sun::star::uno::Any > UserDataMap; + + TimeNode( sal_Int16 nNodeType ); + virtual ~TimeNode(); + + NodePropertyMap & getNodeProperties() { return maNodeProperties; } + UserDataMap & getUserData() { return maUserData; } + void addChild( const TimeNodePtr & pChildPtr ) + { maChildren.push_back( pChildPtr ); } + + TimeNodePtrList & getChildren() + { return maChildren; } + + void setId( sal_Int32 nId ); + const ::rtl::OUString & getId() const { return msId; } + + void addNode( + const ::oox::core::XmlFilterBase& rFilter, + const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& rxNode, + const SlidePersistPtr & slide); + // data setters + void setTo( const ::com::sun::star::uno::Any & aTo ); + void setFrom( const ::com::sun::star::uno::Any & aFrom ); + void setBy( const ::com::sun::star::uno::Any & aBy ); + void setTransitionFilter( const SlideTransition & aTransition) + { maTransitionFilter = aTransition; } + + void setNode( + const ::oox::core::XmlFilterBase& rFilter, + const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode, + const SlidePersistPtr & pSlide ); + + AnimTargetElementPtr getTarget() + { + if( !mpTarget ) + mpTarget.reset( new AnimTargetElement ); + return mpTarget; + } + + AnimationConditionList &getStartCondition() + { return maStCondList; } + AnimationConditionList &getEndCondition() + { return maEndCondList; } + AnimationConditionList &getNextCondition() + { return maNextCondList; } + AnimationConditionList &getPrevCondition() + { return maPrevCondList; } + AnimationCondition & getEndSyncValue() + { mbHasEndSyncValue = true; return maEndSyncValue; } + protected: + + static rtl::OUString getServiceName( sal_Int16 nNodeType ); + + ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode > + createAndInsert( + const ::oox::core::XmlFilterBase& rFilter, + const rtl::OUString& rServiceName, + const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& rxNode ); + + private: + const sal_Int16 mnNodeType; + + TimeNodePtrList maChildren; + + rtl::OUString msId; + NodePropertyMap maNodeProperties; + UserDataMap maUserData; // a sequence to be stored as "UserData" property + SlideTransition maTransitionFilter; + AnimTargetElementPtr mpTarget; + bool mbHasEndSyncValue; // set to true if we try to get the endSync. + AnimationCondition maEndSyncValue; + AnimationConditionList maStCondList, maEndCondList; + AnimationConditionList maPrevCondList, maNextCondList; + }; + +} } + + +#endif diff --git a/oox/inc/oox/ppt/timenodelistcontext.hxx b/oox/inc/oox/ppt/timenodelistcontext.hxx new file mode 100644 index 000000000000..8dbe54425125 --- /dev/null +++ b/oox/inc/oox/ppt/timenodelistcontext.hxx @@ -0,0 +1,74 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_PPT_TIMENODELISTCONTEXT +#define OOX_PPT_TIMENODELISTCONTEXT + +#include "oox/core/contexthandler.hxx" +#include "oox/ppt/timenode.hxx" + +#include <com/sun/star/animations/XTimeContainer.hpp> + +namespace oox { namespace ppt { + + + class TimeNodeContext : public ::oox::core::ContextHandler + { + public: + virtual ~TimeNodeContext() throw(); + + static TimeNodeContext * SAL_CALL makeContext( ::oox::core::ContextHandler& rParent, sal_Int32 aElement, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttribs, const TimeNodePtr & pNode ); + + protected: + TimeNodeContext( ::oox::core::ContextHandler& rParent, sal_Int32 aElement, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttribs, const TimeNodePtr & pNode ) throw(); + + sal_Int32 mnElement; + TimeNodePtr mpNode; + }; + + + +/** FastParser context for XML_tnLst, XML_subTnLst and XML_childTnLst */ +class TimeNodeListContext : public ::oox::core::ContextHandler +{ +public: + TimeNodeListContext( ::oox::core::ContextHandler& rParent, TimeNodePtrList & aList ) throw(); + + virtual ~TimeNodeListContext() throw(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext( ::sal_Int32 Element, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + TimeNodePtrList & maList; +}; + +} } + +#endif // OOX_PPT_SLIDEFRAGMENTHANDLER diff --git a/oox/inc/oox/token/propertylist.hxx b/oox/inc/oox/token/propertylist.hxx new file mode 100644 index 000000000000..5f75b13e10c4 --- /dev/null +++ b/oox/inc/oox/token/propertylist.hxx @@ -0,0 +1,50 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_TOKEN_PROPERTYLIST_HXX +#define OOX_TOKEN_PROPERTYLIST_HXX + +#include <vector> +#include <rtl/ustring.hxx> + +namespace oox { + +// ============================================================================ + +/** A vector that contains all predefined property names used in the filters. */ +struct PropertyList : public ::std::vector< ::rtl::OUString > +{ + explicit PropertyList(); + ~PropertyList(); +}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/token/tokenmap.hxx b/oox/inc/oox/token/tokenmap.hxx new file mode 100644 index 000000000000..108feee9a2e8 --- /dev/null +++ b/oox/inc/oox/token/tokenmap.hxx @@ -0,0 +1,81 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_TOKEN_TOKENMAP_HXX +#define OOX_TOKEN_TOKENMAP_HXX + +#include <vector> +#include <rtl/instance.hxx> +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/Sequence.hxx> + +namespace oox { + +// ============================================================================ + +class TokenMap +{ +public: + explicit TokenMap(); + ~TokenMap(); + + /** Returns the Unicode name of the passed token identifier. */ + ::rtl::OUString getUnicodeTokenName( sal_Int32 nToken ) const; + + /** Returns the token identifier for the passed Unicode token name. */ + sal_Int32 getTokenFromUnicode( const ::rtl::OUString& rUnicodeName ) const; + + /** Returns the UTF8 name of the passed token identifier as byte sequence. */ + ::com::sun::star::uno::Sequence< sal_Int8 > + getUtf8TokenName( sal_Int32 nToken ) const; + + /** Returns the token identifier for the passed UTF8 token name. */ + sal_Int32 getTokenFromUtf8( + const ::com::sun::star::uno::Sequence< sal_Int8 >& rUtf8Name ) const; + +private: + struct TokenName + { + ::rtl::OUString maUniName; + ::com::sun::star::uno::Sequence< sal_Int8 > maUtf8Name; + }; + typedef ::std::vector< TokenName > TokenNameVector; + + TokenNameVector maTokenNames; + +}; + +// ============================================================================ + +struct StaticTokenMap : public ::rtl::Static< TokenMap, StaticTokenMap > {}; + +// ============================================================================ + +} // namespace oox + +#endif + diff --git a/oox/inc/oox/vml/vmldrawing.hxx b/oox/inc/oox/vml/vmldrawing.hxx new file mode 100644 index 000000000000..1af14903793b --- /dev/null +++ b/oox/inc/oox/vml/vmldrawing.hxx @@ -0,0 +1,175 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_VML_VMLDRAWING_HXX +#define OOX_VML_VMLDRAWING_HXX + +#include <map> +#include <memory> +#include "oox/ole/oleobjecthelper.hxx" + +namespace com { namespace sun { namespace star { + namespace awt { struct Rectangle; } + namespace awt { class XControlModel; } + namespace drawing { class XDrawPage; } +} } } + +namespace oox { namespace core { class XmlFilterBase; } } +namespace oox { namespace ole { class AxControlHelper; } } + +namespace oox { +namespace vml { + +class ShapeBase; +class ShapeContainer; +struct ShapeClientData; + +// ============================================================================ + +/** Enumerates different types of VML drawings. */ +enum DrawingType +{ + VMLDRAWING_WORD, /// Word: One shape per drawing. + VMLDRAWING_EXCEL, /// Excel: OLE objects are part of VML. + VMLDRAWING_POWERPOINT /// PowerPoint: OLE objects are part of DrawingML. +}; + +// ============================================================================ + +/** Contains information about an OLE object embedded in a draw page. */ +struct OleObjectInfo : public ::oox::ole::OleObjectInfo +{ + ::rtl::OUString maShapeId; /// Shape identifier for shape lookup. + ::rtl::OUString maName; /// Programmatical name of the OLE object. + bool mbAutoLoad; + const bool mbDmlShape; /// True = DrawingML shape (PowerPoint), false = VML shape (Excel/Word). + + explicit OleObjectInfo( bool bDmlShape = false ); + + /** Sets the string representation of the passed numeric shape identifier. */ + void setShapeId( sal_Int32 nShapeId ); +}; + +// ============================================================================ + +/** Contains information about a form control embedded in a draw page. */ +struct ControlInfo +{ + ::rtl::OUString maShapeId; /// Shape identifier for shape lookup. + ::rtl::OUString maFragmentPath; /// Path to the fragment describing the form control properties. + ::rtl::OUString maName; /// Programmatical name of the form control. + + explicit ControlInfo(); + + /** Sets the string representation of the passed numeric shape identifier. */ + void setShapeId( sal_Int32 nShapeId ); +}; + +// ============================================================================ + +/** Represents the collection of VML shapes for a complete draw page. */ +class Drawing +{ +public: + explicit Drawing( + ::oox::core::XmlFilterBase& rFilter, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& rxDrawPage, + DrawingType eType ); + + virtual ~Drawing(); + + /** Returns the filter object that imports/exports this VML drawing. */ + inline ::oox::core::XmlFilterBase& getFilter() const { return mrFilter; } + /** Returns the application type containing the drawing. */ + inline DrawingType getType() const { return meType; } + /** Returns read/write access to the container of shapes and templates. */ + inline ShapeContainer& getShapes() { return *mxShapes; } + /** Returns read access to the container of shapes and templates. */ + inline const ShapeContainer& getShapes() const { return *mxShapes; } + /** Returns the helper object used to process ActiveX form controls. */ + ::oox::ole::AxControlHelper& getControlHelper() const; + + /** Registers the passed embedded OLE object. The related shape will then + load the OLE object data from the specified fragment. */ + void registerOleObject( const OleObjectInfo& rOleObject ); + /** Registers the passed embedded form control. The related shape will then + load the control properties from the specified fragment. */ + void registerControl( const ControlInfo& rControl ); + + /** Final processing after import of the fragment. */ + void finalizeFragmentImport(); + + /** Creates and inserts all UNO shapes into the passed container. */ + void convertAndInsert() const; + + /** Returns the registered info structure for an OLE object, if extant. */ + const OleObjectInfo* getOleObjectInfo( const ::rtl::OUString& rShapeId ) const; + /** Returns the registered info structure for a form control, if extant. */ + const ControlInfo* getControlInfo( const ::rtl::OUString& rShapeId ) const; + + /** Derived classes may disable conversion of specific shapes. */ + virtual bool isShapeSupported( const ShapeBase& rShape ) const; + + /** Derived classes may calculate the shape rectangle from a non-standard + anchor information string. */ + virtual bool convertShapeClientAnchor( + ::com::sun::star::awt::Rectangle& orShapeRect, + const ::rtl::OUString& rShapeAnchor ) const; + + /** Derived classes may convert additional form control properties from the + passed VML shape client data. */ + virtual void convertControlClientData( + const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& rxCtrlModel, + const ShapeClientData& rClientData ) const; + +protected: + /** Derived classes may create a specialized form control helper object. */ + virtual ::oox::ole::AxControlHelper* createControlHelper() const; + +private: + typedef ::std::auto_ptr< ::oox::ole::AxControlHelper > AxControlHelperPtr; + typedef ::std::auto_ptr< ShapeContainer > ShapeContainerPtr; + typedef ::std::map< ::rtl::OUString, OleObjectInfo > OleObjectInfoMap; + typedef ::std::map< ::rtl::OUString, ControlInfo > ControlInfoMap; + + ::oox::core::XmlFilterBase& mrFilter; /// Filter object that imports/exports the VML drawing. + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > + mxDrawPage; /// UNO draw page used to insert the shapes. + mutable AxControlHelperPtr mxCtrlHelper;/// Form control helper. + ShapeContainerPtr mxShapes; /// All shapes and shape templates. + OleObjectInfoMap maOleObjects; /// Info about all embedded OLE objects, mapped by shape id. + ControlInfoMap maControls; /// Info about all embedded form controls, mapped by control name. + const DrawingType meType; /// Application type containing the drawing. +}; + +// ============================================================================ + +} // namespace vml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/vml/vmldrawingfragment.hxx b/oox/inc/oox/vml/vmldrawingfragment.hxx new file mode 100644 index 000000000000..e0ffcd9c5203 --- /dev/null +++ b/oox/inc/oox/vml/vmldrawingfragment.hxx @@ -0,0 +1,66 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_VML_VMLDRAWINGFRAGMENT_HXX +#define OOX_VML_VMLDRAWINGFRAGMENT_HXX + +#include "oox/core/fragmenthandler2.hxx" + +namespace oox { +namespace vml { + +class Drawing; + +// ============================================================================ + +class DrawingFragment : public ::oox::core::FragmentHandler2 +{ +public: + explicit DrawingFragment( + ::oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + Drawing& rDrawing ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > + openFragmentStream() const; + + virtual ::oox::core::ContextHandlerRef + onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + + virtual void finalizeImport(); + +private: + Drawing& mrDrawing; +}; + +// ============================================================================ + +} // namespace vml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/vml/vmlformatting.hxx b/oox/inc/oox/vml/vmlformatting.hxx new file mode 100644 index 000000000000..b997c7451fe4 --- /dev/null +++ b/oox/inc/oox/vml/vmlformatting.hxx @@ -0,0 +1,184 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_VML_VMLFORMATTING_HXX +#define OOX_VML_VMLFORMATTING_HXX + +#include "oox/helper/helper.hxx" + +namespace oox { class PropertyMap; } +namespace oox { namespace core { class FilterBase; } } + +namespace oox { +namespace vml { + +// ============================================================================ + +typedef ::std::pair< sal_Int32, sal_Int32 > Int32Pair; +typedef ::std::pair< double, double > DoublePair; + +// ============================================================================ + +class ConversionHelper +{ +public: + /** Returns two values contained in rValue separated by cSep. + */ + static bool separatePair( + ::rtl::OUString& orValue1, ::rtl::OUString& orValue2, + const ::rtl::OUString& rValue, sal_Unicode cSep ); + + /** Returns the boolean value from the passed string of a VML attribute. + Supported values: 'f', 't', 'false', 'true'. False for anything else. + */ + static bool decodeBool( const ::rtl::OUString& rValue ); + + /** Converts the passed VML percentage measure string to a normalized + floating-point value. + + @param rValue The VML percentage value. This is a floating-point value + with optional following '%' sign. If the '%' sign is missing, the + floating point value will be returned unmodified. If the '%' sign + is present, the value will be divided by 100. + */ + static double decodePercent( + const ::rtl::OUString& rValue, + double fDefValue ); + + /** Converts the passed VML measure string to EMU (English Metric Units). + + @param rFilter The core filter object needed to perform pixel + conversion according to the current output device. + + @param rValue The VML measure value. This is a floating-point value + with optional measure string following the value. + + @param nRefValue Reference value needed for percentage measure. + + @param bPixelX Set to true if the value is oriented horizontally (e.g. + X coordinates, widths). Set to false if the value is oriented + vertically (e.g. Y coordinates, heights). This is needed because + output devices may specify different width and height for a pixel. + + @param bDefaultAsPixel Set to true if omitted measure unit means + pixel. Set to false if omitted measure unit means EMU. + */ + static sal_Int32 decodeMeasureToEmu( + const ::oox::core::FilterBase& rFilter, + const ::rtl::OUString& rValue, + sal_Int32 nRefValue, + bool bPixelX, + bool bDefaultAsPixel ); + + /** Converts the passed VML measure string to 1/100 mm. + + @param rFilter See above. + @param rValue See above. + @param nRefValue See above. + @param bPixelX See above. + @param bDefaultAsPixel See above. + */ + static sal_Int32 decodeMeasureToHmm( + const ::oox::core::FilterBase& rFilter, + const ::rtl::OUString& rValue, + sal_Int32 nRefValue, + bool bPixelX, + bool bDefaultAsPixel ); + +private: + ConversionHelper(); + ~ConversionHelper(); +}; + +// ============================================================================ + +/** The stroke arrow model structure contains all properties for an line end arrow. */ +struct StrokeArrowModel +{ + OptValue< sal_Int32 > moArrowType; + OptValue< sal_Int32 > moArrowWidth; + OptValue< sal_Int32 > moArrowLength; + + void assignUsed( const StrokeArrowModel& rSource ); +}; + +// ============================================================================ + +/** The stroke model structure contains all shape border properties. */ +struct StrokeModel +{ + OptValue< bool > moStroked; /// Shape border line on/off. + StrokeArrowModel maStartArrow; /// Start line arrow style. + StrokeArrowModel maEndArrow; /// End line arrow style. + OptValue< ::rtl::OUString > moColor; /// Solid line color. + OptValue< double > moOpacity; /// Solid line color opacity. + OptValue< ::rtl::OUString > moWeight; /// Line width. + OptValue< ::rtl::OUString > moDashStyle; /// Line dash (predefined or manually). + OptValue< sal_Int32 > moLineStyle; /// Line style (single, double, ...). + OptValue< sal_Int32 > moEndCap; /// Type of line end cap. + OptValue< sal_Int32 > moJoinStyle; /// Type of line join. + + void assignUsed( const StrokeModel& rSource ); + + /** Writes the properties to the passed property map. */ + void pushToPropMap( + PropertyMap& rPropMap, + const ::oox::core::FilterBase& rFilter ) const; +}; + +// ============================================================================ + +/** The fill model structure contains all shape fill properties. */ +struct FillModel +{ + OptValue< bool > moFilled; /// Shape fill on/off. + OptValue< ::rtl::OUString > moColor; /// Solid fill color. + OptValue< double > moOpacity; /// Solid fill color opacity. + OptValue< ::rtl::OUString > moColor2; /// End color of gradient. + OptValue< double > moOpacity2; /// End color opycity of gradient. + OptValue< sal_Int32 > moType; /// Fill type. + OptValue< sal_Int32 > moAngle; /// Gradient rotation angle. + OptValue< double > moFocus; /// Linear gradient focus of second color. + OptValue< DoublePair > moFocusPos; /// Rectanguar gradient focus position of second color. + OptValue< DoublePair > moFocusSize; /// Rectanguar gradient focus size of second color. + OptValue< bool > moRotate; /// True = rotate gradient/bitmap with shape. + + void assignUsed( const FillModel& rSource ); + + /** Writes the properties to the passed property map. */ + void pushToPropMap( + PropertyMap& rPropMap, + const ::oox::core::FilterBase& rFilter ) const; +}; + +// ============================================================================ + +} // namespace vml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/vml/vmlinputstream.hxx b/oox/inc/oox/vml/vmlinputstream.hxx new file mode 100644 index 000000000000..311fc17df960 --- /dev/null +++ b/oox/inc/oox/vml/vmlinputstream.hxx @@ -0,0 +1,69 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_VML_VMLINPUTSTREAM_HXX +#define OOX_VML_VMLINPUTSTREAM_HXX + +#include <comphelper/seqstream.hxx> + +namespace oox { +namespace vml { + +// ============================================================================ + +struct StreamDataContainer +{ + ::comphelper::ByteSequence maDataSeq; + + explicit StreamDataContainer( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm ); +}; + +// ============================================================================ + +/** An input stream class for VML streams. + + This stream reads the entire data from the input stream passed to the + constructor, and parses all XML elements for features unsupported by the + current Expat parser. + + All elements that have the form '<![inst]>' where 'inst' is any string not + containing the characters '<' and '>' are stripped from the input stream. + */ +class InputStream : private StreamDataContainer, public ::comphelper::SequenceInputStream +{ +public: + explicit InputStream( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm ); + virtual ~InputStream(); +}; + +// ============================================================================ + +} // namespace vml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx new file mode 100644 index 000000000000..18eaa7513fc5 --- /dev/null +++ b/oox/inc/oox/vml/vmlshape.hxx @@ -0,0 +1,330 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_VML_VMLSHAPE_HXX +#define OOX_VML_VMLSHAPE_HXX + +#include <memory> +#include <vector> +#include <com/sun/star/awt/Point.hpp> +#include "oox/vml/vmlformatting.hxx" + +namespace com { namespace sun { namespace star { + namespace awt { struct Rectangle; } + namespace drawing { class XShape; } + namespace drawing { class XShapes; } +} } } + +namespace oox { +namespace vml { + +class Drawing; +struct ShapeParentAnchor; +class ShapeContainer; + +// ============================================================================ + +/** The shape model structure contains all properties shared by all types of shapes. */ +struct ShapeTypeModel +{ + ::rtl::OUString maShapeId; /// Unique identifier of the shape. + ::rtl::OUString maName; /// Name of the shape, if present. + OptValue< sal_Int32 > moShapeType; /// Builtin shape type identifier. + + OptValue< Int32Pair > moCoordPos; /// Top-left position of coordinate system for children scaling. + OptValue< Int32Pair > moCoordSize; /// Size of coordinate system for children scaling. + ::rtl::OUString maPosition; /// Position type of the shape. + ::rtl::OUString maLeft; /// X position of the shape bounding box (number with unit). + ::rtl::OUString maTop; /// Y position of the shape bounding box (number with unit). + ::rtl::OUString maWidth; /// Width of the shape bounding box (number with unit). + ::rtl::OUString maHeight; /// Height of the shape bounding box (number with unit). + ::rtl::OUString maMarginLeft; /// X position of the shape bounding box to shape anchor (number with unit). + ::rtl::OUString maMarginTop; /// Y position of the shape bounding box to shape anchor (number with unit). + + StrokeModel maStrokeModel; /// Border line formatting. + FillModel maFillModel; /// Shape fill formatting. + + OptValue< ::rtl::OUString > moGraphicPath; /// Path to a graphic for this shape. + OptValue< ::rtl::OUString > moGraphicTitle; /// Title of the graphic. + + explicit ShapeTypeModel(); + + void assignUsed( const ShapeTypeModel& rSource ); +}; + +// ---------------------------------------------------------------------------- + +/** A shape template contains all formatting properties of shapes and can serve + as templates for several shapes in a drawing. */ +class ShapeType +{ +public: + explicit ShapeType( const Drawing& rDrawing ); + virtual ~ShapeType(); + + /** Returns read/write access to the shape template model structure. */ + inline ShapeTypeModel& getTypeModel() { return maTypeModel; } + /** Returns read access to the shape template model structure. */ + inline const ShapeTypeModel& getTypeModel() const { return maTypeModel; } + + /** Returns the shape identifier (which is unique through the containing drawing). */ + inline const ::rtl::OUString& getShapeId() const { return maTypeModel.maShapeId; } + /** Returns the fragment path to the embedded graphic used by this shape. */ + ::rtl::OUString getGraphicPath() const; + +protected: + /** Returns the coordinate system of this shape. */ + ::com::sun::star::awt::Rectangle getCoordSystem() const; + /** Returns the absolute shape rectangle according to the passed anchor. */ + ::com::sun::star::awt::Rectangle getRectangle( const ShapeParentAnchor* pParentAnchor ) const; + +private: + /** Returns the absolute shape rectangle. */ + ::com::sun::star::awt::Rectangle getAbsRectangle() const; + /** Returns the rectangle relative to the parent coordinate system. */ + ::com::sun::star::awt::Rectangle getRelRectangle() const; + +protected: + const Drawing& mrDrawing; /// The VML drawing page that contains this shape. + ShapeTypeModel maTypeModel; /// The model structure containing shape type data. +}; + +// ============================================================================ + +/** Excel specific shape client data (such as cell anchor). */ +struct ShapeClientData +{ + ::rtl::OUString maAnchor; /// Cell anchor as comma-separated string. + ::rtl::OUString maPictureLink; /// Target cell range of picture links. + ::rtl::OUString maLinkedCell; /// Link to value cell associated to the control. + ::rtl::OUString maSourceRange; /// Link to cell range used as data source for the control. + sal_Int32 mnObjType; /// Type of the shape. + sal_Int32 mnCol; /// Column index for spreadsheet cell note. + sal_Int32 mnRow; /// Row index for spreadsheet cell note. + bool mbPrintObject; /// True = print the object. + bool mbVisible; /// True = cell note is visible. + + explicit ShapeClientData(); +}; + +// ---------------------------------------------------------------------------- + +struct ShapeModel +{ + typedef ::std::vector< ::com::sun::star::awt::Point > PointVector; + typedef ::std::auto_ptr< ShapeClientData > ShapeClientDataPtr; + + ::rtl::OUString maType; /// Shape template with default properties. + PointVector maPoints; /// Points for the polyline shape. + ShapeClientDataPtr mxClientData; /// Excel specific shape client data. + + explicit ShapeModel(); + + /** Creates and returns a new shape client data structure. */ + ShapeClientData& createClientData(); +}; + +// ---------------------------------------------------------------------------- + +/** A shape object that is part of a drawing. May inherit properties from a + shape template. */ +class ShapeBase : public ShapeType +{ +public: + /** Returns read/write access to the shape model structure. */ + inline ShapeModel& getShapeModel() { return maShapeModel; } + /** Returns read access to the shape model structure. */ + inline const ShapeModel& getShapeModel() const { return maShapeModel; } + + /** Final processing after import of the drawing fragment. */ + virtual void finalizeFragmentImport(); + + /** Returns the shape template with the passed identifier from the child shapes. */ + virtual const ShapeType* getChildTypeById( const ::rtl::OUString& rShapeId ) const; + /** Returns the shape with the passed identifier from the child shapes. */ + virtual const ShapeBase* getChildById( const ::rtl::OUString& rShapeId ) const; + + /** Creates the corresponding XShape and inserts it into the passed container. */ + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + convertAndInsert( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ShapeParentAnchor* pParentAnchor = 0 ) const; + + /** Converts position and formatting into the passed existing XShape. */ + void convertFormatting( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape, + const ShapeParentAnchor* pParentAnchor = 0 ) const; + +protected: + explicit ShapeBase( const Drawing& rDrawing ); + + /** Derived classes create the corresponding XShape and insert it into the passed container. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + implConvertAndInsert( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle& rShapeRect ) const = 0; + + /** Calculates the final shape rectangle according to the passed anchor, + if present, otherwise according to the own anchor settings. */ + ::com::sun::star::awt::Rectangle calcShapeRectangle( + const ShapeParentAnchor* pParentAnchor ) const; + + /** Converts common shape properties such as formatting attributes. */ + void convertShapeProperties( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape ) const; + +protected: + ShapeModel maShapeModel; /// The model structure containing shape data. +}; + +// ============================================================================ + +/** A simple shape object based on a specific UNO shape service. */ +class SimpleShape : public ShapeBase +{ +public: + explicit SimpleShape( const Drawing& rDrawing, const ::rtl::OUString& rService ); + +protected: + /** Creates the corresponding XShape and inserts it into the passed container. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + implConvertAndInsert( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle& rShapeRect ) const; + +private: + ::rtl::OUString maService; /// Name of the UNO shape service. +}; + +// ============================================================================ + +/** A rectangular shape object. */ +class RectangleShape : public SimpleShape +{ +public: + explicit RectangleShape( const Drawing& rDrawing ); +}; + +// ============================================================================ + +/** An oval shape object. */ +class EllipseShape : public SimpleShape +{ +public: + explicit EllipseShape( const Drawing& rDrawing ); +}; + +// ============================================================================ + +/** A polygon shape object. */ +class PolyLineShape : public SimpleShape +{ +public: + explicit PolyLineShape( const Drawing& rDrawing ); + +protected: + /** Creates the corresponding XShape and inserts it into the passed container. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + implConvertAndInsert( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle& rShapeRect ) const; +}; + +// ============================================================================ + +/** A shape object with custom geometry. */ +class CustomShape : public SimpleShape +{ +public: + explicit CustomShape( const Drawing& rDrawing ); + +protected: + /** Creates the corresponding XShape and inserts it into the passed container. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + implConvertAndInsert( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle& rShapeRect ) const; +}; + +// ============================================================================ + +/** A complex shape object. This can be a picture shape, a custom shape, an OLE + object, or an ActiveX form control. */ +class ComplexShape : public CustomShape +{ +public: + explicit ComplexShape( const Drawing& rDrawing ); + +protected: + /** Creates the corresponding XShape and inserts it into the passed container. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + implConvertAndInsert( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle& rShapeRect ) const; +}; + +// ============================================================================ + +/** A group shape that extends the basic shape by a container of child shapes. */ +class GroupShape : public ShapeBase +{ +public: + explicit GroupShape( const Drawing& rDrawing ); + virtual ~GroupShape(); + + /** Returns read/write access to the container of child shapes and templates. */ + inline ShapeContainer& getChildren() { return *mxChildren; } + /** Returns read access to the container of child shapes and templates. */ + inline const ShapeContainer& getChildren() const { return *mxChildren; } + + /** Final processing after import of the drawing fragment. */ + virtual void finalizeFragmentImport(); + + /** Returns the shape template with the passed identifier from the child shapes. */ + virtual const ShapeType* getChildTypeById( const ::rtl::OUString& rShapeId ) const; + /** Returns the shape with the passed identifier from the child shapes. */ + virtual const ShapeBase* getChildById( const ::rtl::OUString& rShapeId ) const; + +protected: + /** Creates the corresponding XShape and inserts it into the passed container. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > + implConvertAndInsert( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ::com::sun::star::awt::Rectangle& rShapeRect ) const; + +private: + typedef ::std::auto_ptr< ShapeContainer > ShapeContainerPtr; + ShapeContainerPtr mxChildren; /// Shapes and templates that are part of this group. +}; + +// ============================================================================ + +} // namespace vml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/vml/vmlshapecontainer.hxx b/oox/inc/oox/vml/vmlshapecontainer.hxx new file mode 100644 index 000000000000..d2682c89fd6c --- /dev/null +++ b/oox/inc/oox/vml/vmlshapecontainer.hxx @@ -0,0 +1,139 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_VML_VMLSHAPECONTAINER_HXX +#define OOX_VML_VMLSHAPECONTAINER_HXX + +#include <com/sun/star/awt/Rectangle.hpp> +#include "oox/helper/containerhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace drawing { class XShapes; } +} } } + +namespace oox { +namespace vml { + +class Drawing; +class ShapeType; +class ShapeBase; + +// ============================================================================ + +struct ShapeParentAnchor +{ + ::com::sun::star::awt::Rectangle maShapeRect; + ::com::sun::star::awt::Rectangle maCoordSys; +}; + +// ============================================================================ + +/** Container that holds a list of shapes and shape templates. */ +class ShapeContainer +{ +public: + explicit ShapeContainer( const Drawing& rDrawing ); + ~ShapeContainer(); + + /** Creates and returns a new shape template object. */ + ShapeType& createShapeType(); + /** Creates and returns a new shape object of the specified type. */ + template< typename ShapeT > + ShapeT& createShape(); + + /** Final processing after import of the drawing fragment. */ + void finalizeFragmentImport(); + + /** Returns true, if this contaikner does not contain any shapes. */ + inline bool empty() const { return maShapes.empty(); } + + /** Returns the shape template with the passed identifier. + @param bDeep True = searches in all group shapes too. */ + const ShapeType* getShapeTypeById( const ::rtl::OUString& rShapeId, bool bDeep ) const; + /** Returns the shape with the passed identifier. + @param bDeep True = searches in all group shapes too. */ + const ShapeBase* getShapeById( const ::rtl::OUString& rShapeId, bool bDeep ) const; + + /** Searches for a shape type by using the passed functor that takes a + constant reference of a ShapeType object. */ + template< typename Functor > + const ShapeType* findShapeType( const Functor& rFunctor ) const; + /** Searches for a shape by using the passed functor that takes a constant + reference of a ShapeBase object. */ + template< typename Functor > + const ShapeBase* findShape( const Functor& rFunctor ) const; + + /** Returns the first shape in the collection (Word only). */ + const ShapeBase* getFirstShape() const; + + /** Creates and inserts all UNO shapes into the passed container. */ + void convertAndInsert( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + const ShapeParentAnchor* pParentAnchor = 0 ) const; + +private: + typedef RefVector< ShapeType > ShapeTypeVector; + typedef RefVector< ShapeBase > ShapeVector; + typedef RefMap< ::rtl::OUString, ShapeType > ShapeTypeMap; + typedef RefMap< ::rtl::OUString, ShapeBase > ShapeMap; + + const Drawing& mrDrawing; /// The VML drawing page that contains this shape. + ShapeTypeVector maTypes; /// All shape templates. + ShapeVector maShapes; /// All shape definitions. + ShapeTypeMap maTypesById; /// All shape templates mapped by identifier. + ShapeMap maShapesById; /// All shape definitions mapped by identifier. +}; + +// ---------------------------------------------------------------------------- + +template< typename ShapeT > +ShapeT& ShapeContainer::createShape() +{ + ::boost::shared_ptr< ShapeT > xShape( new ShapeT( mrDrawing ) ); + maShapes.push_back( xShape ); + return *xShape; +} + +template< typename Functor > +const ShapeType* ShapeContainer::findShapeType( const Functor& rFunctor ) const +{ + return maTypes.findIf( rFunctor ).get(); +} + +template< typename Functor > +const ShapeBase* ShapeContainer::findShape( const Functor& rFunctor ) const +{ + return maShapes.findIf( rFunctor ).get(); +} + +// ============================================================================ + +} // namespace vml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/vml/vmlshapecontext.hxx b/oox/inc/oox/vml/vmlshapecontext.hxx new file mode 100644 index 000000000000..a72d3fd09039 --- /dev/null +++ b/oox/inc/oox/vml/vmlshapecontext.hxx @@ -0,0 +1,145 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_VML_VMLSHAPECONTEXT_HXX +#define OOX_VML_VMLSHAPECONTEXT_HXX + +#include "oox/core/contexthandler2.hxx" + +namespace oox { +namespace vml { + +struct ShapeTypeModel; +class ShapeType; + +struct ShapeClientData; +struct ShapeModel; +class ShapeBase; +class GroupShape; + +class ShapeContainer; + +// ============================================================================ + +class ShapeClientDataContext : public ::oox::core::ContextHandler2 +{ +public: + explicit ShapeClientDataContext( + ::oox::core::ContextHandler2Helper& rParent, + const AttributeList& rAttribs, + ShapeClientData& rClientData ); + + virtual ::oox::core::ContextHandlerRef + onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + +private: + ShapeClientData& mrClientData; +}; + +// ============================================================================ + +class ShapeContextBase : public ::oox::core::ContextHandler2 +{ +public: + static ::oox::core::ContextHandlerRef + createShapeContext( + ::oox::core::ContextHandler2Helper& rParent, + sal_Int32 nElement, + const AttributeList& rAttribs, + ShapeContainer& rShapes ); + +protected: + explicit ShapeContextBase( ::oox::core::ContextHandler2Helper& rParent ); +}; + +// ============================================================================ + +class ShapeTypeContext : public ShapeContextBase +{ +public: + explicit ShapeTypeContext( + ::oox::core::ContextHandler2Helper& rParent, + const AttributeList& rAttribs, + ShapeType& rShapeType ); + + virtual ::oox::core::ContextHandlerRef + onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + /** Processes the 'style' attribute. */ + void setStyle( const ::rtl::OUString& rStyle ); + +private: + ShapeTypeModel& mrTypeModel; +}; + +// ============================================================================ + +class ShapeContext : public ShapeTypeContext +{ +public: + explicit ShapeContext( + ::oox::core::ContextHandler2Helper& rParent, + const AttributeList& rAttribs, + ShapeBase& rShape ); + + virtual ::oox::core::ContextHandlerRef + onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + /** Processes the 'points' attribute. */ + void setPoints( const ::rtl::OUString& rPoints ); + +private: + ShapeModel& mrShapeModel; +}; + +// ============================================================================ + +class GroupShapeContext : public ShapeContext +{ +public: + explicit GroupShapeContext( + ::oox::core::ContextHandler2Helper& rParent, + const AttributeList& rAttribs, + GroupShape& rShape ); + + virtual ::oox::core::ContextHandlerRef + onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + ShapeContainer& mrShapes; +}; + +// ============================================================================ + +} // namespace vml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/addressconverter.hxx b/oox/inc/oox/xls/addressconverter.hxx new file mode 100644 index 000000000000..c11bd31bbf22 --- /dev/null +++ b/oox/inc/oox/xls/addressconverter.hxx @@ -0,0 +1,692 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_ADDRESSCONVERTER_HXX +#define OOX_XLS_ADDRESSCONVERTER_HXX + +#include <vector> +#include <com/sun/star/table/CellAddress.hpp> +#include <com/sun/star/table/CellRangeAddress.hpp> +#include "oox/xls/workbookhelper.hxx" + +namespace oox { +namespace xls { + +class BiffInputStream; +class BiffOutputStream; + +// ============================================================================ +// ============================================================================ + +/** A vector of com.sun.star.table.CellRangeAddress elements and additional + functionality. */ +class ApiCellRangeList : public ::std::vector< ::com::sun::star::table::CellRangeAddress > +{ +public: + inline explicit ApiCellRangeList() {} + + /** Returns the base address of this range list (top-left cell of first range). */ + ::com::sun::star::table::CellAddress + getBaseAddress() const; +}; + +// ============================================================================ + +/** A 2D cell address struct for binary filters. */ +struct BinAddress +{ + sal_Int32 mnCol; + sal_Int32 mnRow; + + inline explicit BinAddress() : mnCol( 0 ), mnRow( 0 ) {} + inline explicit BinAddress( sal_Int32 nCol, sal_Int32 nRow ) : mnCol( nCol ), mnRow( nRow ) {} + inline explicit BinAddress( const ::com::sun::star::table::CellAddress& rAddr ) : mnCol( rAddr.Column ), mnRow( rAddr.Row ) {} + + inline void set( sal_Int32 nCol, sal_Int32 nRow ) { mnCol = nCol; mnRow = nRow; } + inline void set( const ::com::sun::star::table::CellAddress& rAddr ) { mnCol = rAddr.Column; mnRow = rAddr.Row; } + + void read( RecordInputStream& rStrm ); + void read( BiffInputStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ); + void write( BiffOutputStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ) const; +}; + +// ---------------------------------------------------------------------------- + +inline bool operator==( const BinAddress& rL, const BinAddress& rR ) +{ + return (rL.mnCol == rR.mnCol) && (rL.mnRow == rR.mnRow); +} + +inline bool operator<( const BinAddress& rL, const BinAddress& rR ) +{ + return (rL.mnCol < rR.mnCol) || ((rL.mnCol == rR.mnCol) && (rL.mnRow < rR.mnRow)); +} + +inline RecordInputStream& operator>>( RecordInputStream& rStrm, BinAddress& orPos ) +{ + orPos.read( rStrm ); + return rStrm; +} + +inline BiffInputStream& operator>>( BiffInputStream& rStrm, BinAddress& orPos ) +{ + orPos.read( rStrm ); + return rStrm; +} + +inline BiffOutputStream& operator<<( BiffOutputStream& rStrm, const BinAddress& rPos ) +{ + rPos.write( rStrm ); + return rStrm; +} + +// ============================================================================ + +/** A 2D cell range address struct for binary filters. */ +struct BinRange +{ + BinAddress maFirst; + BinAddress maLast; + + inline explicit BinRange() {} + inline explicit BinRange( const BinAddress& rAddr ) : maFirst( rAddr ), maLast( rAddr ) {} + inline explicit BinRange( const BinAddress& rFirst, const BinAddress& rLast ) : maFirst( rFirst ), maLast( rLast ) {} + inline explicit BinRange( sal_Int32 nCol1, sal_Int32 nRow1, sal_Int32 nCol2, sal_Int32 nRow2 ) : + maFirst( nCol1, nRow1 ), maLast( nCol2, nRow2 ) {} + inline explicit BinRange( const ::com::sun::star::table::CellAddress& rAddr ) : maFirst( rAddr ), maLast( rAddr ) {} + inline explicit BinRange( const ::com::sun::star::table::CellAddress& rFirst, const ::com::sun::star::table::CellAddress& rLast ) : maFirst( rFirst ), maLast( rLast ) {} + inline explicit BinRange( const ::com::sun::star::table::CellRangeAddress& rRange ) : maFirst( rRange.StartColumn, rRange.StartRow ), maLast( rRange.EndColumn, rRange.EndRow ) {} + + inline void set( const BinAddress& rFirst, const BinAddress& rLast ) + { maFirst = rFirst; maLast = rLast; } + inline void set( sal_Int32 nCol1, sal_Int32 nRow1, sal_Int32 nCol2, sal_Int32 nRow2 ) + { maFirst.set( nCol1, nRow1 ); maLast.set( nCol2, nRow2 ); } + inline void set( const ::com::sun::star::table::CellAddress& rFirst, const ::com::sun::star::table::CellAddress& rLast ) + { maFirst.set( rFirst ); maLast.set( rLast ); } + inline void set( const ::com::sun::star::table::CellRangeAddress& rRange ) + { maFirst.set( rRange.StartColumn, rRange.StartRow ); maLast.set( rRange.EndColumn, rRange.EndRow ); } + + inline sal_Int32 getColCount() const { return maLast.mnCol - maFirst.mnCol + 1; } + inline sal_Int32 getRowCount() const { return maLast.mnRow - maFirst.mnRow + 1; } + bool contains( const BinAddress& rAddr ) const; + + void read( RecordInputStream& rStrm ); + void read( BiffInputStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ); + void write( BiffOutputStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ) const; +}; + +// ---------------------------------------------------------------------------- + +inline bool operator==( const BinRange& rL, const BinRange& rR ) +{ + return (rL.maFirst == rR.maFirst) && (rL.maLast == rR.maLast); +} + +inline bool operator<( const BinRange& rL, const BinRange& rR ) +{ + return (rL.maFirst < rR.maFirst) || ((rL.maFirst == rR.maFirst) && (rL.maLast < rR.maLast)); +} + +inline RecordInputStream& operator>>( RecordInputStream& rStrm, BinRange& orRange ) +{ + orRange.read( rStrm ); + return rStrm; +} + +inline BiffInputStream& operator>>( BiffInputStream& rStrm, BinRange& orRange ) +{ + orRange.read( rStrm ); + return rStrm; +} + +inline BiffOutputStream& operator<<( BiffOutputStream& rStrm, const BinRange& rRange ) +{ + rRange.write( rStrm ); + return rStrm; +} + +// ============================================================================ + +/** A 2D cell range address list for binary filters. */ +class BinRangeList : public ::std::vector< BinRange > +{ +public: + inline explicit BinRangeList() {} + + BinRange getEnclosingRange() const; + + void read( RecordInputStream& rStrm ); + void read( BiffInputStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ); + void write( BiffOutputStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ) const; + void writeSubList( BiffOutputStream& rStrm, + size_t nBegin, size_t nCount, bool bCol16Bit = true, bool bRow32Bit = false ) const; +}; + +// ---------------------------------------------------------------------------- + +inline RecordInputStream& operator>>( RecordInputStream& rStrm, BinRangeList& orRanges ) +{ + orRanges.read( rStrm ); + return rStrm; +} + +inline BiffInputStream& operator>>( BiffInputStream& rStrm, BinRangeList& orRanges ) +{ + orRanges.read( rStrm ); + return rStrm; +} + +inline BiffOutputStream& operator<<( BiffOutputStream& rStrm, const BinRangeList& rRanges ) +{ + rRanges.write( rStrm ); + return rStrm; +} + +// ============================================================================ + +/** Different target types that can be encoded in a BIFF URL. */ +enum BiffTargetType +{ + BIFF_TARGETTYPE_URL, /// URL, URL with sheet name, or sheet name. + BIFF_TARGETTYPE_SAMESHEET, /// Target for special '!A1' syntax to refer to current sheet. + BIFF_TARGETTYPE_LIBRARY, /// Library directory in application installation. + BIFF_TARGETTYPE_DDE_OLE, /// DDE server/topic or OLE class/target. + BIFF_TARGETTYPE_UNKNOWN /// Unknown/unsupported target type. +}; + +// ============================================================================ +// ============================================================================ + +/** Converter for cell addresses and cell ranges for OOX and BIFF filters. + */ +class AddressConverter : public WorkbookHelper +{ +public: + explicit AddressConverter( const WorkbookHelper& rHelper ); + + // ------------------------------------------------------------------------ + + /** Tries to parse the passed string for a 2d cell address in A1 notation. + + This function accepts all strings that match the regular expression + "[a-zA-Z]{1,6}0*[1-9][0-9]{0,8}" (without quotes), i.e. 1 to 6 letters + for the column index (translated to 0-based column indexes from 0 to + 321,272,405), and 1 to 9 digits for the 1-based row index (translated + to 0-based row indexes from 0 to 999,999,998). The row number part may + contain leading zeros, they will be ignored. It is up to the caller to + handle cell addresses outside of a specific valid range (e.g. the + entire spreadsheet). + + @param ornColumn (out-parameter) Returns the converted column index. + @param ornRow (out-parameter) returns the converted row index. + @param rString The string containing the cell address. + @param nStart Start index of string part in rString to be parsed. + @param nLength Length of string part in rString to be parsed. + + @return true = Parsed string was valid, returned values can be used. + */ + static bool parseOoxAddress2d( + sal_Int32& ornColumn, sal_Int32& ornRow, + const ::rtl::OUString& rString, + sal_Int32 nStart = 0, + sal_Int32 nLength = SAL_MAX_INT32 ); + + /** Tries to parse the passed string for a 2d cell range in A1 notation. + + This function accepts all strings that match the regular expression + "ADDR(:ADDR)?" (without quotes), where ADDR is a cell address accepted + by the parseOoxAddress2d() function of this class. It is up to the + caller to handle cell ranges outside of a specific valid range (e.g. + the entire spreadsheet). + + @param ornStartColumn (out-parameter) Returns the converted start column index. + @param ornStartRow (out-parameter) returns the converted start row index. + @param ornEndColumn (out-parameter) Returns the converted end column index. + @param ornEndRow (out-parameter) returns the converted end row index. + @param rString The string containing the cell address. + @param nStart Start index of string part in rString to be parsed. + @param nLength Length of string part in rString to be parsed. + + @return true = Parsed string was valid, returned values can be used. + */ + static bool parseOoxRange2d( + sal_Int32& ornStartColumn, sal_Int32& ornStartRow, + sal_Int32& ornEndColumn, sal_Int32& ornEndRow, + const ::rtl::OUString& rString, + sal_Int32 nStart = 0, + sal_Int32 nLength = SAL_MAX_INT32 ); + + /** Tries to parse an encoded name of an external link target in BIFF + documents, e.g. from EXTERNSHEET or SUPBOOK records. + + @param orClassName (out-parameter) DDE server name or OLE class name. + @param orTargetUrl (out-parameter) Target URL, DDE topic or OLE object name. + @param orSheetName (out-parameter) Sheet name in target document. + @param rBiffEncoded Encoded name of the external link target. + @param bFromDConRec True = path from DCONREF/DCONNAME/DCONBINAME records, false = other records. + + @return Type of the decoded target. + */ + BiffTargetType parseBiffTargetUrl( + ::rtl::OUString& orClassName, + ::rtl::OUString& orTargetUrl, + ::rtl::OUString& orSheetName, + const ::rtl::OUString& rBiffTargetUrl, + bool bFromDConRec = false ); + + // ------------------------------------------------------------------------ + + /** Returns the biggest valid cell address in the own Calc document. */ + inline const ::com::sun::star::table::CellAddress& + getMaxApiAddress() const { return maMaxApiPos; } + + /** Returns the biggest valid cell address in the imported/exported + Excel document. */ + inline const ::com::sun::star::table::CellAddress& + getMaxXlsAddress() const { return maMaxXlsPos; } + + /** Returns the biggest valid cell address in both Calc and the + imported/exported Excel document. */ + inline const ::com::sun::star::table::CellAddress& + getMaxAddress() const { return maMaxPos; } + + /** Returns the column overflow status. */ + inline bool isColOverflow() const { return mbColOverflow; } + /** Returns the row overflow status. */ + inline bool isRowOverflow() const { return mbRowOverflow; } + /** Returns the sheet overflow status. */ + inline bool isTabOverflow() const { return mbTabOverflow; } + + // ------------------------------------------------------------------------ + + /** Checks if the passed column index is valid. + + @param nCol The column index to check. + @param bTrackOverflow true = Update the internal overflow flag, if the + column index is outside of the supported limits. + @return true = Passed column index is valid (no index overflow). + */ + bool checkCol( sal_Int32 nCol, bool bTrackOverflow ); + + /** Checks if the passed row index is valid. + + @param nRow The row index to check. + @param bTrackOverflow true = Update the internal overflow flag, if the + row index is outside of the supported limits. + @return true = Passed row index is valid (no index overflow). + */ + bool checkRow( sal_Int32 nRow, bool bTrackOverflow ); + + /** Checks if the passed sheet index is valid. + + @param nSheet The sheet index to check. + @param bTrackOverflow true = Update the internal overflow flag, if the + sheet index is outside of the supported limits. + @return true = Passed sheet index is valid (no index overflow). + */ + bool checkTab( sal_Int16 nSheet, bool bTrackOverflow ); + + // ------------------------------------------------------------------------ + + /** Checks the passed cell address if it fits into the spreadsheet limits. + + @param rAddress The cell address to be checked. + @param bTrackOverflow true = Update the internal overflow flags, if + the address is outside of the supported sheet limits. + @return true = Passed address is valid (no index overflow). + */ + bool checkCellAddress( + const ::com::sun::star::table::CellAddress& rAddress, + bool bTrackOverflow ); + + /** Converts the passed string to a single cell address, without checking + any sheet limits. + + @param orAddress (out-parameter) Returns the converted cell address. + @param rString Cell address string in A1 notation. + @param nSheet Sheet index to be inserted into orAddress. + @return true = Cell address could be parsed from the passed string. + */ + bool convertToCellAddressUnchecked( + ::com::sun::star::table::CellAddress& orAddress, + const ::rtl::OUString& rString, + sal_Int16 nSheet ); + + /** Tries to convert the passed string to a single cell address. + + @param orAddress (out-parameter) Returns the converted cell address. + @param rString Cell address string in A1 notation. + @param nSheet Sheet index to be inserted into orAddress (will be checked). + @param bTrackOverflow true = Update the internal overflow flags, if + the address is outside of the supported sheet limits. + @return true = Converted address is valid (no index overflow). + */ + bool convertToCellAddress( + ::com::sun::star::table::CellAddress& orAddress, + const ::rtl::OUString& rString, + sal_Int16 nSheet, + bool bTrackOverflow ); + + /** Returns a valid cell address by moving it into allowed dimensions. + + @param rString Cell address string in A1 notation. + @param nSheet Sheet index for the returned address (will be checked). + @param bTrackOverflow true = Update the internal overflow flags, if + the address is outside of the supported sheet limits. + @return A valid API cell address struct. */ + ::com::sun::star::table::CellAddress + createValidCellAddress( + const ::rtl::OUString& rString, + sal_Int16 nSheet, + bool bTrackOverflow ); + + /** Converts the passed address to a single cell address, without checking + any sheet limits. + + @param orAddress (out-parameter) Returns the converted cell address. + @param rBinAddress Binary cell address struct. + @param nSheet Sheet index to be inserted into orAddress. + */ + void convertToCellAddressUnchecked( + ::com::sun::star::table::CellAddress& orAddress, + const BinAddress& rBinAddress, + sal_Int16 nSheet ); + + /** Tries to convert the passed address to a single cell address. + + @param orAddress (out-parameter) Returns the converted cell address. + @param rBinAddress Binary cell address struct. + @param nSheet Sheet index to be inserted into orAddress (will be checked). + @param bTrackOverflow true = Update the internal overflow flags, if + the address is outside of the supported sheet limits. + @return true = Converted address is valid (no index overflow). + */ + bool convertToCellAddress( + ::com::sun::star::table::CellAddress& orAddress, + const BinAddress& rBinAddress, + sal_Int16 nSheet, + bool bTrackOverflow ); + + /** Returns a valid cell address by moving it into allowed dimensions. + + @param rBinAddress Binary cell address struct. + @param nSheet Sheet index for the returned address (will be checked). + @param bTrackOverflow true = Update the internal overflow flags, if + the address is outside of the supported sheet limits. + @return A valid API cell address struct. */ + ::com::sun::star::table::CellAddress + createValidCellAddress( + const BinAddress& rBinAddress, + sal_Int16 nSheet, + bool bTrackOverflow ); + + // ------------------------------------------------------------------------ + + /** Checks the passed cell range if it fits into the spreadsheet limits. + + @param rRange The cell range address to be checked. + @param bAllowOverflow true = Allow ranges that start inside the + supported sheet limits but may end outside of these limits. + false = Do not allow ranges that overflow the supported limits. + @param bTrackOverflow true = Update the internal overflow flags, if + the passed range contains cells outside of the supported sheet + limits. + @return true = Cell range is valid. This function returns also true, + if only parts of the range are outside the current sheet limits and + such an overflow is allowed via parameter bAllowOverflow. Returns + false, if the entire range is outside the sheet limits, or if + overflow is not allowed via parameter bAllowOverflow. + */ + bool checkCellRange( + const ::com::sun::star::table::CellRangeAddress& rRange, + bool bAllowOverflow, bool bTrackOverflow ); + + /** Checks the passed cell range, may try to fit it to current sheet limits. + + First, this function reorders the column and row indexes so that the + starting indexes are less than or equal to the end indexes. Then, + depending on the parameter bAllowOverflow, the range is just checked or + cropped to the current sheet limits. + + @param orRange (in-out-parameter) Converts the passed cell range + into a valid cell range address. If the passed range contains cells + outside the currently supported spreadsheet limits, it will be + cropped to these limits. + @param bAllowOverflow true = Allow ranges that start inside the + supported sheet limits but may end outside of these limits. The + cell range returned in orRange will be cropped to these limits. + false = Do not allow ranges that overflow the supported limits. The + function will return false when the range overflows the sheet limits. + @param bTrackOverflow true = Update the internal overflow flags, if + the original range contains cells outside of the supported sheet + limits. + @return true = Converted range address is valid. This function + returns also true, if overflowing ranges are allowed via parameter + bAllowOverflow and the range has been cropped, but still contains + cells inside the current sheet limits. Returns false, if the entire + range is outside the sheet limits or overflowing ranges are not + allowed via parameter bAllowOverflow. + */ + bool validateCellRange( + ::com::sun::star::table::CellRangeAddress& orRange, + bool bAllowOverflow, bool bTrackOverflow ); + + /** Converts the passed string to a cell range address, without checking + any sheet limits. + + @param orRange (out-parameter) Returns the converted range address. + @param rString Cell range string in A1 notation. + @param nSheet Sheet index to be inserted into orRange. + @return true = Range address could be parsed from the passed string. + */ + bool convertToCellRangeUnchecked( + ::com::sun::star::table::CellRangeAddress& orRange, + const ::rtl::OUString& rString, + sal_Int16 nSheet ); + + /** Tries to convert the passed string to a cell range address. + + @param orRange (out-parameter) Returns the converted cell range + address. If the original range in the passed string contains cells + outside the currently supported spreadsheet limits, and parameter + bAllowOverflow is set to true, the range will be cropped to these + limits. Example: the range string "A1:ZZ100000" may be converted to + the range A1:IV65536. + @param rString Cell range string in A1 notation. + @param nSheet Sheet index to be inserted into orRange (will be checked). + @param bAllowOverflow true = Allow ranges that start inside the + supported sheet limits but may end outside of these limits. The + cell range returned in orRange will be cropped to these limits. + false = Do not allow ranges that overflow the supported limits. + @param bTrackOverflow true = Update the internal overflow flags, if + the original range contains cells outside of the supported sheet + limits. + @return true = Converted and returned range is valid. This function + returns also true, if overflowing ranges are allowed via parameter + bAllowOverflow and the range has been cropped, but still contains + cells inside the current sheet limits. Returns false, if the entire + range is outside the sheet limits or overflowing ranges are not + allowed via parameter bAllowOverflow. + */ + bool convertToCellRange( + ::com::sun::star::table::CellRangeAddress& orRange, + const ::rtl::OUString& rString, + sal_Int16 nSheet, + bool bAllowOverflow, bool bTrackOverflow ); + + /** Converts the passed range to a cell range address, without checking any + sheet limits. + + @param orRange (out-parameter) Returns the converted range address. + @param rBinRange Binary cell range struct. + @param nSheet Sheet index to be inserted into orRange. + */ + void convertToCellRangeUnchecked( + ::com::sun::star::table::CellRangeAddress& orRange, + const BinRange& rBinRange, + sal_Int16 nSheet ); + + /** Tries to convert the passed range to a cell range address. + + @param orRange (out-parameter) Returns the converted cell range + address. If the passed original range contains cells outside the + currently supported spreadsheet limits, and parameter bAllowOverflow + is set to true, the range will be cropped to these limits. + @param rBinRange Binary cell range struct. + @param nSheet Sheet index to be inserted into orRange (will be checked). + @param bAllowOverflow true = Allow ranges that start inside the + supported sheet limits but may end outside of these limits. The + cell range returned in orRange will be cropped to these limits. + false = Do not allow ranges that overflow the supported limits. + @param bTrackOverflow true = Update the internal overflow flags, if + the original range contains cells outside of the supported sheet + limits. + @return true = Converted and returned range is valid. This function + returns also true, if overflowing ranges are allowed via parameter + bAllowOverflow and the range has been cropped, but still contains + cells inside the current sheet limits. Returns false, if the entire + range is outside the sheet limits or if overflowing ranges are not + allowed via parameter bAllowOverflow. + */ + bool convertToCellRange( + ::com::sun::star::table::CellRangeAddress& orRange, + const BinRange& rBinRange, + sal_Int16 nSheet, + bool bAllowOverflow, bool bTrackOverflow ); + + // ------------------------------------------------------------------------ + + /** Checks the passed cell range list if it fits into the spreadsheet limits. + + @param rRanges The cell range list to be checked. + @param bAllowOverflow true = Allow ranges that start inside the + supported sheet limits but may end outside of these limits. + false = Do not allow ranges that overflow the supported limits. + @param bTrackOverflow true = Update the internal overflow flags, if + the passed range list contains cells outside of the supported sheet + limits. + @return true = All cell ranges are valid. This function returns also + true, if overflowing ranges are allowed via parameter bAllowOverflow + and only parts of the ranges are outside the current sheet limits. + Returns false, if one of the ranges is completely outside the sheet + limits or if overflowing ranges are not allowed via parameter + bAllowOverflow. + */ + bool checkCellRangeList( + const ApiCellRangeList& rRanges, + bool bAllowOverflow, bool bTrackOverflow ); + + /** Tries to restrict the passed cell range list to current sheet limits. + + @param orRanges (in-out-parameter) Restricts the cell range addresses + in the passed list to the current sheet limits and removes invalid + ranges from the list. + @param bTrackOverflow true = Update the internal overflow flags, if + the original ranges contain cells outside of the supported sheet + limits. + */ + void validateCellRangeList( + ApiCellRangeList& orRanges, + bool bTrackOverflow ); + + /** Tries to convert the passed string to a cell range list. + + @param orRanges (out-parameter) Returns the converted cell range + addresses. If a range in the passed string contains cells outside + the currently supported spreadsheet limits, it will be cropped to + these limits. Example: the range string "A1:ZZ100000" may be + converted to the range A1:IV65536. If a range is completely outside + the limits, it will be omitted. + @param rString Cell range list string in A1 notation, space separated. + @param nSheet Sheet index to be inserted into orRanges (will be checked). + @param bTrackOverflow true = Update the internal overflow flags, if + the original ranges contain cells outside of the supported sheet + limits. + */ + void convertToCellRangeList( + ApiCellRangeList& orRanges, + const ::rtl::OUString& rString, + sal_Int16 nSheet, + bool bTrackOverflow ); + + /** Tries to convert the passed range list to a cell range list. + + @param orRanges (out-parameter) Returns the converted cell range + addresses. If a range in the passed string contains cells outside + the currently supported spreadsheet limits, it will be cropped to + these limits. Example: the range string "A1:ZZ100000" may be + converted to the range A1:IV65536. If a range is completely outside + the limits, it will be omitted. + @param rBinRanges List of binary cell range objects. + @param nSheet Sheet index to be inserted into orRanges (will be checked). + @param bTrackOverflow true = Update the internal overflow flags, if + the original ranges contain cells outside of the supported sheet + limits. + */ + void convertToCellRangeList( + ApiCellRangeList& orRanges, + const BinRangeList& rBinRanges, + sal_Int16 nSheet, + bool bTrackOverflow ); + + // ------------------------------------------------------------------------ +private: + void initializeMaxPos( + sal_Int16 nMaxXlsTab, sal_Int32 nMaxXlsCol, sal_Int32 nMaxXlsRow ); + +private: + struct ControlCharacters + { + sal_Unicode mcThisWorkbook; /// Control character: Link to current workbook. + sal_Unicode mcExternal; /// Control character: Link to external workbook/sheet. + sal_Unicode mcThisSheet; /// Control character: Link to current sheet. + sal_Unicode mcInternal; /// Control character: Link to internal sheet. + sal_Unicode mcSameSheet; /// Control character: Link to same sheet (special '!A1' syntax). + + void set( + sal_Unicode cThisWorkbook, sal_Unicode cExternal, + sal_Unicode cThisSheet, sal_Unicode cInternal, + sal_Unicode cSameSheet ); + }; + + ::com::sun::star::table::CellAddress maMaxApiPos; /// Maximum valid cell address in Calc. + ::com::sun::star::table::CellAddress maMaxXlsPos; /// Maximum valid cell address in Excel. + ::com::sun::star::table::CellAddress maMaxPos; /// Maximum valid cell address in Calc/Excel. + ControlCharacters maLinkChars; /// Control characters for external link import (BIFF). + ControlCharacters maDConChars; /// Control characters for DCON* record import (BIFF). + bool mbColOverflow; /// Flag for "columns overflow". + bool mbRowOverflow; /// Flag for "rows overflow". + bool mbTabOverflow; /// Flag for "tables overflow". +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/autofiltercontext.hxx b/oox/inc/oox/xls/autofiltercontext.hxx new file mode 100644 index 000000000000..ccef6972e871 --- /dev/null +++ b/oox/inc/oox/xls/autofiltercontext.hxx @@ -0,0 +1,158 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_AUTOFILTERCONTEXT_HXX +#define OOX_XLS_AUTOFILTERCONTEXT_HXX + +#define USE_SC_MULTI_STRING_FILTER_PATCH 0 + +#include "oox/xls/excelhandlers.hxx" +#include <com/sun/star/table/CellRangeAddress.hpp> + +#if USE_SC_MULTI_STRING_FILTER_PATCH +#include <com/sun/star/sheet/TableFilterFieldBase.hpp> +#else +#include <com/sun/star/sheet/TableFilterField.hpp> +#endif + +#include <boost/shared_ptr.hpp> +#include <list> + +namespace com { namespace sun { namespace star { namespace sheet { +#if USE_SC_MULTI_STRING_FILTER_PATCH + struct TableFilterFieldBase; +#else + struct TableFilterField; +#endif + struct TableFilterFieldMultiString; +}}}} + +namespace oox { +namespace xls { + +// ============================================================================ + +struct FilterFieldItem +{ +#if USE_SC_MULTI_STRING_FILTER_PATCH + typedef ::boost::shared_ptr< ::com::sun::star::sheet::TableFilterFieldBase > TableFilterFieldRef; +#else + typedef ::boost::shared_ptr< ::com::sun::star::sheet::TableFilterField > TableFilterFieldRef; +#endif + + enum Type { NORMAL, MULTI_STRING }; + + TableFilterFieldRef mpField; + Type meType; + + FilterFieldItem(); + FilterFieldItem(Type eType); +}; + +// ============================================================================ + +class OoxAutoFilterContext : public OoxWorksheetContextBase +{ +public: + explicit OoxAutoFilterContext( OoxWorksheetFragmentBase& rFragment ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + +private: + /** Initializes data members to prepare for autofilter parsing. Call this + method when a new autofilter context starts. */ + void initialize(); + + /** Commits the imported autofilter data to Calc. */ + void setAutoFilter(); + + /** Check if the shown blank bit is on, if so, add show blank filter to the + list. */ + void maybeShowBlank(); + + /** Packs the collected filter names into a single regex string. */ + void setFilterNames(); + + void importAutoFilter( const AttributeList& rAttribs ); + + void importFilterColumn( const AttributeList& rAttribs ); + + void importTop10( const AttributeList& rAttribs ); + + /** Be sure to check for its 'and' attribute when there are two + customFilter's. If the attribute is not given, assume OR. */ + void importCustomFilters( const AttributeList& rAttribs ); + + /** Imports custumFilter element. Note that the standard specifies there + can be at most two custom filters specified, but no more than two. When + there are two custom filters, then their relationship (AND or OR) must + be specified by the parent element <customFilters>. */ + void importCustomFilter( const AttributeList& rAttribs ); + + void importFilters( const AttributeList& rAttribs ); + + void importFilter( const AttributeList& rAttribs ); + + void importDynamicFilter( const AttributeList& rAttribs ); + +private: + typedef ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > XCellRef; + + ::std::list< FilterFieldItem > maFields; + + ::std::list< ::rtl::OUString > maFilterNames; + ::com::sun::star::table::CellRangeAddress maAutoFilterRange; + sal_Int32 mnCurColID; + + /** If this is false (i.e. the given cell range address is not valid), then + don't do anything. */ + bool mbValidAddress:1; + + /** We use regex to compensate for Calc's lack of filtering by individual + names (i.e. <filter> tag). */ + bool mbUseRegex:1; + + /** The <filters> tag may have a 'blank' attribute when the blank values + need to be shown. This flag stores that information. */ + bool mbShowBlank:1; + + /** true if FilterConnection_AND, or false if FilterConnection_OR. This + flag is used to store the relationship of paired customFilter's. */ + bool mbConnectionAnd:1; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif diff --git a/oox/inc/oox/xls/biffcodec.hxx b/oox/inc/oox/xls/biffcodec.hxx new file mode 100644 index 000000000000..21b3e82006fd --- /dev/null +++ b/oox/inc/oox/xls/biffcodec.hxx @@ -0,0 +1,185 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_BIFFCODEC_HXX +#define OOX_XLS_BIFFCODEC_HXX + +#include <vector> +#include <comphelper/docpasswordhelper.hxx> +#include "oox/core/binarycodec.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +const sal_Int64 BIFF_RCF_BLOCKSIZE = 1024; + +// ============================================================================ + +/** Base class for BIFF stream decoders. */ +class BiffDecoderBase : public ::comphelper::IDocPasswordVerifier +{ +public: + explicit BiffDecoderBase(); + virtual ~BiffDecoderBase(); + + /** Derived classes return a clone of the decoder for usage in new streams. */ + inline BiffDecoderBase* clone() { return implClone(); } + + /** Implementation of the ::comphelper::IDocPasswordVerifier interface, + calls the new virtual function implVerify(). */ + virtual ::comphelper::DocPasswordVerifierResult + verifyPassword( const ::rtl::OUString& rPassword ); + + /** Returns true, if the decoder has been initialized correctly. */ + inline bool isValid() const { return mbValid; } + + /** Decodes nBytes bytes and writes encrypted data into the buffer pnDestData. */ + void decode( + sal_uInt8* pnDestData, + const sal_uInt8* pnSrcData, + sal_Int64 nStreamPos, + sal_uInt16 nBytes ); + +private: + /** Derived classes return a clone of the decoder for usage in new streams. */ + virtual BiffDecoderBase* implClone() = 0; + + /** Derived classes implement password verification and initialization of + the decoder. */ + virtual bool implVerify( const ::rtl::OUString& rPassword ) = 0; + + /** Implementation of decryption of a memory block. */ + virtual void implDecode( + sal_uInt8* pnDestData, + const sal_uInt8* pnSrcData, + sal_Int64 nStreamPos, + sal_uInt16 nBytes ) = 0; + +private: + bool mbValid; /// True = decoder is correctly initialized. +}; + +typedef ::boost::shared_ptr< BiffDecoderBase > BiffDecoderRef; + +// ============================================================================ + +/** Decodes BIFF stream contents that are encoded using the old XOR algorithm. */ +class BiffDecoder_XOR : public BiffDecoderBase +{ +public: + explicit BiffDecoder_XOR( sal_uInt16 nKey, sal_uInt16 nHash ); + +private: + /** Copy constructor for cloning. */ + BiffDecoder_XOR( const BiffDecoder_XOR& rDecoder ); + + /** Returns a clone of the decoder for usage in new streams. */ + virtual BiffDecoder_XOR* implClone(); + + /** Implements password verification and initialization of the decoder. */ + virtual bool implVerify( const ::rtl::OUString& rPassword ); + + /** Implementation of decryption of a memory block. */ + virtual void implDecode( + sal_uInt8* pnDestData, + const sal_uInt8* pnSrcData, + sal_Int64 nStreamPos, + sal_uInt16 nBytes ); + +private: + ::oox::core::BinaryCodec_XOR maCodec; /// Cipher algorithm implementation. + ::std::vector< sal_uInt8 > maPassword; + sal_uInt16 mnKey; + sal_uInt16 mnHash; +}; + +// ============================================================================ + +/** Decodes BIFF stream contents that are encoded using the RC4 algorithm. */ +class BiffDecoder_RCF : public BiffDecoderBase +{ +public: + explicit BiffDecoder_RCF( + sal_uInt8 pnSalt[ 16 ], + sal_uInt8 pnVerifier[ 16 ], + sal_uInt8 pnVerifierHash[ 16 ] ); + +private: + /** Copy constructor for cloning. */ + BiffDecoder_RCF( const BiffDecoder_RCF& rDecoder ); + + /** Returns a clone of the decoder for usage in new streams. */ + virtual BiffDecoder_RCF* implClone(); + + /** Implements password verification and initialization of the decoder. */ + virtual bool implVerify( const ::rtl::OUString& rPassword ); + + /** Implementation of decryption of a memory block. */ + virtual void implDecode( + sal_uInt8* pnDestData, + const sal_uInt8* pnSrcData, + sal_Int64 nStreamPos, + sal_uInt16 nBytes ); + +private: + ::oox::core::BinaryCodec_RCF maCodec; /// Cipher algorithm implementation. + ::std::vector< sal_uInt16 > maPassword; + ::std::vector< sal_uInt8 > maSalt; + ::std::vector< sal_uInt8 > maVerifier; + ::std::vector< sal_uInt8 > maVerifierHash; +}; + +// ============================================================================ + +/** Helper for BIFF stream codecs. Holds the used codec object. */ +class BiffCodecHelper : public WorkbookHelper +{ +public: + explicit BiffCodecHelper( const WorkbookHelper& rHelper ); + + /** Implementation helper, reads the FILEPASS and returns a decoder object. */ + static BiffDecoderRef implReadFilePass( BiffInputStream& rStrm, BiffType eBiff ); + + /** Imports the FILEPASS record, asks for a password and sets a decoder at the stream. */ + bool importFilePass( BiffInputStream& rStrm ); + /** Clones the contained decoder object if existing and sets it at the passed stream. */ + void cloneDecoder( BiffInputStream& rStrm ); + +private: + BiffDecoderRef mxDecoder; /// The decoder for import filter. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/biffdetector.hxx b/oox/inc/oox/xls/biffdetector.hxx new file mode 100644 index 000000000000..9ce5d19af3fe --- /dev/null +++ b/oox/inc/oox/xls/biffdetector.hxx @@ -0,0 +1,97 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_BIFFDETECTOR_HXX +#define OOX_XLS_BIFFDETECTOR_HXX + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/document/XExtendedFilterDetection.hpp> +#include <cppuhelper/implbase2.hxx> +#include "oox/helper/storagebase.hxx" +#include "oox/xls/biffhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace lang { class XMultiServiceFactory; } + namespace beans { struct PropertyValue; } +} } } + +namespace oox { class BinaryInputStream; } + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Detection service for BIFF streams or storages. */ +class BiffDetector : public ::cppu::WeakImplHelper2< + ::com::sun::star::lang::XServiceInfo, + ::com::sun::star::document::XExtendedFilterDetection > +{ +public: + explicit BiffDetector( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory ); + + virtual ~BiffDetector(); + + /** Detects the BIFF version of the passed stream. */ + static BiffType detectStreamBiffVersion( BinaryInputStream& rInStream ); + + /** Detects the BIFF version and workbook stream name of the passed storage. */ + static BiffType detectStorageBiffVersion( + ::rtl::OUString& orWorkbookStreamName, + StorageRef xStorage ); + + // com.sun.star.lang.XServiceInfo interface ------------------------------- + + virtual ::rtl::OUString SAL_CALL + getImplementationName() throw( ::com::sun::star::uno::RuntimeException ); + + virtual sal_Bool SAL_CALL + supportsService( const ::rtl::OUString& rService ) + throw( ::com::sun::star::uno::RuntimeException ); + + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL + getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.document.XExtendedFilterDetect interface ------------------ + + virtual ::rtl::OUString SAL_CALL + detect( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& orDescriptor ) + throw( ::com::sun::star::uno::RuntimeException ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > + mxFactory; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/biffhelper.hxx b/oox/inc/oox/xls/biffhelper.hxx new file mode 100644 index 000000000000..f425b983ada2 --- /dev/null +++ b/oox/inc/oox/xls/biffhelper.hxx @@ -0,0 +1,597 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_BIFFHELPER_HXX +#define OOX_XLS_BIFFHELPER_HXX + +#include "oox/helper/binarystreambase.hxx" + +namespace oox { +namespace xls { + +class BiffInputStream; + +// OOBIN record identifiers =================================================== + +const sal_Int32 OOBIN_ID_ARRAY = 0x01AA; +const sal_Int32 OOBIN_ID_AUTOFILTER = 0x00A1; +const sal_Int32 OOBIN_ID_AUTOSORTSCOPE = 0x01CB; +const sal_Int32 OOBIN_ID_BINARYINDEXBLOCK = 0x002A; +const sal_Int32 OOBIN_ID_BINARYINDEXROWS = 0x0028; +const sal_Int32 OOBIN_ID_BOOKVIEWS = 0x0087; +const sal_Int32 OOBIN_ID_BORDER = 0x002E; +const sal_Int32 OOBIN_ID_BORDERS = 0x0265; +const sal_Int32 OOBIN_ID_BRK = 0x018C; +const sal_Int32 OOBIN_ID_CALCPR = 0x009D; +const sal_Int32 OOBIN_ID_CELL_BLANK = 0x0001; +const sal_Int32 OOBIN_ID_CELL_BOOL = 0x0004; +const sal_Int32 OOBIN_ID_CELL_DOUBLE = 0x0005; +const sal_Int32 OOBIN_ID_CELL_ERROR = 0x0003; +const sal_Int32 OOBIN_ID_CELL_RK = 0x0002; +const sal_Int32 OOBIN_ID_CELL_RSTRING = 0x003E; +const sal_Int32 OOBIN_ID_CELL_SI = 0x0007; +const sal_Int32 OOBIN_ID_CELL_STRING = 0x0006; +const sal_Int32 OOBIN_ID_CELLSTYLE = 0x0030; +const sal_Int32 OOBIN_ID_CELLSTYLES = 0x026B; +const sal_Int32 OOBIN_ID_CELLSTYLEXFS = 0x0272; +const sal_Int32 OOBIN_ID_CELLXFS = 0x0269; +const sal_Int32 OOBIN_ID_CFCOLOR = 0x0234; +const sal_Int32 OOBIN_ID_CFRULE = 0x01CF; +const sal_Int32 OOBIN_ID_CHARTPAGESETUP = 0x028C; +const sal_Int32 OOBIN_ID_CHARTPROTECTION = 0x029D; +const sal_Int32 OOBIN_ID_CHARTSHEETPR = 0x028B; +const sal_Int32 OOBIN_ID_CHARTSHEETVIEW = 0x008D; +const sal_Int32 OOBIN_ID_CHARTSHEETVIEWS = 0x008B; +const sal_Int32 OOBIN_ID_COL = 0x003C; +const sal_Int32 OOBIN_ID_COLBREAKS = 0x018A; +const sal_Int32 OOBIN_ID_COLOR = 0x023C; +const sal_Int32 OOBIN_ID_COLORS = 0x01D9; +const sal_Int32 OOBIN_ID_COLORSCALE = 0x01D5; +const sal_Int32 OOBIN_ID_COLS = 0x0186; +const sal_Int32 OOBIN_ID_COMMENT = 0x027B; +const sal_Int32 OOBIN_ID_COMMENTAUTHOR = 0x0278; +const sal_Int32 OOBIN_ID_COMMENTAUTHORS = 0x0276; +const sal_Int32 OOBIN_ID_COMMENTLIST = 0x0279; +const sal_Int32 OOBIN_ID_COMMENTS = 0x0274; +const sal_Int32 OOBIN_ID_COMMENTTEXT = 0x027D; +const sal_Int32 OOBIN_ID_CONDFORMATTING = 0x01CD; +const sal_Int32 OOBIN_ID_CONTROL = 0x0284; +const sal_Int32 OOBIN_ID_CONTROLS = 0x0283; +const sal_Int32 OOBIN_ID_CUSTOMCHARTVIEW = 0x028F; +const sal_Int32 OOBIN_ID_CUSTOMCHARTVIEWS = 0x028D; +const sal_Int32 OOBIN_ID_CUSTOMSHEETVIEW = 0x01A7; +const sal_Int32 OOBIN_ID_CUSTOMSHEETVIEWS = 0x01A6; +const sal_Int32 OOBIN_ID_CUSTOMWORKBOOKVIEW = 0x018D; +const sal_Int32 OOBIN_ID_DATABAR = 0x01D3; +const sal_Int32 OOBIN_ID_DATATABLE = 0x01AC; +const sal_Int32 OOBIN_ID_DATAVALIDATION = 0x0040; +const sal_Int32 OOBIN_ID_DATAVALIDATIONS = 0x023D; +const sal_Int32 OOBIN_ID_DDEITEMVALUES = 0x0242; +const sal_Int32 OOBIN_ID_DDEITEM_BOOL = 0x0248; +const sal_Int32 OOBIN_ID_DDEITEM_DOUBLE = 0x0244; +const sal_Int32 OOBIN_ID_DDEITEM_ERROR = 0x0245; +const sal_Int32 OOBIN_ID_DDEITEM_STRING = 0x0246; +const sal_Int32 OOBIN_ID_DEFINEDNAME = 0x0027; +const sal_Int32 OOBIN_ID_DIMENSION = 0x0094; +const sal_Int32 OOBIN_ID_DRAWING = 0x0226; +const sal_Int32 OOBIN_ID_DXF = 0x01FB; +const sal_Int32 OOBIN_ID_DXFS = 0x01F9; +const sal_Int32 OOBIN_ID_EXTCELL_BLANK = 0x016F; +const sal_Int32 OOBIN_ID_EXTCELL_BOOL = 0x0171; +const sal_Int32 OOBIN_ID_EXTCELL_DOUBLE = 0x0170; +const sal_Int32 OOBIN_ID_EXTCELL_ERROR = 0x0172; +const sal_Int32 OOBIN_ID_EXTCELL_STRING = 0x0173; +const sal_Int32 OOBIN_ID_EXTERNALADDIN = 0x029B; +const sal_Int32 OOBIN_ID_EXTERNALBOOK = 0x0168; +const sal_Int32 OOBIN_ID_EXTERNALNAME = 0x0241; +const sal_Int32 OOBIN_ID_EXTERNALREF = 0x0163; +const sal_Int32 OOBIN_ID_EXTERNALREFS = 0x0161; +const sal_Int32 OOBIN_ID_EXTERNALSELF = 0x0165; +const sal_Int32 OOBIN_ID_EXTERNALSAME = 0x0166; +const sal_Int32 OOBIN_ID_EXTERNALSHEETS = 0x016A; +const sal_Int32 OOBIN_ID_EXTROW = 0x016E; +const sal_Int32 OOBIN_ID_EXTSHEETDATA = 0x016B; +const sal_Int32 OOBIN_ID_EXTERNALNAMEFLAGS = 0x024A; +const sal_Int32 OOBIN_ID_EXTSHEETNAMES = 0x0167; +const sal_Int32 OOBIN_ID_FILESHARING = 0x0224; +const sal_Int32 OOBIN_ID_FILEVERSION = 0x0080; +const sal_Int32 OOBIN_ID_FILL = 0x002D; +const sal_Int32 OOBIN_ID_FILLS = 0x025B; +const sal_Int32 OOBIN_ID_FILTERCOLUMN = 0x00A3; +const sal_Int32 OOBIN_ID_FONT = 0x002B; +const sal_Int32 OOBIN_ID_FONTS = 0x0263; +const sal_Int32 OOBIN_ID_FORMULA_STRING = 0x0008; +const sal_Int32 OOBIN_ID_FORMULA_DOUBLE = 0x0009; +const sal_Int32 OOBIN_ID_FORMULA_BOOL = 0x000A; +const sal_Int32 OOBIN_ID_FORMULA_ERROR = 0x000B; +const sal_Int32 OOBIN_ID_FUNCTIONGROUP = 0x0299; +const sal_Int32 OOBIN_ID_FUNCTIONGROUPS = 0x0298; +const sal_Int32 OOBIN_ID_HEADERFOOTER = 0x01DF; +const sal_Int32 OOBIN_ID_HYPERLINK = 0x01EE; +const sal_Int32 OOBIN_ID_ICONSET = 0x01D1; +const sal_Int32 OOBIN_ID_INDEXEDCOLORS = 0x0235; +const sal_Int32 OOBIN_ID_INPUTCELLS = 0x01F8; +const sal_Int32 OOBIN_ID_LEGACYDRAWING = 0x0227; +const sal_Int32 OOBIN_ID_MERGECELL = 0x00B0; +const sal_Int32 OOBIN_ID_MERGECELLS = 0x00B1; +const sal_Int32 OOBIN_ID_MRUCOLORS = 0x0239; +const sal_Int32 OOBIN_ID_MULTCELL_BLANK = 0x000C; +const sal_Int32 OOBIN_ID_MULTCELL_BOOL = 0x000F; +const sal_Int32 OOBIN_ID_MULTCELL_DOUBLE = 0x0010; +const sal_Int32 OOBIN_ID_MULTCELL_ERROR = 0x000E; +const sal_Int32 OOBIN_ID_MULTCELL_RK = 0x000D; +const sal_Int32 OOBIN_ID_MULTCELL_RSTRING = 0x003D; +const sal_Int32 OOBIN_ID_MULTCELL_SI = 0x0012; +const sal_Int32 OOBIN_ID_MULTCELL_STRING = 0x0011; +const sal_Int32 OOBIN_ID_NUMFMT = 0x002C; +const sal_Int32 OOBIN_ID_NUMFMTS = 0x0267; +const sal_Int32 OOBIN_ID_OLEOBJECT = 0x027F; +const sal_Int32 OOBIN_ID_OLEOBJECTS = 0x027E; +const sal_Int32 OOBIN_ID_PAGEMARGINS = 0x01DC; +const sal_Int32 OOBIN_ID_PAGESETUP = 0x01DE; +const sal_Int32 OOBIN_ID_PANE = 0x0097; +const sal_Int32 OOBIN_ID_PCDEFINITION = 0x00B3; +const sal_Int32 OOBIN_ID_PCDFDISCRETEPR = 0x00E1; +const sal_Int32 OOBIN_ID_PCDFGROUPITEMS = 0x00DD; +const sal_Int32 OOBIN_ID_PCDFIELD = 0x00B7; +const sal_Int32 OOBIN_ID_PCDFIELDGROUP = 0x00DB; +const sal_Int32 OOBIN_ID_PCDFIELDS = 0x00B5; +const sal_Int32 OOBIN_ID_PCDFRANGEPR = 0x00DF; +const sal_Int32 OOBIN_ID_PCDFSHAREDITEMS = 0x00BD; +const sal_Int32 OOBIN_ID_PCDSHEETSOURCE = 0x00BB; +const sal_Int32 OOBIN_ID_PCDSOURCE = 0x00B9; +const sal_Int32 OOBIN_ID_PCITEM_ARRAY = 0x00BF; +const sal_Int32 OOBIN_ID_PCITEM_BOOL = 0x0016; +const sal_Int32 OOBIN_ID_PCITEM_DATE = 0x0019; +const sal_Int32 OOBIN_ID_PCITEM_DOUBLE = 0x0015; +const sal_Int32 OOBIN_ID_PCITEM_ERROR = 0x0017; +const sal_Int32 OOBIN_ID_PCITEM_INDEX = 0x001A; +const sal_Int32 OOBIN_ID_PCITEM_MISSING = 0x0014; +const sal_Int32 OOBIN_ID_PCITEM_STRING = 0x0018; +const sal_Int32 OOBIN_ID_PCITEMA_BOOL = 0x001D; +const sal_Int32 OOBIN_ID_PCITEMA_DATE = 0x0020; +const sal_Int32 OOBIN_ID_PCITEMA_DOUBLE = 0x001C; +const sal_Int32 OOBIN_ID_PCITEMA_ERROR = 0x001E; +const sal_Int32 OOBIN_ID_PCITEMA_MISSING = 0x001B; +const sal_Int32 OOBIN_ID_PCITEMA_STRING = 0x001F; +const sal_Int32 OOBIN_ID_PCRECORD = 0x0021; +const sal_Int32 OOBIN_ID_PCRECORDDT = 0x0022; +const sal_Int32 OOBIN_ID_PCRECORDS = 0x00C1; +const sal_Int32 OOBIN_ID_PHONETICPR = 0x0219; +const sal_Int32 OOBIN_ID_PICTURE = 0x0232; +const sal_Int32 OOBIN_ID_PIVOTAREA = 0x00F7; +const sal_Int32 OOBIN_ID_PIVOTCACHE = 0x0182; +const sal_Int32 OOBIN_ID_PIVOTCACHES = 0x0180; +const sal_Int32 OOBIN_ID_PRINTOPTIONS = 0x01DD; +const sal_Int32 OOBIN_ID_PTCOLFIELDS = 0x0137; +const sal_Int32 OOBIN_ID_PTDATAFIELD = 0x0125; +const sal_Int32 OOBIN_ID_PTDATAFIELDS = 0x0127; +const sal_Int32 OOBIN_ID_PTDEFINITION = 0x0118; +const sal_Int32 OOBIN_ID_PTFIELD = 0x011D; +const sal_Int32 OOBIN_ID_PTFIELDS = 0x011F; +const sal_Int32 OOBIN_ID_PTFILTER = 0x0259; +const sal_Int32 OOBIN_ID_PTFILTERS = 0x0257; +const sal_Int32 OOBIN_ID_PTFITEM = 0x011A; +const sal_Int32 OOBIN_ID_PTFITEMS = 0x011B; +const sal_Int32 OOBIN_ID_PTLOCATION = 0x013A; +const sal_Int32 OOBIN_ID_PTPAGEFIELD = 0x0121; +const sal_Int32 OOBIN_ID_PTPAGEFIELDS = 0x0123; +const sal_Int32 OOBIN_ID_PTREFERENCE = 0x00FB; +const sal_Int32 OOBIN_ID_PTREFERENCEITEM = 0x017E; +const sal_Int32 OOBIN_ID_PTREFERENCES = 0x00F9; +const sal_Int32 OOBIN_ID_PTROWFIELDS = 0x0135; +const sal_Int32 OOBIN_ID_RGBCOLOR = 0x01DB; +const sal_Int32 OOBIN_ID_ROW = 0x0000; +const sal_Int32 OOBIN_ID_ROWBREAKS = 0x0188; +const sal_Int32 OOBIN_ID_SCENARIO = 0x01F6; +const sal_Int32 OOBIN_ID_SCENARIOS = 0x01F4; +const sal_Int32 OOBIN_ID_SELECTION = 0x0098; +const sal_Int32 OOBIN_ID_SHAREDFMLA = 0x01AB; +const sal_Int32 OOBIN_ID_SHEET = 0x009C; +const sal_Int32 OOBIN_ID_SHEETDATA = 0x0091; +const sal_Int32 OOBIN_ID_SHEETFORMATPR = 0x01E5; +const sal_Int32 OOBIN_ID_SHEETPR = 0x0093; +const sal_Int32 OOBIN_ID_SHEETPROTECTION = 0x0217; +const sal_Int32 OOBIN_ID_SHEETS = 0x008F; +const sal_Int32 OOBIN_ID_SHEETVIEW = 0x0089; +const sal_Int32 OOBIN_ID_SHEETVIEWS = 0x0085; +const sal_Int32 OOBIN_ID_SI = 0x0013; +const sal_Int32 OOBIN_ID_SST = 0x009F; +const sal_Int32 OOBIN_ID_STYLESHEET = 0x0116; +const sal_Int32 OOBIN_ID_TABLE = 0x0157; +const sal_Int32 OOBIN_ID_TABLEPART = 0x0295; +const sal_Int32 OOBIN_ID_TABLEPARTS = 0x0294; +const sal_Int32 OOBIN_ID_TABLESTYLEINFO = 0x0201; +const sal_Int32 OOBIN_ID_TABLESTYLES = 0x01FC; +const sal_Int32 OOBIN_ID_TOP10FILTER = 0x00AA; +const sal_Int32 OOBIN_ID_VOLTYPE = 0x0204; +const sal_Int32 OOBIN_ID_VOLTYPEMAIN = 0x0206; +const sal_Int32 OOBIN_ID_VOLTYPES = 0x0202; +const sal_Int32 OOBIN_ID_VOLTYPESTP = 0x020A; +const sal_Int32 OOBIN_ID_VOLTYPETR = 0x020B; +const sal_Int32 OOBIN_ID_WORKBOOK = 0x0083; +const sal_Int32 OOBIN_ID_WORKBOOKPR = 0x0099; +const sal_Int32 OOBIN_ID_WORKBOOKVIEW = 0x009E; +const sal_Int32 OOBIN_ID_WORKSHEET = 0x0081; +const sal_Int32 OOBIN_ID_XF = 0x002F; + +// ============================================================================ + +/** An enumeration for all binary Excel file format types (BIFF types). */ +enum BiffType +{ + BIFF2 = 0, /// MS Excel 2.1. + BIFF3, /// MS Excel 3.0. + BIFF4, /// MS Excel 4.0. + BIFF5, /// MS Excel 5.0, MS Excel 7.0 (95). + BIFF8, /// MS Excel 8.0 (97), 9.0 (2000), 10.0 (XP), 11.0 (2003). + BIFF_UNKNOWN /// Unknown BIFF version. +}; + +const sal_uInt16 BIFF2_MAXRECSIZE = 2080; +const sal_uInt16 BIFF8_MAXRECSIZE = 8224; + +// record identifiers --------------------------------------------------------- + +const sal_uInt16 BIFF2_ID_ARRAY = 0x0021; +const sal_uInt16 BIFF3_ID_ARRAY = 0x0221; +const sal_uInt16 BIFF2_ID_BLANK = 0x0001; +const sal_uInt16 BIFF3_ID_BLANK = 0x0201; +const sal_uInt16 BIFF2_ID_BOF = 0x0009; +const sal_uInt16 BIFF3_ID_BOF = 0x0209; +const sal_uInt16 BIFF4_ID_BOF = 0x0409; +const sal_uInt16 BIFF5_ID_BOF = 0x0809; +const sal_uInt16 BIFF_ID_BOOKBOOL = 0x00DA; +const sal_uInt16 BIFF_ID_BOOKEXT = 0x0863; +const sal_uInt16 BIFF2_ID_BOOLERR = 0x0005; +const sal_uInt16 BIFF3_ID_BOOLERR = 0x0205; +const sal_uInt16 BIFF_ID_BOTTOMMARGIN = 0x0029; +const sal_uInt16 BIFF_ID_CALCCOUNT = 0x000C; +const sal_uInt16 BIFF_ID_CALCMODE = 0x000D; +const sal_uInt16 BIFF_ID_CFHEADER = 0x01B0; +const sal_uInt16 BIFF_ID_CFRULE = 0x01B1; +const sal_uInt16 BIFF_ID_CFRULE12 = 0x087A; +const sal_uInt16 BIFF_ID_CFRULEEXT = 0x087B; +const sal_uInt16 BIFF_ID_CH3DDATAFORMAT = 0x105F; +const sal_uInt16 BIFF_ID_CHAREA = 0x101A; +const sal_uInt16 BIFF_ID_CHAREAFORMAT = 0x100A; +const sal_uInt16 BIFF_ID_CHATTACHEDLABEL = 0x100C; +const sal_uInt16 BIFF_ID_CHAXESSET = 0x1041; +const sal_uInt16 BIFF_ID_CHAXIS = 0x101D; +const sal_uInt16 BIFF_ID_CHAXISLINE = 0x1021; +const sal_uInt16 BIFF_ID_CHBAR = 0x1017; +const sal_uInt16 BIFF_ID_CHBEGIN = 0x1033; +const sal_uInt16 BIFF_ID_CHCHART = 0x1002; +const sal_uInt16 BIFF_ID_CHCHART3D = 0x103A; +const sal_uInt16 BIFF_ID_CHCHARTLINE = 0x101C; +const sal_uInt16 BIFF_ID_CHDATAFORMAT = 0x1006; +const sal_uInt16 BIFF_ID_CHDEFAULTTEXT = 0x1024; +const sal_uInt16 BIFF_ID_CHDROPBAR = 0x103D; +const sal_uInt16 BIFF_ID_CHECKCOMPAT = 0x088C; +const sal_uInt16 BIFF_ID_CHEND = 0x1034; +const sal_uInt16 BIFF_ID_CHESCHERFORMAT = 0x1066; +const sal_uInt16 BIFF_ID_CHFONT = 0x1026; +const sal_uInt16 BIFF_ID_CHFORMAT = 0x104E; +const sal_uInt16 BIFF_ID_CHFORMATRUNS = 0x1050; +const sal_uInt16 BIFF_ID_CHFRAME = 0x1032; +const sal_uInt16 BIFF_ID_CHFRAMEPOS = 0x104F; +const sal_uInt16 BIFF_ID_CHFRBLOCKBEGIN = 0x0852; +const sal_uInt16 BIFF_ID_CHFRBLOCKEND = 0x0853; +const sal_uInt16 BIFF_ID_CHFRINFO = 0x0850; +const sal_uInt16 BIFF_ID_CHFRLABELPROPS = 0x086B; +const sal_uInt16 BIFF_ID_CHFRUNITPROPS = 0x0857; +const sal_uInt16 BIFF_ID_CHFRWRAPPER = 0x0851; +const sal_uInt16 BIFF_ID_CHLABELRANGE = 0x1020; +const sal_uInt16 BIFF_ID_CHLABELRANGE2 = 0x1062; +const sal_uInt16 BIFF_ID_CHLEGEND = 0x1015; +const sal_uInt16 BIFF_ID_CHLINE = 0x1018; +const sal_uInt16 BIFF_ID_CHLINEFORMAT = 0x1007; +const sal_uInt16 BIFF_ID_CHMARKERFORMAT = 0x1009; +const sal_uInt16 BIFF_ID_CHOBJECTLINK = 0x1027; +const sal_uInt16 BIFF_ID_CHPICFORMAT = 0x103C; +const sal_uInt16 BIFF_ID_CHPIE = 0x1019; +const sal_uInt16 BIFF_ID_CHPIEEXT = 0x1061; +const sal_uInt16 BIFF_ID_CHPIEFORMAT = 0x100B; +const sal_uInt16 BIFF_ID_CHPIVOTFLAGS = 0x0859; +const sal_uInt16 BIFF5_ID_CHPIVOTREF = 0x1048; +const sal_uInt16 BIFF8_ID_CHPIVOTREF = 0x0858; +const sal_uInt16 BIFF_ID_CHPLOTFRAME = 0x1035; +const sal_uInt16 BIFF_ID_CHPLOTGROWTH = 0x1064; +const sal_uInt16 BIFF_ID_CHPROPERTIES = 0x1044; +const sal_uInt16 BIFF_ID_CHRADARLINE = 0x103E; +const sal_uInt16 BIFF_ID_CHRADARAREA = 0x1040; +const sal_uInt16 BIFF_ID_CHSCATTER = 0x101B; +const sal_uInt16 BIFF_ID_CHSERERRORBAR = 0x105B; +const sal_uInt16 BIFF_ID_CHSERGROUP = 0x1045; +const sal_uInt16 BIFF_ID_CHSERIES = 0x1003; +const sal_uInt16 BIFF_ID_CHSERIESFORMAT = 0x105D; +const sal_uInt16 BIFF_ID_CHSERPARENT = 0x104A; +const sal_uInt16 BIFF_ID_CHSERTRENDLINE = 0x104B; +const sal_uInt16 BIFF_ID_CHSOURCELINK = 0x1051; +const sal_uInt16 BIFF_ID_CHSTRING = 0x100D; +const sal_uInt16 BIFF_ID_CHSURFACE = 0x103F; +const sal_uInt16 BIFF_ID_CHTEXT = 0x1025; +const sal_uInt16 BIFF_ID_CHTICK = 0x101E; +const sal_uInt16 BIFF_ID_CHTYPEGROUP = 0x1014; +const sal_uInt16 BIFF_ID_CHVALUERANGE = 0x101F; +const sal_uInt16 BIFF_ID_CODENAME = 0x01BA; +const sal_uInt16 BIFF_ID_CODEPAGE = 0x0042; +const sal_uInt16 BIFF_ID_COLINFO = 0x007D; +const sal_uInt16 BIFF_ID_COLUMNDEFAULT = 0x0020; +const sal_uInt16 BIFF_ID_COLWIDTH = 0x0024; +const sal_uInt16 BIFF_ID_COMPRESSPICS = 0x089B; +const sal_uInt16 BIFF_ID_CONT = 0x003C; +const sal_uInt16 BIFF_ID_COORDLIST = 0x00A9; +const sal_uInt16 BIFF_ID_COUNTRY = 0x008C; +const sal_uInt16 BIFF_ID_CRN = 0x005A; +const sal_uInt16 BIFF2_ID_DATATABLE = 0x0036; +const sal_uInt16 BIFF3_ID_DATATABLE = 0x0236; +const sal_uInt16 BIFF2_ID_DATATABLE2 = 0x0037; +const sal_uInt16 BIFF_ID_DATAVALIDATION = 0x01BE; +const sal_uInt16 BIFF_ID_DATAVALIDATIONS = 0x01B2; +const sal_uInt16 BIFF_ID_DATEMODE = 0x0022; +const sal_uInt16 BIFF_ID_DBCELL = 0x00D7; +const sal_uInt16 BIFF_ID_DCONBINAME = 0x01B5; +const sal_uInt16 BIFF_ID_DCONNAME = 0x0052; +const sal_uInt16 BIFF_ID_DCONREF = 0x0051; +const sal_uInt16 BIFF_ID_DEFCOLWIDTH = 0x0055; +const sal_uInt16 BIFF2_ID_DEFINEDNAME = 0x0018; +const sal_uInt16 BIFF3_ID_DEFINEDNAME = 0x0218; +const sal_uInt16 BIFF5_ID_DEFINEDNAME = 0x0018; +const sal_uInt16 BIFF2_ID_DEFROWHEIGHT = 0x0025; +const sal_uInt16 BIFF3_ID_DEFROWHEIGHT = 0x0225; +const sal_uInt16 BIFF_ID_DELTA = 0x0010; +const sal_uInt16 BIFF2_ID_DIMENSION = 0x0000; +const sal_uInt16 BIFF3_ID_DIMENSION = 0x0200; +const sal_uInt16 BIFF_ID_DXF = 0x088D; +const sal_uInt16 BIFF_ID_EOF = 0x000A; +const sal_uInt16 BIFF_ID_EXTERNALBOOK = 0x01AE; +const sal_uInt16 BIFF2_ID_EXTERNALNAME = 0x0023; +const sal_uInt16 BIFF3_ID_EXTERNALNAME = 0x0223; +const sal_uInt16 BIFF5_ID_EXTERNALNAME = 0x0023; +const sal_uInt16 BIFF_ID_EXTERNSHEET = 0x0017; +const sal_uInt16 BIFF_ID_EXTSST = 0x00FF; +const sal_uInt16 BIFF_ID_FILEPASS = 0x002F; +const sal_uInt16 BIFF_ID_FILESHARING = 0x005B; +const sal_uInt16 BIFF2_ID_FONT = 0x0031; +const sal_uInt16 BIFF3_ID_FONT = 0x0231; +const sal_uInt16 BIFF5_ID_FONT = 0x0031; +const sal_uInt16 BIFF_ID_FONTCOLOR = 0x0045; +const sal_uInt16 BIFF_ID_FOOTER = 0x0015; +const sal_uInt16 BIFF_ID_FORCEFULLCALC = 0x08A3; +const sal_uInt16 BIFF2_ID_FORMAT = 0x001E; +const sal_uInt16 BIFF4_ID_FORMAT = 0x041E; +const sal_uInt16 BIFF2_ID_FORMULA = 0x0006; +const sal_uInt16 BIFF3_ID_FORMULA = 0x0206; +const sal_uInt16 BIFF4_ID_FORMULA = 0x0406; +const sal_uInt16 BIFF5_ID_FORMULA = 0x0006; +const sal_uInt16 BIFF_ID_GUTS = 0x0080; +const sal_uInt16 BIFF_ID_HCENTER = 0x0083; +const sal_uInt16 BIFF_ID_HEADER = 0x0014; +const sal_uInt16 BIFF_ID_HEADERFOOTER = 0x089C; +const sal_uInt16 BIFF_ID_HIDEOBJ = 0x008D; +const sal_uInt16 BIFF_ID_HORPAGEBREAKS = 0x001B; +const sal_uInt16 BIFF_ID_HYPERLINK = 0x01B8; +const sal_uInt16 BIFF3_ID_IMGDATA = 0x007F; +const sal_uInt16 BIFF8_ID_IMGDATA = 0x00E9; +const sal_uInt16 BIFF2_ID_INDEX = 0x000B; +const sal_uInt16 BIFF3_ID_INDEX = 0x020B; +const sal_uInt16 BIFF2_ID_INTEGER = 0x0002; +const sal_uInt16 BIFF_ID_INTERFACEHDR = 0x00E1; +const sal_uInt16 BIFF_ID_ITERATION = 0x0011; +const sal_uInt16 BIFF_ID_IXFE = 0x0044; +const sal_uInt16 BIFF2_ID_LABEL = 0x0004; +const sal_uInt16 BIFF3_ID_LABEL = 0x0204; +const sal_uInt16 BIFF_ID_LABELRANGES = 0x015F; +const sal_uInt16 BIFF_ID_LABELSST = 0x00FD; +const sal_uInt16 BIFF_ID_LEFTMARGIN = 0x0026; +const sal_uInt16 BIFF_ID_MERGEDCELLS = 0x00E5; +const sal_uInt16 BIFF_ID_MSODRAWING = 0x00EC; +const sal_uInt16 BIFF_ID_MSODRAWINGGROUP = 0x00EB; +const sal_uInt16 BIFF_ID_MSODRAWINGSEL = 0x00ED; +const sal_uInt16 BIFF_ID_MTHREADSETTINGS = 0x089A; +const sal_uInt16 BIFF_ID_MULTBLANK = 0x00BE; +const sal_uInt16 BIFF_ID_MULTRK = 0x00BD; +const sal_uInt16 BIFF_ID_NOTE = 0x001C; +const sal_uInt16 BIFF2_ID_NUMBER = 0x0003; +const sal_uInt16 BIFF3_ID_NUMBER = 0x0203; +const sal_uInt16 BIFF_ID_OBJ = 0x005D; +const sal_uInt16 BIFF_ID_OBJECTPROTECT = 0x0063; +const sal_uInt16 BIFF_ID_PAGELAYOUTVIEW = 0x088B; +const sal_uInt16 BIFF_ID_PAGESETUP = 0x00A1; +const sal_uInt16 BIFF_ID_PALETTE = 0x0092; +const sal_uInt16 BIFF_ID_PANE = 0x0041; +const sal_uInt16 BIFF_ID_PASSWORD = 0x0013; +const sal_uInt16 BIFF_ID_PCDEFINITION = 0x00C6; +const sal_uInt16 BIFF_ID_PCDEFINITION2 = 0x0122; +const sal_uInt16 BIFF_ID_PCDFDISCRETEPR = 0x00D9; +const sal_uInt16 BIFF_ID_PCDFIELD = 0x00C7; +const sal_uInt16 BIFF_ID_PCDFIELDINDEX = 0x0103; +const sal_uInt16 BIFF_ID_PCDFORMULAFIELD = 0x00F9; +const sal_uInt16 BIFF_ID_PCDFRANGEPR = 0x00D8; +const sal_uInt16 BIFF_ID_PCDFSQLTYPE = 0x01BB; +const sal_uInt16 BIFF_ID_PCDSOURCE = 0x00E3; +const sal_uInt16 BIFF_ID_PCITEM_BOOL = 0x00CA; +const sal_uInt16 BIFF_ID_PCITEM_DATE = 0x00CE; +const sal_uInt16 BIFF_ID_PCITEM_DOUBLE = 0x00C9; +const sal_uInt16 BIFF_ID_PCITEM_ERROR = 0x00CB; +const sal_uInt16 BIFF_ID_PCITEM_INDEXLIST = 0x00C8; +const sal_uInt16 BIFF_ID_PCITEM_INTEGER = 0x00CC; +const sal_uInt16 BIFF_ID_PCITEM_MISSING = 0x00CF; +const sal_uInt16 BIFF_ID_PCITEM_STRING = 0x00CD; +const sal_uInt16 BIFF_ID_PHONETICPR = 0x00EF; +const sal_uInt16 BIFF_ID_PICTURE = 0x00E9; +const sal_uInt16 BIFF_ID_PIVOTCACHE = 0x00D5; +const sal_uInt16 BIFF_ID_PRECISION = 0x000E; +const sal_uInt16 BIFF_ID_PRINTGRIDLINES = 0x002B; +const sal_uInt16 BIFF_ID_PRINTHEADERS = 0x002A; +const sal_uInt16 BIFF_ID_PROJEXTSHEET = 0x00A3; +const sal_uInt16 BIFF_ID_PROTECT = 0x0012; +const sal_uInt16 BIFF_ID_PTDATAFIELD = 0x00C5; +const sal_uInt16 BIFF_ID_PTDEFINITION = 0x00B0; +const sal_uInt16 BIFF_ID_PTDEFINITION2 = 0x00F1; +const sal_uInt16 BIFF_ID_PTFIELD = 0x00B1; +const sal_uInt16 BIFF_ID_PTFIELD2 = 0x0100; +const sal_uInt16 BIFF_ID_PTFITEM = 0x00B2; +const sal_uInt16 BIFF_ID_PTPAGEFIELDS = 0x00B6; +const sal_uInt16 BIFF_ID_PTROWCOLFIELDS = 0x00B4; +const sal_uInt16 BIFF_ID_PTROWCOLITEMS = 0x00B5; +const sal_uInt16 BIFF_ID_RECALCID = 0x01C1; +const sal_uInt16 BIFF_ID_REFMODE = 0x000F; +const sal_uInt16 BIFF_ID_RIGHTMARGIN = 0x0027; +const sal_uInt16 BIFF_ID_RK = 0x027E; +const sal_uInt16 BIFF2_ID_ROW = 0x0008; +const sal_uInt16 BIFF3_ID_ROW = 0x0208; +const sal_uInt16 BIFF_ID_RSTRING = 0x00D6; +const sal_uInt16 BIFF_ID_SAVERECALC = 0x005F; +const sal_uInt16 BIFF_ID_SCENARIO = 0x00AF; +const sal_uInt16 BIFF_ID_SCENARIOS = 0x00AE; +const sal_uInt16 BIFF_ID_SCL = 0x00A0; +const sal_uInt16 BIFF_ID_SCENPROTECT = 0x00DD; +const sal_uInt16 BIFF_ID_SCREENTIP = 0x0800; +const sal_uInt16 BIFF_ID_SELECTION = 0x001D; +const sal_uInt16 BIFF_ID_SHAREDFEATHEAD = 0x0867; +const sal_uInt16 BIFF_ID_SHAREDFMLA = 0x04BC; +const sal_uInt16 BIFF_ID_SHEET = 0x0085; +const sal_uInt16 BIFF_ID_SHEETEXT = 0x0862; +const sal_uInt16 BIFF_ID_SHEETHEADER = 0x008F; +const sal_uInt16 BIFF_ID_SHEETPR = 0x0081; +const sal_uInt16 BIFF_ID_SST = 0x00FC; +const sal_uInt16 BIFF_ID_STANDARDWIDTH = 0x0099; +const sal_uInt16 BIFF2_ID_STRING = 0x0007; +const sal_uInt16 BIFF3_ID_STRING = 0x0207; +const sal_uInt16 BIFF_ID_STYLE = 0x0293; +const sal_uInt16 BIFF_ID_STYLEEXT = 0x0892; +const sal_uInt16 BIFF_ID_SXEXT = 0x00DC; +const sal_uInt16 BIFF_ID_TABLESTYLES = 0x088E; +const sal_uInt16 BIFF_ID_THEME = 0x0896; +const sal_uInt16 BIFF_ID_TOPMARGIN = 0x0028; +const sal_uInt16 BIFF_ID_TXO = 0x01B6; +const sal_uInt16 BIFF_ID_UNCALCED = 0x005E; +const sal_uInt16 BIFF_ID_USESELFS = 0x0160; +const sal_uInt16 BIFF_ID_VCENTER = 0x0084; +const sal_uInt16 BIFF_ID_VERPAGEBREAKS = 0x001A; +const sal_uInt16 BIFF_ID_WINDOW1 = 0x003D; +const sal_uInt16 BIFF2_ID_WINDOW2 = 0x003E; +const sal_uInt16 BIFF3_ID_WINDOW2 = 0x023E; +const sal_uInt16 BIFF_ID_WRITEACCESS = 0x005C; +const sal_uInt16 BIFF_ID_XCT = 0x0059; +const sal_uInt16 BIFF2_ID_XF = 0x0043; +const sal_uInt16 BIFF3_ID_XF = 0x0243; +const sal_uInt16 BIFF4_ID_XF = 0x0443; +const sal_uInt16 BIFF5_ID_XF = 0x00E0; +const sal_uInt16 BIFF_ID_XFCRC = 0x087C; +const sal_uInt16 BIFF_ID_XFEXT = 0x087D; + +const sal_uInt16 BIFF_ID_UNKNOWN = SAL_MAX_UINT16; + +const sal_uInt16 BIFF_ID_OBJEND = 0x0000; /// End of OBJ. +const sal_uInt16 BIFF_ID_OBJMACRO = 0x0004; /// Macro link. +const sal_uInt16 BIFF_ID_OBJBUTTON = 0x0005; /// Button data. +const sal_uInt16 BIFF_ID_OBJGMO = 0x0006; /// Group marker. +const sal_uInt16 BIFF_ID_OBJCF = 0x0007; /// Clipboard format. +const sal_uInt16 BIFF_ID_OBJFLAGS = 0x0008; /// Option flags. +const sal_uInt16 BIFF_ID_OBJPICTFMLA = 0x0009; /// OLE link formula. +const sal_uInt16 BIFF_ID_OBJCBLS = 0x000A; /// Check box/radio button data. +const sal_uInt16 BIFF_ID_OBJRBO = 0x000B; /// Radio button group data. +const sal_uInt16 BIFF_ID_OBJSBS = 0x000C; /// Scroll bar data. +const sal_uInt16 BIFF_ID_OBJNTS = 0x000C; /// Note data. +const sal_uInt16 BIFF_ID_OBJSBSFMLA = 0x000E; /// Scroll bar/list box/combo box cell link. +const sal_uInt16 BIFF_ID_OBJGBODATA = 0x000F; /// Group box data. +const sal_uInt16 BIFF_ID_OBJEDODATA = 0x0010; /// Edit box data. +const sal_uInt16 BIFF_ID_OBJRBODATA = 0x0011; /// Radio button group data. +const sal_uInt16 BIFF_ID_OBJCBLSDATA = 0x0012; /// Check box/radio button data. +const sal_uInt16 BIFF_ID_OBJLBSDATA = 0x0013; /// List box/combo box data. +const sal_uInt16 BIFF_ID_OBJCBLSFMLA = 0x0014; /// Check box/radio button cell link. +const sal_uInt16 BIFF_ID_OBJCMO = 0x0015; /// Common object settings. + +// record constants ----------------------------------------------------------- + +const sal_uInt16 BIFF_BOF_BIFF2 = 0x0200; +const sal_uInt16 BIFF_BOF_BIFF3 = 0x0300; +const sal_uInt16 BIFF_BOF_BIFF4 = 0x0400; +const sal_uInt16 BIFF_BOF_BIFF5 = 0x0500; +const sal_uInt16 BIFF_BOF_BIFF8 = 0x0600; + +const sal_uInt8 BIFF_ERR_NULL = 0x00; +const sal_uInt8 BIFF_ERR_DIV0 = 0x07; +const sal_uInt8 BIFF_ERR_VALUE = 0x0F; +const sal_uInt8 BIFF_ERR_REF = 0x17; +const sal_uInt8 BIFF_ERR_NAME = 0x1D; +const sal_uInt8 BIFF_ERR_NUM = 0x24; +const sal_uInt8 BIFF_ERR_NA = 0x2A; + +const sal_uInt8 BIFF_DATATYPE_EMPTY = 0; +const sal_uInt8 BIFF_DATATYPE_DOUBLE = 1; +const sal_uInt8 BIFF_DATATYPE_STRING = 2; +const sal_uInt8 BIFF_DATATYPE_BOOL = 4; +const sal_uInt8 BIFF_DATATYPE_ERROR = 16; + +// unicode strings ------------------------------------------------------------ + +const sal_uInt8 BIFF_STRF_16BIT = 0x01; +const sal_uInt8 BIFF_STRF_PHONETIC = 0x04; +const sal_uInt8 BIFF_STRF_RICH = 0x08; +const sal_uInt8 BIFF_STRF_UNKNOWN = 0xF2; + +// ============================================================================ + +/** Static helper functions for BIFF filters. */ +class BiffHelper +{ +public: + // conversion ------------------------------------------------------------- + + /** Converts the passed packed number to a double. */ + static double calcDoubleFromRk( sal_Int32 nRkValue ); + /** Converts the passed double to a packed number, returns true on success. */ + static bool calcRkFromDouble( sal_Int32& ornRkValue, double fValue ); + + /** Converts the passed BIFF error to a double containing the respective Calc error code. */ + static double calcDoubleFromError( sal_uInt8 nErrorCode ); + + /** Returns a text encoding from an Windows code page. + @return The corresponding text encoding or RTL_TEXTENCODING_DONTKNOW. */ + static rtl_TextEncoding calcTextEncodingFromCodePage( sal_uInt16 nCodePage ); + /** Returns a Windows code page from a text encoding. */ + static sal_uInt16 calcCodePageFromTextEncoding( rtl_TextEncoding eTextEnc ); + + /** Imports a picture from an IMGDATA record. */ + static void importImgData( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, BiffType eBiff ); + +private: + BiffHelper(); // not implemented + ~BiffHelper(); // not implemented +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/biffinputstream.hxx b/oox/inc/oox/xls/biffinputstream.hxx new file mode 100644 index 000000000000..c804d2c9c6e0 --- /dev/null +++ b/oox/inc/oox/xls/biffinputstream.hxx @@ -0,0 +1,447 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_BIFFINPUTSTREAM_HXX +#define OOX_XLS_BIFFINPUTSTREAM_HXX + +#include <vector> +#include "oox/helper/binaryinputstream.hxx" +#include "oox/xls/biffhelper.hxx" +#include "oox/xls/biffcodec.hxx" + +namespace rtl { class OUStringBuffer; } + +namespace oox { +namespace xls { + +// ============================================================================ + +namespace prv { + +/** Buffers the contents of a raw record and encapsulates stream decoding. */ +class BiffInputRecordBuffer +{ +public: + explicit BiffInputRecordBuffer( BinaryInputStream& rInStrm ); + + /** Returns the wrapped binary base stream. */ + inline const BinaryInputStream& getBaseStream() const { return mrInStrm; } + + /** Sets a decoder object and decrypts buffered record data. */ + void setDecoder( const BiffDecoderRef& rxDecoder ); + /** Returns the current decoder object. */ + inline BiffDecoderRef getDecoder() const { return mxDecoder; } + /** Enables/disables usage of current decoder. */ + void enableDecoder( bool bEnable ); + + /** Restarts the stream at the passed position. Buffer is invalid until the + next call of startRecord() or startNextRecord(). */ + void restartAt( sal_Int64 nPos ); + + /** Reads the record header at the passed position. */ + bool startRecord( sal_Int64 nHeaderPos ); + /** Reads the next record header from the stream. */ + bool startNextRecord(); + /** Returns the start position of the record header in the core stream. */ + sal_uInt16 getNextRecId(); + + /** Returns the start position of the record header in the core stream. */ + inline sal_Int64 getRecHeaderPos() const { return mnHeaderPos; } + /** Returns the current record identifier. */ + inline sal_uInt16 getRecId() const { return mnRecId; } + /** Returns the current record size. */ + inline sal_uInt16 getRecSize() const { return mnRecSize; } + /** Returns the current read position in the current record body. */ + inline sal_uInt16 getRecPos() const { return mnRecPos; } + /** Returns the number of remaining bytes in the current record body. */ + inline sal_uInt16 getRecLeft() const { return mnRecSize - mnRecPos; } + + /** Reads nBytes bytes to the existing buffer opData. Must NOT overread the source buffer. */ + void read( void* opData, sal_uInt16 nBytes ); + /** Ignores nBytes bytes. Must NOT overread the buffer. */ + void skip( sal_uInt16 nBytes ); + +private: + /** Updates data buffer from stream, if needed. */ + void updateBuffer(); + /** Updates decoded data from original data. */ + void updateDecoded(); + +private: + typedef ::std::vector< sal_uInt8 > DataBuffer; + + BinaryInputStream& mrInStrm; /// Core input stream. + DataBuffer maOriginalData; /// Original data read from stream. + DataBuffer maDecodedData; /// Decoded data. + DataBuffer* mpCurrentData; /// Points to data buffer currently in use. + BiffDecoderRef mxDecoder; /// Decoder object. + sal_Int64 mnHeaderPos; /// Stream start position of current record header. + sal_Int64 mnBodyPos; /// Stream start position of current record body. + sal_Int64 mnBufferBodyPos; /// Stream start position of buffered data. + sal_Int64 mnNextHeaderPos; /// Stream start position of next record header. + sal_uInt16 mnRecId; /// Current record identifier. + sal_uInt16 mnRecSize; /// Current record size. + sal_uInt16 mnRecPos; /// Current position in record body. + bool mbValidHeader; /// True = valid record header. +}; + +} // namespace prv + +// ============================================================================ + +/** This class is used to read BIFF record streams. + + An instance is constructed with a BinaryInputStream object. The passed + stream is reset to its start while constructing this stream. + + To start reading a record call startNextRecord(). Now it is possible to + read all contents of the record using operator>>() or any of the read***() + functions. If some data exceeds the record size limit, the stream looks for + a following CONTINUE record and jumps automatically to it. It is NOT + allowed that an atomic data type is split into two records (e.g. 4 bytes of + a double in one record and the other 4 bytes in a following CONTINUE). + + Trying to read over the record limits results in a stream error. The + isValid() function indicates that by returning false. From now on the data + returned by the read functions is undefined. The error state will be reset, + if the record is reset (with the function resetRecord()), or if the next + record is started. + + To switch off the automatic lookup of CONTINUE records, use resetRecord() + with false parameter. This is useful e.g. on import of drawing layer data, + where sometimes solely CONTINUE records will occur. The automatic lookup + keeps switched off until the method resetRecord() is called with parameter + true. All other settings done on the stream (e.g. alternative CONTINUE + record identifier, enabled decryption, NUL substitution character) will be + reset to default values, if a new record is started. + + The import stream supports decrypting the stream data. The contents of a + record (not the record header) will be encrypted by Excel if the file has + been stored with password protection. The functions setDecoder() and + enableDecoder() control the usage of the decryption algorithms. + setDecoder() sets a new decryption algorithm and initially enables it. + enableDecoder( false ) may be used to stop the usage of the decryption + temporarily (sometimes record contents are never encrypted, e.g. all BOF + records or the stream position in SHEET records). Decryption will be + reenabled automatically, if a new record is started with the function + startNextRecord(). +*/ +class BiffInputStream : public BinaryInputStream +{ +public: + /** Constructs the BIFF record stream using the passed binary stream. + + @param rInStream + The base input stream. Must be seekable. Will be seeked to its + start position. + + @param bContLookup Automatic CONTINUE lookup on/off. + */ + explicit BiffInputStream( + BinaryInputStream& rInStream, + bool bContLookup = true ); + + // record control --------------------------------------------------------- + + /** Sets stream pointer to the start of the next record content. + + Ignores all CONTINUE records of the current record, if automatic + CONTINUE usage is switched on. + + @return False = no record found (end of stream). + */ + bool startNextRecord(); + + /** Sets stream pointer to the start of the content of the specified record. + + The handle of the current record can be received and stored using the + function getRecHandle() for later usage with this function. The record + handle is equivalent to the position of the underlying binary stream, + thus the function can be used to perform a hard seek to a specific + position, if it is sure that a record starts exactly at this position. + + @return False = no record found (invalid handle passed). + */ + bool startRecordByHandle( sal_Int64 nRecHandle ); + + /** Sets stream pointer to begin of record content. + + @param bContLookup + Automatic CONTINUE lookup on/off. In difference to other stream + settings, this setting is persistent until next call of this + function (because it is wanted to receive the next CONTINUE records + separately). + @param nAltContId + Sets an alternative record identifier for content continuation. + This value is reset automatically when a new record is started with + startNextRecord(). + */ + void resetRecord( + bool bContLookup, + sal_uInt16 nAltContId = BIFF_ID_UNKNOWN ); + + /** Sets stream pointer before current record and invalidates stream. + + The next call to startNextRecord() will start again the current record. + This can be used in situations where a loop or a function leaves on a + specific record, but the parent context expects to start this record by + itself. The stream is invalid as long as the first record has not been + started (it is not allowed to call any other stream operation then). + */ + void rewindRecord(); + + // decoder ---------------------------------------------------------------- + + /** Sets a new decoder object. + + Enables decryption of record contents for the rest of the stream. + */ + void setDecoder( const BiffDecoderRef& rxDecoder ); + + /** Enables/disables usage of current decoder. + + Decryption is reenabled automatically, if a new record is started using + the function startNextRecord(). + */ + void enableDecoder( bool bEnable = true ); + + // stream/record state and info ------------------------------------------- + + /** Returns the current record identifier. */ + inline sal_uInt16 getRecId() const { return mnRecId; } + /** Returns the record identifier of the following record. */ + sal_uInt16 getNextRecId(); + + /** Returns a unique handle for the current record that can be used with + the function startRecordByHandle(). */ + inline sal_Int64 getRecHandle() const { return mnRecHandle; } + + // BinaryStreamBase interface (seeking) ----------------------------------- + + /** Returns true, as the BIFF input stream is required to be seekable. */ + virtual bool isSeekable() const; + /** Returns the position inside of the whole record content. */ + virtual sal_Int64 tell() const; + /** Returns the data size of the whole record without record headers. */ + virtual sal_Int64 getLength() const; + /** Seeks in record content to the specified position. */ + virtual void seek( sal_Int64 nRecPos ); + + /** Returns the absolute position in the wrapped binary stream. */ + sal_Int64 tellBase() const; + /** Returns the total size of the wrapped binary stream. */ + sal_Int64 getBaseLength() const; + + // BinaryInputStream interface (stream read access) ----------------------- + + /** Reads nBytes bytes to the passed sequence. + @return Number of bytes really read. */ + virtual sal_Int32 readData( StreamDataSequence& orData, sal_Int32 nBytes ); + /** Reads nBytes bytes and copies them to the passed buffer opMem. + @return Number of bytes really read. */ + virtual sal_Int32 readMemory( void* opMem, sal_Int32 nBytes ); + /** Seeks forward inside the current record. */ + virtual void skip( sal_Int32 nBytes ); + + /** Stream operator for integral and floating-point types. */ + template< typename Type > + inline BiffInputStream& operator>>( Type& ornValue ) { readValue( ornValue ); return *this; } + + // byte strings ----------------------------------------------------------- + + /** Reads 8/16 bit string length and character array, and returns the string. + @param b16BitLen + True = Read 16-bit string length field before the character array. + False = Read 8-bit string length field before the character array. + @param bAllowNulChars + True = NUL characters are inserted into the imported string. + False = NUL characters are replaced by question marks (default). + */ + ::rtl::OString readByteString( bool b16BitLen, bool bAllowNulChars = false ); + + /** Reads 8/16 bit string length and character array, and returns a Unicode string. + @param b16BitLen + True = Read 16-bit string length field before the character array. + False = Read 8-bit string length field before the character array. + @param eTextEnc The text encoding used to create the Unicode string. + @param bAllowNulChars + True = NUL characters are inserted into the imported string. + False = NUL characters are replaced by question marks (default). + */ + ::rtl::OUString readByteStringUC( bool b16BitLen, rtl_TextEncoding eTextEnc, bool bAllowNulChars = false ); + + /** Ignores 8/16 bit string length and character array. + @param b16BitLen + True = Read 16-bit string length field before the character array. + False = Read 8-bit string length field before the character array. + */ + void skipByteString( bool b16BitLen ); + + // Unicode strings -------------------------------------------------------- + + /** Reads nChars characters of a BIFF8 string, and returns the string. + @param nChars Number of characters to read from the stream. + @param b16BitChars + True = The character array contains 16-bit characters. + False = The character array contains truncated 8-bit characters. + @param bAllowNulChars + True = NUL characters are inserted into the imported string. + False = NUL characters are replaced by question marks (default). + */ + ::rtl::OUString readUniStringChars( sal_uInt16 nChars, bool b16BitChars, bool bAllowNulChars = false ); + + /** Reads 8-bit flags, extended header, nChar characters, extended data of + a BIFF8 string, and returns the string. + @param nChars Number of characters to read from the stream. + @param bAllowNulChars + True = NUL characters are inserted into the imported string. + False = NUL characters are replaced by question marks (default). + */ + ::rtl::OUString readUniStringBody( sal_uInt16 nChars, bool bAllowNulChars = false ); + + /** Reads 16-bit character count, 8-bit flags, extended header, character + array, extended data of a BIFF8 string, and returns the string. + @param bAllowNulChars + True = NUL characters are inserted into the imported string. + False = NUL characters are replaced by question marks (default). + */ + ::rtl::OUString readUniString( bool bAllowNulChars = false ); + + /** Ignores nChars characters of a BIFF8 string. + @param nChars Number of characters to skip in the stream. + @param b16BitChars + True = The character array contains 16-bit characters. + False = The character array contains truncated 8-bit characters. + */ + void skipUniStringChars( sal_uInt16 nChars, bool b16BitChars ); + + /** Ignores 8-bit flags, extended header, nChar characters, extended data + of a BIFF8 string. + @param nChars Number of characters to skip in the stream. + */ + void skipUniStringBody( sal_uInt16 nChars ); + + /** Ignores 16-bit character count, 8-bit flags, extended header, character + array, extended data of a BIFF8 string. + */ + void skipUniString(); + + // ------------------------------------------------------------------------ +private: + /** Forwards calls of readValue() template functions to the record buffer. */ + virtual void readAtom( void* opMem, sal_uInt8 nSize ); + + /** Initializes all members after base stream has been seeked to new record. */ + void setupRecord(); + /** Restarts the current record from the beginning. */ + void restartRecord( bool bInvalidateRecSize ); + /** Sets stream pointer before specified record and invalidates stream. */ + void rewindToRecord( sal_Int64 nRecHandle ); + /** Returns true, if stream was able to start a valid record. */ + inline bool isInRecord() const { return mnRecHandle >= 0; } + + /** Returns true, if the passed ID is real or alternative continuation record ID. */ + bool isContinueId( sal_uInt16 nRecId ) const; + /** Goes to start of the next CONTINUE record. + @descr Stream must be located at the end of a raw record, and handling + of CONTINUE records must be enabled. + @return True if next CONTINUE record has been found and initialized. */ + bool jumpToNextContinue(); + /** Goes to start of the next CONTINUE record while reading strings. + @descr Stream must be located at the end of a raw record. If reading + has been started in a CONTINUE record, jumps to an existing following + CONTINUE record, even if handling of CONTINUE records is disabled (this + is a special handling for TXO string data). Reads additional Unicode + flag byte at start of the new raw record and sets or resets rb16BitChars. + @return True if next CONTINUE record has been found and initialized. */ + bool jumpToNextStringContinue( bool& rb16BitChars ); + /** Calculates the complete length of the current record including CONTINUE + records, stores the length in mnComplRecSize. */ + void calcRecordLength(); + + /** Ensures that reading nBytes bytes is possible with next stream access. + @descr Stream must be located at the end of a raw record, and handling + of CONTINUE records must be enabled. + @return True if nBytes can be read from stream. */ + bool ensureRawReadSize( sal_uInt16 nBytes ); + /** Returns the maximum size of raw data possible to read in one block. */ + sal_uInt16 getMaxRawReadSize( sal_Int32 nBytes ) const; + + /** Reads an array of Unicode characters and appends them to the passed buffer. */ + void appendUnicodeArray( ::rtl::OUStringBuffer& orBuffer, sal_uInt16 nChars, bool b16BitChars, bool bAllowNulChars ); + /** Reads the BIFF8 Unicode string header fields. */ + void readUniStringHeader( bool& orb16BitChars, sal_Int32& ornAddSize ); + +private: + prv::BiffInputRecordBuffer maRecBuffer; /// Raw record data buffer. + + sal_Int64 mnRecHandle; /// Handle of current record. + sal_uInt16 mnRecId; /// Identifier of current record (not the CONTINUE ID). + sal_uInt16 mnAltContId; /// Alternative identifier for content continuation records. + + sal_Int64 mnCurrRecSize; /// Helper for record size and position. + sal_Int64 mnComplRecSize; /// Size of complete record data (with CONTINUEs). + bool mbHasComplRec; /// True = mnComplRecSize is valid. + + bool mbCont; /// True = automatic CONTINUE lookup enabled. +}; + +// ============================================================================ + +class BiffInputStreamPos +{ +public: + explicit BiffInputStreamPos( BiffInputStream& rStrm ); + + bool restorePosition(); + + inline BiffInputStream& getStream() { return mrStrm; } + +private: + BiffInputStream& mrStrm; + sal_Int64 mnRecHandle; + sal_Int64 mnRecPos; +}; + +// ============================================================================ + +/** Stores the current position of the passed stream on construction and + restores it automatically on destruction. */ +class BiffInputStreamPosGuard : private BiffInputStreamPos +{ +public: + explicit BiffInputStreamPosGuard( BiffInputStream& rStrm ); + ~BiffInputStreamPosGuard(); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/biffoutputstream.hxx b/oox/inc/oox/xls/biffoutputstream.hxx new file mode 100644 index 000000000000..6e36b08d3592 --- /dev/null +++ b/oox/inc/oox/xls/biffoutputstream.hxx @@ -0,0 +1,165 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_BIFFOUTPUTSTREAM_HXX +#define OOX_XLS_BIFFOUTPUTSTREAM_HXX + +#include <vector> +#include "oox/helper/binaryoutputstream.hxx" +#include "oox/xls/biffhelper.hxx" + +namespace oox { class BinaryOutputStream; } + +namespace oox { +namespace xls { + +// ============================================================================ + +namespace prv { + +/** Buffers the contents of a raw record. */ +class BiffOutputRecordBuffer +{ +public: + explicit BiffOutputRecordBuffer( + BinaryOutputStream& rOutStrm, + sal_uInt16 nMaxRecSize ); + + /** Returns the wrapped binary base stream. */ + inline const BinaryOutputStream& getBaseStream() const { return mrOutStrm; } + + /** Starts a new record. */ + void startRecord( sal_uInt16 nRecId ); + /** Finishes the current record. Must be called for every started record. */ + void endRecord(); + + /** Returns the number of remaining bytes in the current record body. */ + inline sal_uInt16 getRecLeft() const { return static_cast< sal_uInt16 >( mnMaxRecSize - maData.size() ); } + + /** Writes nBytes bytes from the existing buffer pData. Must NOT overwrite the destination buffer. */ + void write( const void* pData, sal_uInt16 nBytes ); + /** Writes a sequence of nBytes bytes with the passed value. */ + void fill( sal_uInt8 nValue, sal_uInt16 nBytes ); + +private: + typedef ::std::vector< sal_uInt8 > DataBuffer; + + BinaryOutputStream& mrOutStrm; /// Core ouput stream. + DataBuffer maData; /// Record data buffer. + sal_uInt16 mnMaxRecSize; /// Maximum size of record contents. + sal_uInt16 mnRecId; /// Current record identifier. + bool mbInRec; /// True = currently writing inside of a record. +}; + +} // namespace prv + +// ============================================================================ + +/** This class is used to write BIFF record streams. + + An instance is constructed with a BinaryOutputStream object and the + maximum size of BIFF record contents (e.g. 2080 bytes in BIFF2-BIFF5, or + 8224 bytes in BIFF8). + + To start writing a record, call startRecord() with the record identifier. + Each record must be closed by calling endRecord(). + + If some data exceeds the record size limit, a CONTINUE record will be + started automatically and the new data will be written to this record. If + specific data pieces must not be split into the current and a following + CONTINUE record, use setPortionSize(). Example: To write a sequence of + 16-bit values where 4 values form a unit and cannot be split, call + setPortionSize(8) first (4*2 bytes == 8). + + To write unicode character arrays, call writeUnicodeBuffer(). It creates + CONTINUE records and repeats the unicode string flag byte automatically. +*/ +class BiffOutputStream : public BinaryOutputStream +{ +public: + explicit BiffOutputStream( + BinaryOutputStream& rOutStream, + sal_uInt16 nMaxRecSize ); + + // record control --------------------------------------------------------- + + /** Starts a new record. */ + void startRecord( sal_uInt16 nRecId ); + + /** Finishes the current record. Must be called for every started record. */ + void endRecord(); + + /** Sets size of data portion in bytes. 0 means no portions are used. */ + void setPortionSize( sal_uInt16 nSize ); + + // BinaryStreamBase interface (seeking) ----------------------------------- + + /** Returns the absolute position in the wrapped binary stream. */ + sal_Int64 tellBase() const; + /** Returns the total size of the wrapped binary stream. */ + sal_Int64 getBaseLength() const; + + // BinaryOutputStream interface (stream write access) --------------------- + + /** Writes the passed data sequence. */ + virtual void writeData( const StreamDataSequence& rData ); + /** Writes nBytes bytes from the passed buffer pMem. */ + virtual void writeMemory( const void* pMem, sal_Int32 nBytes ); + + /** Writes a sequence of nBytes bytes with the passed value. */ + void fill( sal_uInt8 nValue, sal_Int32 nBytes ); + /** Writes a block of memory, ensures that it is not split to a CONTINUE record. */ + void writeBlock( const void* pMem, sal_uInt16 nBytes ); + + /** Stream operator for integral and floating-point types. */ + template< typename Type > + inline BiffOutputStream& operator<<( Type nValue ) { writeValue( nValue ); return *this; } + + // ------------------------------------------------------------------------ +private: + /** Forwards calls of writeValue() template functions to the record buffer. */ + virtual void writeAtom( const void* pMem, sal_uInt8 nSize ); + + /** Checks the remaining size in the current record, creates CONTINUE record if needed. */ + void ensureRawBlock( sal_uInt16 nSize ); + /** Checks the remaining size in the current record and creates CONTINUE record if needed. + @return Maximum size left for writing to current record. */ + sal_uInt16 prepareRawBlock( sal_Int32 nTotalSize ); + +private: + prv::BiffOutputRecordBuffer maRecBuffer; /// Raw record data buffer. + sal_uInt16 mnPortionSize; /// Size of data portions. + sal_uInt16 mnPortionPos; /// Position in current portion. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/chartsheetfragment.hxx b/oox/inc/oox/xls/chartsheetfragment.hxx new file mode 100644 index 000000000000..dc8e0f85fd13 --- /dev/null +++ b/oox/inc/oox/xls/chartsheetfragment.hxx @@ -0,0 +1,88 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_CHARTSHEETFRAGMENT_HXX +#define OOX_XLS_CHARTSHEETFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxChartsheetFragment : public OoxWorksheetFragmentBase +{ +public: + explicit OoxChartsheetFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath, + ISegmentProgressBarRef xProgressBar, + sal_Int16 nSheet ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + virtual void initializeImport(); + virtual void finalizeImport(); + +private: + /** Imports the the relation identifier for the DrawingML part. */ + void importDrawing( const AttributeList& rAttribs ); + /** Imports the DRAWING record containing the relation identifier for the DrawingML part. */ + void importDrawing( RecordInputStream& rStrm ); +}; + +// ============================================================================ + +class BiffChartsheetFragment : public BiffWorksheetFragmentBase +{ +public: + explicit BiffChartsheetFragment( + const BiffWorkbookFragmentBase& rParent, + ISegmentProgressBarRef xProgressBar, + sal_Int16 nSheet ); + + /** Imports the entire sheet fragment, returns true, if EOF record has been reached. */ + virtual bool importFragment(); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/commentsbuffer.hxx b/oox/inc/oox/xls/commentsbuffer.hxx new file mode 100644 index 000000000000..8a43eb7fe9fe --- /dev/null +++ b/oox/inc/oox/xls/commentsbuffer.hxx @@ -0,0 +1,102 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_COMMENTSBUFFER_HXX +#define OOX_XLS_COMMENTSBUFFER_HXX + +#include "oox/xls/richstring.hxx" +#include "oox/xls/worksheethelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +struct CommentModel +{ + ::com::sun::star::table::CellRangeAddress + maRange; /// Position of the comment in the worksheet. + RichStringRef mxText; /// Formatted text of the comment. + sal_Int32 mnAuthorId; /// Identifier of the comment's author. + + explicit CommentModel(); +}; + +// ---------------------------------------------------------------------------- + +class Comment : public WorksheetHelper +{ +public: + explicit Comment( const WorksheetHelper& rHelper ); + + /** Imports a cell comment from the passed attributes of the comment element. */ + void importComment( const AttributeList& rAttribs ); + /** Imports a cell comment from the passed stream of a COMMENT record. */ + void importComment( RecordInputStream& rStrm ); + + /** Creates and returns a new rich-string object for the comment text. */ + RichStringRef createText(); + + /** Finalizes the formatted string of the comment. */ + void finalizeImport(); + +private: + CommentModel maModel; +}; + +typedef ::boost::shared_ptr< Comment > CommentRef; + +// ============================================================================ + +class CommentsBuffer : public WorksheetHelper +{ +public: + explicit CommentsBuffer( const WorksheetHelper& rHelper ); + + /** Appends a new author to the list of comment authors. */ + void appendAuthor( const ::rtl::OUString& rAuthor ); + /** Creates and returns a new comment. */ + CommentRef createComment(); + + /** Finalizes the formatted string of all comments. */ + void finalizeImport(); + +private: + typedef ::std::vector< ::rtl::OUString > OUStringVector; + typedef RefVector< Comment > CommentVector; + + OUStringVector maAuthors; + CommentVector maComments; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/commentsfragment.hxx b/oox/inc/oox/xls/commentsfragment.hxx new file mode 100644 index 000000000000..584c6a2bb340 --- /dev/null +++ b/oox/inc/oox/xls/commentsfragment.hxx @@ -0,0 +1,74 @@ +/************************************************************************* + * + * 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. + * + ***********************************************************************/ + +#ifndef OOX_XLS_COMMENTSFRAGMENT_HXX +#define OOX_XLS_COMMENTSFRAGMENT_HXX + +#include "oox/xls/commentsbuffer.hxx" +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxCommentsFragment : public OoxWorksheetFragmentBase +{ +public: + explicit OoxCommentsFragment( + const WorksheetHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onEndRecord(); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + +private: + /** Imports comment data from the comment element. */ + void importComment( const AttributeList& rAttribs ); + /** Imports comment data from the COMMENT record. */ + void importComment( RecordInputStream& rStrm ); + +private: + CommentRef mxComment; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/condformatbuffer.hxx b/oox/inc/oox/xls/condformatbuffer.hxx new file mode 100644 index 000000000000..25259ce04295 --- /dev/null +++ b/oox/inc/oox/xls/condformatbuffer.hxx @@ -0,0 +1,195 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_CONDFORMATBUFFER_HXX +#define OOX_XLS_CONDFORMATBUFFER_HXX + +#include <com/sun/star/sheet/ConditionOperator.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/formulaparser.hxx" +#include "oox/xls/worksheethelper.hxx" + +namespace com { namespace sun { namespace star { + namespace sheet { class XSheetConditionalEntries; } +} } } + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Model for a single rule in a conditional formatting. */ +struct CondFormatRuleModel +{ + typedef ::std::vector< TokensFormulaContext > ContextVector; + + ContextVector maFormulas; /// Formulas for rule conditions. + ::rtl::OUString maText; /// Text for 'contains' rules. + sal_Int32 mnPriority; /// Priority of this rule. + sal_Int32 mnType; /// Type of the rule. + sal_Int32 mnOperator; /// In cell-is rules: Comparison operator. + sal_Int32 mnTimePeriod; /// In time-period rules: Type of time period. + sal_Int32 mnRank; /// In top-10 rules: True = bottom, false = top. + sal_Int32 mnStdDev; /// In average rules: Number of std deviations. + sal_Int32 mnDxfId; /// Differential formatting identifier. + bool mbStopIfTrue; /// True = stop evaluating rules, if this rule is true. + bool mbBottom; /// In top-10 rules: True = bottom, false = top. + bool mbPercent; /// In top-10 rules: True = percent, false = rank. + bool mbAboveAverage; /// In average rules: True = above average, false = below. + bool mbEqualAverage; /// In average rules: True = include average, false = exclude. + + explicit CondFormatRuleModel(); + + /** Sets the passed OOBIN or BIFF operator for condition type cellIs. */ + void setBinOperator( sal_Int32 nOperator ); + + /** Sets the passed OOBIN text comparison type and operator. */ + void setOobTextType( sal_Int32 nOperator ); +}; + +// ============================================================================ + +class CondFormat; + +/** Represents a single rule in a conditional formatting. */ +class CondFormatRule : public WorksheetHelper +{ +public: + explicit CondFormatRule( const CondFormat& rCondFormat ); + + /** Imports rule settings from the cfRule element. */ + void importCfRule( const AttributeList& rAttribs ); + /** Appends a new condition formula string. */ + void appendFormula( const ::rtl::OUString& rFormula ); + + /** Imports rule settings from a CFRULE record. */ + void importCfRule( RecordInputStream& rStrm ); + + /** Imports rule settings from a CFRULE record. */ + void importCfRule( BiffInputStream& rStrm, sal_Int32 nPriority ); + + /** Creates a conditional formatting rule in the Calc document. */ + void finalizeImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetConditionalEntries >& rxEntries ); + + /** Returns the priority of this rule. */ + inline sal_Int32 getPriority() const { return maModel.mnPriority; } + +private: + const CondFormat& mrCondFormat; + CondFormatRuleModel maModel; +}; + +typedef ::boost::shared_ptr< CondFormatRule > CondFormatRuleRef; + +// ============================================================================ + +/** Model for a conditional formatting object. */ +struct CondFormatModel +{ + ApiCellRangeList maRanges; /// Cell ranges for this conditional format. + bool mbPivot; /// Conditional formatting belongs to pivot table. + + explicit CondFormatModel(); +}; + +// ============================================================================ + +/** Represents a conditional formatting object with a list of affected cell ranges. */ +class CondFormat : public WorksheetHelper +{ +public: + explicit CondFormat( const WorksheetHelper& rHelper ); + + /** Imports settings from the conditionalFormatting element. */ + void importConditionalFormatting( const AttributeList& rAttribs ); + /** Imports a conditional formatting rule from the cfRule element. */ + CondFormatRuleRef importCfRule( const AttributeList& rAttribs ); + + /** Imports settings from the CONDFORMATTING record. */ + void importCondFormatting( RecordInputStream& rStrm ); + /** Imports a conditional formatting rule from the CFRULE record. */ + void importCfRule( RecordInputStream& rStrm ); + + /** Imports settings from the CFHEADER record. */ + void importCfHeader( BiffInputStream& rStrm ); + + /** Creates the conditional formatting in the Calc document. */ + void finalizeImport(); + + /** Returns the cell ranges this conditional formatting belongs to. */ + inline const ApiCellRangeList& getRanges() const { return maModel.maRanges; } + +private: + CondFormatRuleRef createRule(); + void insertRule( CondFormatRuleRef xRule ); + +private: + typedef RefMap< sal_Int32, CondFormatRule > CondFormatRuleMap; + + CondFormatModel maModel; /// Model of this conditional formatting. + CondFormatRuleMap maRules; /// Maps formatting rules by priority. +}; + +typedef ::boost::shared_ptr< CondFormat > CondFormatRef; + +// ============================================================================ + +class CondFormatBuffer : public WorksheetHelper +{ +public: + explicit CondFormatBuffer( const WorksheetHelper& rHelper ); + + /** Imports settings from the conditionalFormatting element. */ + CondFormatRef importConditionalFormatting( const AttributeList& rAttribs ); + /** Imports settings from the CONDFORMATTING record. */ + CondFormatRef importCondFormatting( RecordInputStream& rStrm ); + /** Imports settings from the CFHEADER record. */ + void importCfHeader( BiffInputStream& rStrm ); + + /** Creates all conditional formattings in the Calc document. */ + void finalizeImport(); + + /** Converts an OOXML condition operator token to the API constant. */ + static ::com::sun::star::sheet::ConditionOperator + convertToApiOperator( sal_Int32 nToken ); + +private: + CondFormatRef createCondFormat(); + +private: + typedef RefVector< CondFormat > CondFormatVec; + CondFormatVec maCondFormats; /// All conditional formattings in a sheet. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/condformatcontext.hxx b/oox/inc/oox/xls/condformatcontext.hxx new file mode 100644 index 000000000000..799e3127b7a3 --- /dev/null +++ b/oox/inc/oox/xls/condformatcontext.hxx @@ -0,0 +1,65 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_CONDFORMATCONTEXT_HXX +#define OOX_XLS_CONDFORMATCONTEXT_HXX + +#include "oox/xls/condformatbuffer.hxx" +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxCondFormatContext : public OoxWorksheetContextBase +{ +public: + explicit OoxCondFormatContext( OoxWorksheetFragmentBase& rFragment ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onStartRecord( RecordInputStream& rStrm ); + +private: + CondFormatRef mxCondFmt; + CondFormatRuleRef mxRule; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/connectionsfragment.hxx b/oox/inc/oox/xls/connectionsfragment.hxx new file mode 100644 index 000000000000..85951a5bbfc7 --- /dev/null +++ b/oox/inc/oox/xls/connectionsfragment.hxx @@ -0,0 +1,65 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_CONNECTIONSFRAGMENT_HXX +#define OOX_XLS_CONNECTIONSFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxConnectionsFragment : public OoxWorkbookFragmentBase +{ +public: + explicit OoxConnectionsFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + void importConnection( const AttributeList& rAttribs ); + void importWebPr( const AttributeList& rAttribs ); + void importTables( const AttributeList& rAttribs ); + void importS( const AttributeList& rAttribs ); + void importX( const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/defnamesbuffer.hxx b/oox/inc/oox/xls/defnamesbuffer.hxx new file mode 100644 index 000000000000..45208f0ac344 --- /dev/null +++ b/oox/inc/oox/xls/defnamesbuffer.hxx @@ -0,0 +1,221 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_DEFINEDNAMESBUFFER_HXX +#define OOX_XLS_DEFINEDNAMESBUFFER_HXX + +#include "oox/helper/containerhelper.hxx" +#include "oox/helper/recordinputstream.hxx" +#include "oox/xls/formulabase.hxx" + +namespace com { namespace sun { namespace star { + namespace sheet { class XNamedRange; } +} } } + +namespace oox { +namespace xls { + +class FormulaContext; +class BiffInputStreamPos; + +// ============================================================================ + +// codes for built-in names +const sal_Unicode OOX_DEFNAME_CONSOLIDATEAREA = '\x00'; +const sal_Unicode OOX_DEFNAME_AUTOOPEN = '\x01'; +const sal_Unicode OOX_DEFNAME_AUTOCLOSE = '\x02'; +const sal_Unicode OOX_DEFNAME_EXTRACT = '\x03'; +const sal_Unicode OOX_DEFNAME_DATABASE = '\x04'; +const sal_Unicode OOX_DEFNAME_CRITERIA = '\x05'; +const sal_Unicode OOX_DEFNAME_PRINTAREA = '\x06'; +const sal_Unicode OOX_DEFNAME_PRINTTITLES = '\x07'; +const sal_Unicode OOX_DEFNAME_RECORDER = '\x08'; +const sal_Unicode OOX_DEFNAME_DATAFORM = '\x09'; +const sal_Unicode OOX_DEFNAME_AUTOACTIVATE = '\x0A'; +const sal_Unicode OOX_DEFNAME_AUTODEACTIVATE = '\x0B'; +const sal_Unicode OOX_DEFNAME_SHEETTITLE = '\x0C'; +const sal_Unicode OOX_DEFNAME_FILTERDATABASE = '\x0D'; +const sal_Unicode OOX_DEFNAME_UNKNOWN = '\x0E'; + +// ============================================================================ + +struct DefinedNameModel +{ + ::rtl::OUString maName; /// The original name. + ::rtl::OUString maFormula; /// The formula string. + sal_Int32 mnSheet; /// Sheet index for local names. + sal_Int32 mnFuncGroupId; /// Function group identifier. + bool mbMacro; /// True = Macro name (VBasic or sheet macro). + bool mbFunction; /// True = function, false = command. + bool mbVBName; /// True = VBasic macro, false = sheet macro. + bool mbHidden; /// True = name hidden in UI. + + explicit DefinedNameModel(); +}; + +// ============================================================================ + +/** Base class for defined names and external names. */ +class DefinedNameBase : public WorkbookHelper +{ +public: + explicit DefinedNameBase( const WorkbookHelper& rHelper ); + + /** Returns the original name as imported from or exported to the file. */ + inline const ::rtl::OUString& getModelName() const { return maModel.maName; } + /** Returns the name as used in the Calc document. */ + inline const ::rtl::OUString& getCalcName() const { return maCalcName; } + + /** Returns the original name as imported from or exported to the file. */ + const ::rtl::OUString& getUpcaseModelName() const; + /** Returns an Any with a SingleReference or ComplexReference, or an empty Any. */ + ::com::sun::star::uno::Any getReference( const ::com::sun::star::table::CellAddress& rBaseAddress ) const; + +protected: + /** Imports the OOX formula string, using the passed formula context. */ + void importOoxFormula( FormulaContext& rContext, sal_Int16 nBaseSheet ); + /** Imports the OOBIN formula, using the passed formula context. */ + void importOobFormula( FormulaContext& rContext, sal_Int16 nBaseSheet, RecordInputStream& rStrm ); + /** Imports the BIFF formula, using the passed formula context. */ + void importBiffFormula( FormulaContext& rContext, sal_Int16 nBaseSheet, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize = 0 ); + + /** Tries to convert the passed token sequence to a SingleReference or ComplexReference. */ + void extractReference( const ApiTokenSequence& rTokens ); + +protected: + DefinedNameModel maModel; /// Model data for this defined name. + mutable ::rtl::OUString maUpModelName; /// Model name converted to uppercase ASCII. + ::rtl::OUString maCalcName; /// Final name used in the Calc document. + ::com::sun::star::uno::Any maRefAny; /// Single cell/range reference. +}; + +// ============================================================================ + +class DefinedName : public DefinedNameBase +{ +public: + explicit DefinedName( const WorkbookHelper& rHelper ); + + /** Sets the attributes for this defined name from the passed attribute set. */ + void importDefinedName( const AttributeList& rAttribs ); + /** Sets the formula string from the body of the definedName element. */ + void setFormula( const ::rtl::OUString& rFormula ); + /** Imports the defined name from a DEFINEDNAME record in the passed stream. */ + void importDefinedName( RecordInputStream& rStrm ); + /** Imports the defined name from a DEFINEDNAME record in the passed BIFF stream. */ + void importDefinedName( BiffInputStream& rStrm, sal_Int16 nCalcSheet ); + + /** Creates a defined name in the Calc document. */ + void createNameObject(); + /** Converts the formula string or BIFF token array for this defined name. */ + void convertFormula(); + + /** Returns true, if this defined name is a special builtin name. */ + inline bool isBuiltinName() const { return mcBuiltinId != OOX_DEFNAME_UNKNOWN; } + /** Returns true, if this defined name is a macro function call. */ + inline bool isMacroFunction() const { return maModel.mbMacro && maModel.mbFunction; } + /** Returns true, if this defined name is global in the document. */ + inline bool isGlobalName() const { return mnCalcSheet < 0; } + + /** Returns the token index used in API token arrays (com.sun.star.sheet.FormulaToken). */ + inline sal_Int32 getTokenIndex() const { return mnTokenIndex; } + /** Returns the 0-based sheet index for local names, or -1 for global names. */ + inline sal_Int16 getLocalCalcSheet() const { return mnCalcSheet; } + /** Tries to resolve the defined name to an absolute cell range. */ + bool getAbsoluteRange( ::com::sun::star::table::CellRangeAddress& orRange ) const; + +private: + /** Imports the OOX or OOBIN formula, using the passed formula context. */ + void implImportOoxFormula( FormulaContext& rContext ); + /** Imports the BIFF formula, using the passed formula context. */ + void implImportBiffFormula( FormulaContext& rContext ); + +private: + typedef ::std::auto_ptr< StreamDataSequence > StreamDataSeqPtr; + typedef ::std::auto_ptr< BiffInputStreamPos > BiffStreamPosPtr; + + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange > + mxNamedRange; /// XNamedRange interface of the defined name. + sal_Int32 mnTokenIndex; /// Name index used in API token array. + sal_Int16 mnCalcSheet; /// Calc sheet index for sheet-local names. + sal_Unicode mcBuiltinId; /// Identifier for built-in defined names. + StreamDataSeqPtr mxFormula; /// Formula data for OOBIN import. + BiffStreamPosPtr mxBiffStrm; /// Cached BIFF stream for formula import. + sal_uInt16 mnFmlaSize; /// Cached BIFF formula size for formula import. +}; + +typedef ::boost::shared_ptr< DefinedName > DefinedNameRef; + +// ============================================================================ + +class DefinedNamesBuffer : public WorkbookHelper +{ +public: + explicit DefinedNamesBuffer( const WorkbookHelper& rHelper ); + + /** Sets the sheet index for local names (BIFF2-BIFF4 only). */ + void setLocalCalcSheet( sal_Int16 nCalcSheet ); + + /** Imports a defined name from the passed attribute set. */ + DefinedNameRef importDefinedName( const AttributeList& rAttribs ); + /** Imports a defined name from a DEFINEDNAME record in the passed stream. */ + void importDefinedName( RecordInputStream& rStrm ); + /** Imports a defined name from a DEFINEDNAME record in the passed BIFF stream. */ + void importDefinedName( BiffInputStream& rStrm ); + + /** Creates all defined names in the document. */ + void finalizeImport(); + + /** Returns a defined name by zero-based index (order of appearence). */ + DefinedNameRef getByIndex( sal_Int32 nIndex ) const; + /** Returns a defined name by token index (index in XDefinedNames container). */ + DefinedNameRef getByTokenIndex( sal_Int32 nIndex ) const; + /** Returns a defined name by its model name. + @param nSheet The sheet index for local names or -1 for global names. + If no local name is found, tries to find a matching global name. + @return Reference to the defined name or empty reference. */ + DefinedNameRef getByModelName( const ::rtl::OUString& rModelName, sal_Int16 nCalcSheet = -1 ) const; + +private: + DefinedNameRef createDefinedName(); + +private: + typedef RefVector< DefinedName > DefNameVector; + typedef RefMap< sal_Int32, DefinedName > DefNameMap; + + DefNameVector maDefNames; /// List of all defined names in insertion order. + DefNameMap maDefNameMap; /// Maps all defined names by API token index. + sal_Int16 mnCalcSheet; /// Current sheet index for BIFF2-BIFF4 names (always sheet-local). +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/drawingfragment.hxx b/oox/inc/oox/xls/drawingfragment.hxx new file mode 100644 index 000000000000..22fddd373a86 --- /dev/null +++ b/oox/inc/oox/xls/drawingfragment.hxx @@ -0,0 +1,201 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_DRAWINGFRAGMENT_HXX +#define OOX_XLS_DRAWINGFRAGMENT_HXX + +#include <com/sun/star/awt/Rectangle.hpp> +#include <com/sun/star/awt/Size.hpp> +#include "oox/drawingml/shape.hxx" +#include "oox/vml/vmldrawing.hxx" +#include "oox/vml/vmldrawingfragment.hxx" +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Absolute position in spreadsheet (in EMUs) independent from cells. */ +struct AnchorPosModel : public ::oox::drawingml::EmuPoint +{ + inline explicit AnchorPosModel() : ::oox::drawingml::EmuPoint( -1, -1 ) {} + inline bool isValid() const { return (X >= 0) && (Y >= 0); } +}; + +// ---------------------------------------------------------------------------- + +/** Absolute size in spreadsheet (in EMUs). */ +struct AnchorSizeModel : public ::oox::drawingml::EmuSize +{ + inline explicit AnchorSizeModel() : ::oox::drawingml::EmuSize( -1, -1 ) {} + inline bool isValid() const { return (Width >= 0) && (Height >= 0); } +}; + +// ---------------------------------------------------------------------------- + +/** Position in spreadsheet (cell position and offset inside cell in EMUs). */ +struct AnchorCellModel +{ + sal_Int32 mnCol; /// Column index. + sal_Int32 mnRow; /// Row index. + sal_Int64 mnColOffset; /// X offset in column mnCol (EMUs). + sal_Int64 mnRowOffset; /// Y offset in row mnRow (EMUs). + + explicit AnchorCellModel(); + inline bool isValid() const { return (mnCol >= 0) && (mnRow >= 0); } +}; + +// ---------------------------------------------------------------------------- + +/** Application-specific client data of a shape. */ +struct AnchorClientDataModel +{ + bool mbLocksWithSheet; + bool mbPrintsWithSheet; + + explicit AnchorClientDataModel(); +}; + +// ============================================================================ + +/** Contains the position of a shape in the spreadsheet. Supports different + shape anchor modes (absolute, one-cell, two-cell). */ +class ShapeAnchor : public WorksheetHelper +{ +public: + explicit ShapeAnchor( const WorksheetHelper& rHelper ); + + /** Imports the shape anchor (one of the elements xdr:absoluteAnchor, xdr:oneCellAnchor, xdr:twoCellAnchor). */ + void importAnchor( sal_Int32 nElement, const AttributeList& rAttribs ); + /** Imports the absolute anchor position from the xdr:pos element. */ + void importPos( const AttributeList& rAttribs ); + /** Imports the absolute anchor size from the xdr:ext element. */ + void importExt( const AttributeList& rAttribs ); + /** Imports the shape client data from the xdr:clientData element. */ + void importClientData( const AttributeList& rAttribs ); + /** Sets an attribute of the cell-dependent anchor position from xdr:from and xdr:to elements. */ + void setCellPos( sal_Int32 nElement, sal_Int32 nParentContext, const ::rtl::OUString& rValue ); + void importVmlAnchor( const ::rtl::OUString& rAnchor ); + + /** Returns true, if the anchor contains valid position and size settings. */ + bool isValidAnchor() const; + + /** Calculates the resulting shape anchor in 1/100 mm. */ + ::com::sun::star::awt::Rectangle + calcApiLocation( + const ::com::sun::star::awt::Size& rApiSheetSize, + const AnchorSizeModel& rEmuSheetSize ) const; + + /** Calculates the resulting shape anchor in EMUs. */ + ::com::sun::star::awt::Rectangle + calcEmuLocation( const AnchorSizeModel& rEmuSheetSize ) const; + +private: + enum AnchorType { ANCHOR_ABSOLUTE, ANCHOR_ONECELL, ANCHOR_TWOCELL, ANCHOR_VML, ANCHOR_INVALID }; + + AnchorType meType; /// Type of this shape anchor. + AnchorPosModel maPos; /// Top-left position, if anchor is of type absolute. + AnchorSizeModel maSize; /// Anchor size, if anchor is not of type two-cell. + AnchorCellModel maFrom; /// Top-left position, if anchor is not of type absolute. + AnchorCellModel maTo; /// Bottom-right position, if anchor is of type two-cell. + AnchorClientDataModel maClientData; /// Shape client data. + sal_Int32 mnEditAs; /// Anchor mode as shown in the UI. +}; + +typedef ::boost::shared_ptr< ShapeAnchor > ShapeAnchorRef; + +// ============================================================================ + +/** Fragment handler for a complete sheet drawing. */ +class OoxDrawingFragment : public OoxWorksheetFragmentBase +{ +public: + explicit OoxDrawingFragment( + const WorksheetHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > + mxDrawPage; /// Drawing page of this sheet. + ::com::sun::star::awt::Size maApiSheetSize; /// Sheet size in 1/100 mm. + AnchorSizeModel maEmuSheetSize; /// Sheet size in EMU. + ::oox::drawingml::ShapePtr mxShape; /// Current top-level shape. + ShapeAnchorRef mxAnchor; /// Current anchor of top-level shape. +}; + +// ============================================================================ + +class VmlDrawing : public ::oox::vml::Drawing, public WorksheetHelper +{ +public: + explicit VmlDrawing( const WorksheetHelper& rHelper ); + + /** Returns the drawing shape for a cell note at the specified position. */ + const ::oox::vml::ShapeBase* getNoteShape( const ::com::sun::star::table::CellAddress& rPos ) const; + + /** Filters cell note shapes. */ + virtual bool isShapeSupported( const ::oox::vml::ShapeBase& rShape ) const; + + /** Calculates the shape rectangle from a cell anchor string. */ + virtual bool convertShapeClientAnchor( + ::com::sun::star::awt::Rectangle& orShapeRect, + const ::rtl::OUString& rShapeAnchor ) const; + + /** Converts additional form control properties from the passed VML shape + client data. */ + virtual void convertControlClientData( + const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& rxCtrlModel, + const ::oox::vml::ShapeClientData& rClientData ) const; +}; + +// ============================================================================ + +class OoxVmlDrawingFragment : public ::oox::vml::DrawingFragment, public WorksheetHelper +{ +public: + explicit OoxVmlDrawingFragment( + const WorksheetHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + virtual void finalizeImport(); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/excelchartconverter.hxx b/oox/inc/oox/xls/excelchartconverter.hxx new file mode 100644 index 000000000000..08c3398a5718 --- /dev/null +++ b/oox/inc/oox/xls/excelchartconverter.hxx @@ -0,0 +1,62 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_EXCELCHARTCONVERTER_HXX +#define OOX_XLS_EXCELCHARTCONVERTER_HXX + +#include "oox/drawingml/chart/chartconverter.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class ExcelChartConverter : public ::oox::drawingml::chart::ChartConverter, public WorkbookHelper +{ +public: + explicit ExcelChartConverter( const WorkbookHelper& rHelper ); + virtual ~ExcelChartConverter(); + + /** Creates an external data provider that is able to use spreadsheet data. */ + virtual void createDataProvider( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument >& rxChartDoc ); + + /** Creates a data sequence from the passed formula. */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > + createDataSequence( + const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataProvider >& rxDataProvider, + const ::oox::drawingml::chart::DataSequenceModel& rDataSeq ); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/excelfilter.hxx b/oox/inc/oox/xls/excelfilter.hxx new file mode 100644 index 000000000000..5da8b50d7f92 --- /dev/null +++ b/oox/inc/oox/xls/excelfilter.hxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_EXCELFILTER_HXX +#define OOX_XLS_EXCELFILTER_HXX + +#include "oox/core/xmlfilterbase.hxx" +#include "oox/core/binaryfilterbase.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class WorkbookHelper; + +class ExcelFilterBase +{ +protected: + explicit ExcelFilterBase(); + virtual ~ExcelFilterBase(); + + void setWorkbookHelper( WorkbookHelper& rHelper ); + WorkbookHelper& getWorkbookHelper() const; + void clearWorkbookHelper(); + +private: + WorkbookHelper* mpHelper; /// Nonowning pointer to helper base. +}; + +// ============================================================================ + +class ExcelFilter : public ::oox::core::XmlFilterBase, public ExcelFilterBase +{ +public: + explicit ExcelFilter( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxGlobalFactory ); + virtual ~ExcelFilter(); + + virtual bool importDocument() throw(); + virtual bool exportDocument() throw(); + + virtual sal_Int32 getSchemeColor( sal_Int32 nToken ) const; + virtual sal_Int32 getPaletteColor( sal_Int32 nPaletteIdx ) const; + + virtual const ::oox::drawingml::Theme* getCurrentTheme() const; + virtual ::oox::vml::Drawing* getVmlDrawing(); + virtual const ::oox::drawingml::table::TableStyleListPtr getTableStyles(); + virtual ::oox::drawingml::chart::ChartConverter& getChartConverter(); + +private: + virtual ::rtl::OUString implGetImplementationName() const; +}; + +// ============================================================================ + +class ExcelBiffFilter : public ::oox::core::BinaryFilterBase, public ExcelFilterBase +{ +public: + explicit ExcelBiffFilter( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxGlobalFactory ); + virtual ~ExcelBiffFilter(); + + virtual bool importDocument() throw(); + virtual bool exportDocument() throw(); + + virtual sal_Int32 getPaletteColor( sal_Int32 nPaletteIdx ) const; + +private: + virtual ::rtl::OUString implGetImplementationName() const; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/excelhandlers.hxx b/oox/inc/oox/xls/excelhandlers.hxx new file mode 100644 index 000000000000..986f42aadba4 --- /dev/null +++ b/oox/inc/oox/xls/excelhandlers.hxx @@ -0,0 +1,386 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_EXCELHANDLERS_HXX +#define OOX_XLS_EXCELHANDLERS_HXX + +#include "oox/core/fragmenthandler2.hxx" +#include "oox/xls/worksheethelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ +// ============================================================================ + +/** Context handler derived from the WorkbookHelper helper class. + + Used to import contexts in global workbook fragments. + */ +class OoxWorkbookContextBase : public ::oox::core::ContextHandler2, public WorkbookHelper +{ +public: + template< typename ParentType > + explicit OoxWorkbookContextBase( ParentType& rParent ); +}; + +// ---------------------------------------------------------------------------- + +template< typename ParentType > +OoxWorkbookContextBase::OoxWorkbookContextBase( ParentType& rParent ) : + ::oox::core::ContextHandler2( rParent ), + WorkbookHelper( rParent ) +{ +} + +// ============================================================================ + +/** Context handler derived from the WorksheetHelper helper class. + + Used to import contexts in sheet fragments. + */ +class OoxWorksheetContextBase : public ::oox::core::ContextHandler2, public WorksheetHelperRoot +{ +public: + template< typename ParentType > + explicit OoxWorksheetContextBase( + ParentType& rParent, + ISegmentProgressBarRef xProgressBar, + WorksheetType eSheetType, + sal_Int16 nSheet ); + + template< typename ParentType > + explicit OoxWorksheetContextBase( ParentType& rParent ); +}; + +// ---------------------------------------------------------------------------- + +template< typename ParentType > +OoxWorksheetContextBase::OoxWorksheetContextBase( ParentType& rParent, + ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : + ::oox::core::ContextHandler2( rParent ), + WorksheetHelperRoot( rParent, xProgressBar, eSheetType, nSheet ) +{ +} + +template< typename ParentType > +OoxWorksheetContextBase::OoxWorksheetContextBase( ParentType& rParent ) : + ::oox::core::ContextHandler2( rParent ), + WorksheetHelperRoot( rParent ) +{ +} + +// ============================================================================ + +/** Fragment handler derived from the WorkbookHelper helper class. + + Used to import global workbook fragments. + */ +class OoxWorkbookFragmentBase : public ::oox::core::FragmentHandler2, public WorkbookHelper +{ +public: + explicit OoxWorkbookFragmentBase( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); +}; + +// ============================================================================ + +/** Fragment handler derived from the WorksheetHelper helper class. + + Used to import sheet fragments. + */ +class OoxWorksheetFragmentBase : public ::oox::core::FragmentHandler2, public WorksheetHelperRoot +{ +public: + explicit OoxWorksheetFragmentBase( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath, + ISegmentProgressBarRef xProgressBar, + WorksheetType eSheetType, + sal_Int16 nSheet ); + + explicit OoxWorksheetFragmentBase( + const WorksheetHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); +}; + +// ============================================================================ +// ============================================================================ + +/** An enumeration for all types of fragments in a BIFF workbook stream. */ +enum BiffFragmentType +{ + BIFF_FRAGMENT_GLOBALS, /// Workbook globals fragment. + BIFF_FRAGMENT_WORKSHEET, /// Worksheet fragment. + BIFF_FRAGMENT_CHARTSHEET, /// Chart sheet fragment. + BIFF_FRAGMENT_MACROSHEET, /// Macro sheet fragment. + BIFF_FRAGMENT_MODULESHEET, /// BIFF5 VB module fragment. + BIFF_FRAGMENT_EMPTYSHEET, /// Sheet fragment of unsupported type. + BIFF_FRAGMENT_WORKSPACE, /// BIFF4 workspace/workbook globals. + BIFF_FRAGMENT_UNKNOWN /// Unknown fragment/error. +}; + +// ============================================================================ + +/** Base class for all BIFF context handlers and fragment handlers. + + This base class holds a reference to the BIFF input stream which can be + accessed in all derived classes. + */ +class BiffHandlerBase +{ +protected: + inline explicit BiffHandlerBase( BiffInputStream& rStrm ) : mrStrm( rStrm ) {} + virtual ~BiffHandlerBase(); + + /** Skips a block of records up to the specified end record. + + Skips all records until next end record. When this function returns, + stream points to the end record, and the next call of startNextRecord() + at the stream will start the record following the end record. + + The identifier of the record that is active while this function is + called is used as start record identifier. This identifier is used to + correctly skip embedded record blocks with the same start and end + record identifier. + + @return True = stream points to the end record. + */ + bool skipRecordBlock( sal_uInt16 nEndRecId ); + + /** @return True = current record identifier is a BOF record. */ + bool isBofRecord() const; + +protected: + BiffInputStream& mrStrm; +}; + +// ============================================================================ + +/** Base class for all BIFF context handlers. + + Derived handlers have to implement the importRecord() function that has to + import the record the BIFF input stream currently points to. + */ +class BiffContextHandler : public BiffHandlerBase +{ +public: + /** Derived classes have to implement importing the current record. */ + virtual void importRecord() = 0; + +protected: + explicit BiffContextHandler( const BiffHandlerBase& rParent ); +}; + +// ============================================================================ + +/** Context handler derived from the WorkbookHelper helper class. + + Used to import contexts in global workbook fragments. + */ +class BiffWorkbookContextBase : public BiffContextHandler, public WorkbookHelper +{ +protected: + template< typename ParentType > + explicit BiffWorkbookContextBase( const ParentType& rParent ); +}; + +// ---------------------------------------------------------------------------- + +template< typename ParentType > +BiffWorkbookContextBase::BiffWorkbookContextBase( const ParentType& rParent ) : + BiffContextHandler( rParent ), + WorkbookHelper( rParent ) +{ +} + +// ============================================================================ + +/** Context handler derived from the WorksheetHelper helper class. + + Used to import contexts in sheet fragments. + */ +class BiffWorksheetContextBase : public BiffContextHandler, public WorksheetHelperRoot +{ +protected: + template< typename ParentType > + explicit BiffWorksheetContextBase( + const ParentType& rParent, + ISegmentProgressBarRef xProgressBar, + WorksheetType eSheetType, + sal_Int16 nSheet ); + + template< typename ParentType > + explicit BiffWorksheetContextBase( const ParentType& rParent ); +}; + +// ---------------------------------------------------------------------------- + +template< typename ParentType > +BiffWorksheetContextBase::BiffWorksheetContextBase( const ParentType& rParent, + ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : + BiffContextHandler( rParent ), + WorksheetHelperRoot( rParent, xProgressBar, eSheetType, nSheet ) +{ +} + +template< typename ParentType > +BiffWorksheetContextBase::BiffWorksheetContextBase( const ParentType& rParent ) : + BiffContextHandler( rParent ), + WorksheetHelperRoot( rParent ) +{ +} + +// ============================================================================ + +namespace prv { + +struct BiffFragmentStreamOwner +{ + typedef ::boost::shared_ptr< BinaryXInputStream > XInputStreamRef; + typedef ::boost::shared_ptr< BiffInputStream > BiffInputStreamRef; + + XInputStreamRef mxXInStrm; + BiffInputStreamRef mxBiffStrm; + + explicit BiffFragmentStreamOwner( const ::oox::core::FilterBase& rFilter, const ::rtl::OUString& rStrmName ); + virtual ~BiffFragmentStreamOwner(); +}; + +} // namespace prv + +// ---------------------------------------------------------------------------- + +class BiffFragmentHandler : private prv::BiffFragmentStreamOwner, public BiffHandlerBase +{ +public: + /** Imports the fragment, returns true, if EOF record has been reached. */ + virtual bool importFragment() = 0; + +protected: + /** Opens the stream with the passed full name. */ + explicit BiffFragmentHandler( + const ::oox::core::FilterBase& rFilter, + const ::rtl::OUString& rStrmName ); + + /** Reuses the stream of the passed fragment. */ + explicit BiffFragmentHandler( const BiffFragmentHandler& rHandler ); + + /** Starts a new fragment in a workbbok stream and returns the fragment type. + + The passed stream must point before a BOF record. The function will + try to start the next record and read the contents of the BOF record, + if extant. + + @return Fragment type according to the imported BOF record. + */ + BiffFragmentType startFragment( BiffType eBiff ); + + /** Starts a new fragment at a specific position in the workbbok stream and + returns the fragment type. + + The passed record handle must specify the stream position of the BOF + record of the fragment substream. The function will try to start the + next record and read the contents of the BOF record, if extant. + + @return Fragment type according to the imported BOF record. + */ + BiffFragmentType startFragment( BiffType eBiff, sal_Int64 nRecHandle ); + + /** Skips the current fragment up to its trailing EOF record. + + Skips all records until next EOF record. When this function returns, + stream points to the EOF record, and the next call of startNextRecord() + at the stream will start the record following the EOF record. + + Embedded fragments enclosed in BOF/EOF records (e.g. embedded chart + objects) are skipped correctly. + + @return True = stream points to the EOF record of the current fragment. + */ + bool skipFragment(); + +private: + /** Implementation helper for the startFragment() functions. */ + BiffFragmentType implStartFragment( BiffType eBiff ); +}; + +// ============================================================================ + +/** Fragment handler derived from the WorkbookHelper helper class. + + Used to import global workbook fragments. + */ +class BiffWorkbookFragmentBase : public BiffFragmentHandler, public WorkbookHelper +{ +protected: + explicit BiffWorkbookFragmentBase( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rStrmName, + bool bCloneDecoder = false ); +}; + +// ============================================================================ + +/** Fragment handler derived from the WorksheetHelper helper class. + + Used to import sheet fragments. + */ +class BiffWorksheetFragmentBase : public BiffFragmentHandler, public WorksheetHelperRoot +{ +protected: + explicit BiffWorksheetFragmentBase( + const BiffWorkbookFragmentBase& rParent, + ISegmentProgressBarRef xProgressBar, + WorksheetType eSheetType, + sal_Int16 nSheet ); +}; + +// ============================================================================ + +/** Special fragment handler for worksheets that have to be skipped. + */ +class BiffSkipWorksheetFragment : public BiffWorksheetFragmentBase +{ +public: + explicit BiffSkipWorksheetFragment( + const BiffWorkbookFragmentBase& rParent, + ISegmentProgressBarRef xProgressBar, + sal_Int16 nSheet ); + + virtual bool importFragment(); +}; + +// ============================================================================ +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/externallinkbuffer.hxx b/oox/inc/oox/xls/externallinkbuffer.hxx new file mode 100644 index 000000000000..b9980cc21e2f --- /dev/null +++ b/oox/inc/oox/xls/externallinkbuffer.hxx @@ -0,0 +1,401 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_EXTERNALLINKBUFFER_HXX +#define OOX_XLS_EXTERNALLINKBUFFER_HXX + +#include <com/sun/star/sheet/ExternalLinkInfo.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/defnamesbuffer.hxx" + +namespace com { namespace sun { namespace star { + namespace sheet { struct DDEItemInfo; } + namespace sheet { class XDDELink; } + namespace sheet { class XExternalDocLink; } + namespace sheet { class XExternalSheetCache; } +} } } + +namespace oox { namespace core { + class Relations; +} } + +namespace oox { +namespace xls { + +// ============================================================================ + +struct ExternalNameModel +{ + bool mbBuiltIn; /// Name is a built-in name. + bool mbNotify; /// Notify application on data change. + bool mbPreferPic; /// Picture link. + bool mbStdDocName; /// Name is the StdDocumentName for DDE. + bool mbOleObj; /// Name is an OLE object. + bool mbIconified; /// Iconified object link. + + explicit ExternalNameModel(); +}; + +// ============================================================================ + +class ExternalLink; + +class ExternalName : public DefinedNameBase +{ +public: + explicit ExternalName( const ExternalLink& rParentLink ); + + /** Appends the passed value to the result set. */ + template< typename Type > + inline void appendResultValue( const Type& rValue ) + { if( maCurrIt != maResults.end() ) (*maCurrIt++) <<= rValue; } + + /** Imports the definedName element. */ + void importDefinedName( const AttributeList& rAttribs ); + /** Imports the ddeItem element describing an item of a DDE link. */ + void importDdeItem( const AttributeList& rAttribs ); + /** Imports the values element containing the size of the DDE result matrix. */ + void importValues( const AttributeList& rAttribs ); + /** Imports the oleItem element describing an object of an OLE link. */ + void importOleItem( const AttributeList& rAttribs ); + + /** Imports the EXTERNALNAME record containing the name (only). */ + void importExternalName( RecordInputStream& rStrm ); + /** Imports the EXTERNALNAMEFLAGS record containing the settings of an external name. */ + void importExternalNameFlags( RecordInputStream& rStrm ); + /** Imports the DDEITEMVALUES record containing the size of the DDE result matrix. */ + void importDdeItemValues( RecordInputStream& rStrm ); + /** Imports the DDEITEM_BOOL record containing a boolean value in a link result. */ + void importDdeItemBool( RecordInputStream& rStrm ); + /** Imports the DDEITEM_DOUBLE record containing a double value in a link result. */ + void importDdeItemDouble( RecordInputStream& rStrm ); + /** Imports the DDEITEM_ERROR record containing an error code in a link result. */ + void importDdeItemError( RecordInputStream& rStrm ); + /** Imports the DDEITEM_STRING record containing a string in a link result. */ + void importDdeItemString( RecordInputStream& rStrm ); + + /** Imports the EXTERNALNAME record from the passed stream. */ + void importExternalName( BiffInputStream& rStrm ); + + /** Returns true, if the name refers to an OLE object. */ + inline bool isOleObject() const { return maExtNameModel.mbOleObj; } + +#if 0 + /** Returns the sheet cache index if this is a sheet-local external name. */ + sal_Int32 getSheetCacheIndex() const; +#endif + + /** Returns the DDE item info needed by the XML formula parser. */ + bool getDdeItemInfo( + ::com::sun::star::sheet::DDEItemInfo& orItemInfo ) const; + + /** Returns the complete DDE link data of this DDE item. */ + bool getDdeLinkData( + ::rtl::OUString& orDdeServer, + ::rtl::OUString& orDdeTopic, + ::rtl::OUString& orDdeItem ); + +private: + /** Tries to convert the passed token sequence to an ExternalReference. */ + void extractExternalReference( const ApiTokenSequence& rTokens ); + /** Sets the size of the result matrix. */ + void setResultSize( sal_Int32 nColumns, sal_Int32 nRows ); + +private: + typedef Matrix< ::com::sun::star::uno::Any > ResultMatrix; + + const ExternalLink& mrParentLink; /// External link this name belongs to. + ExternalNameModel maExtNameModel; /// Additional name data. + ResultMatrix maResults; /// DDE/OLE link results. + ResultMatrix::iterator maCurrIt; /// Current position in result matrix. + sal_uInt32 mnStorageId; /// OLE storage identifier (BIFF). + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDDELink > + mxDdeLink; /// Interface of a DDE link. + bool mbDdeLinkCreated; /// True = already tried to create the DDE link. +}; + +typedef ::boost::shared_ptr< ExternalName > ExternalNameRef; + +// ============================================================================ + +/** Contains indexes for a range of sheets in the spreadsheet document. */ +class LinkSheetRange +{ +public: + inline explicit LinkSheetRange() { setDeleted(); } + inline explicit LinkSheetRange( sal_Int32 nFirst, sal_Int32 nLast ) { setRange( nFirst, nLast ); } + inline explicit LinkSheetRange( sal_Int32 nDocLink, sal_Int32 nFirst, sal_Int32 nLast ) { setExternalRange( nDocLink, nFirst, nLast ); } + + /** Sets this struct to deleted state. */ + void setDeleted(); + /** Sets this struct to "use current sheet" state. */ + void setSameSheet(); + /** Sets the passed absolute sheet range to the members of this struct. */ + void setRange( sal_Int32 nFirst, sal_Int32 nLast ); + /** Sets the passed external sheet cache range to the members of this struct. */ + void setExternalRange( sal_Int32 nDocLink, sal_Int32 nFirst, sal_Int32 nLast ); + + /** Returns true, if the sheet indexes are valid and different. */ + inline bool isDeleted() const { return mnFirst < 0; } + /** Returns true, if the sheet range points to an external document. */ + inline bool isExternal() const { return !isDeleted() && (meType == LINKSHEETRANGE_EXTERNAL); } + /** Returns true, if the sheet indexes are valid and different. */ + inline bool isSameSheet() const { return meType == LINKSHEETRANGE_SAMESHEET; } + /** Returns true, if the sheet indexes are valid and different. */ + inline bool is3dRange() const { return (0 <= mnFirst) && (mnFirst < mnLast); } + + inline sal_Int32 getDocLinkIndex() const { return mnDocLink; } + inline sal_Int32 getFirstSheet() const { return mnFirst; } + inline sal_Int32 getLastSheet() const { return mnLast; } + +private: + enum LinkSheetRangeType + { + LINKSHEETRANGE_INTERNAL, /// Sheet range in the own document. + LINKSHEETRANGE_EXTERNAL, /// Sheet range in an external document. + LINKSHEETRANGE_SAMESHEET /// Current sheet depending on context. + }; + + LinkSheetRangeType meType; /// Link sheet range type. + sal_Int32 mnDocLink; /// Document link token index for external links. + sal_Int32 mnFirst; /// Index of the first sheet or index of first external sheet cache. + sal_Int32 mnLast; /// Index of the last sheet or index of last external sheet cache. +}; + +// ============================================================================ + +enum ExternalLinkType +{ + LINKTYPE_SELF, /// Link refers to the current workbook. + LINKTYPE_SAME, /// Link refers to the current sheet. + LINKTYPE_INTERNAL, /// Link refers to a sheet in the own workbook. + LINKTYPE_EXTERNAL, /// Link refers to an external spreadsheet document. + LINKTYPE_ANALYSIS, /// Link refers to the Analysis add-in. + LINKTYPE_LIBRARY, /// Link refers to an external add-in. + LINKTYPE_DDE, /// DDE link. + LINKTYPE_OLE, /// OLE link. + LINKTYPE_MAYBE_DDE_OLE, /// Could be DDE or OLE link (BIFF only). + LINKTYPE_UNKNOWN /// Unknown or unsupported link type. +}; + +// ---------------------------------------------------------------------------- + +class ExternalLink : public WorkbookHelper +{ +public: + explicit ExternalLink( const WorkbookHelper& rHelper ); + + /** Imports the externalReference element containing the relation identifier. */ + void importExternalReference( const AttributeList& rAttribs ); + /** Imports the externalBook element describing an externally linked document. */ + void importExternalBook( const ::oox::core::Relations& rRelations, const AttributeList& rAttribs ); + /** Imports the sheetName element containing the sheet name in an externally linked document. */ + void importSheetName( const AttributeList& rAttribs ); + /** Imports the definedName element describing an external name. */ + void importDefinedName( const AttributeList& rAttribs ); + /** Imports the ddeLink element describing a DDE link. */ + void importDdeLink( const AttributeList& rAttribs ); + /** Imports the ddeItem element describing an item of a DDE link. */ + ExternalNameRef importDdeItem( const AttributeList& rAttribs ); + /** Imports the oleLink element describing an OLE link. */ + void importOleLink( const ::oox::core::Relations& rRelations, const AttributeList& rAttribs ); + /** Imports the oleItem element describing an object of an OLE link. */ + ExternalNameRef importOleItem( const AttributeList& rAttribs ); + + /** Imports the EXTERNALBOOK record describing an externally linked document, DDE link, or OLE link. */ + void importExternalBook( const ::oox::core::Relations& rRelations, RecordInputStream& rStrm ); + /** Imports the EXTSHEETNAMES record containing the sheet names in an externally linked document. */ + void importExtSheetNames( RecordInputStream& rStrm ); + /** Imports the EXTERNALNAME record describing an external name. */ + ExternalNameRef importExternalName( RecordInputStream& rStrm ); + /** Imports the EXTERNALREF record from the passed stream. */ + void importExternalRef( RecordInputStream& rStrm ); + /** Imports the EXTERNALSELF record from the passed stream. */ + void importExternalSelf( RecordInputStream& rStrm ); + /** Imports the EXTERNALSAME record from the passed stream. */ + void importExternalSame( RecordInputStream& rStrm ); + /** Imports the EXTERNALADDIN record from the passed stream. */ + void importExternalAddin( RecordInputStream& rStrm ); + + /** Imports the EXTERNSHEET record from the passed stream. */ + void importExternSheet( BiffInputStream& rStrm ); + /** Imports the EXTERNALBOOK record from the passed stream. */ + void importExternalBook( BiffInputStream& rStrm ); + /** Imports the EXTERNALNAME record from the passed stream. */ + void importExternalName( BiffInputStream& rStrm ); + + /** Returns the type of this external link. */ + inline ExternalLinkType getLinkType() const { return meLinkType; } + /** Returns true, if the link refers to the current workbook. */ + inline bool isInternalLink() const { return (meLinkType == LINKTYPE_SELF) || (meLinkType == LINKTYPE_INTERNAL); } + + /** Returns the relation identifier for the external link fragment. */ + inline const ::rtl::OUString& getRelId() const { return maRelId; } + /** Returns the class name of this external link. */ + inline const ::rtl::OUString& getClassName() const { return maClassName; } + /** Returns the target URL of this external link. */ + inline const ::rtl::OUString& getTargetUrl() const { return maTargetUrl; } + /** Returns the link info needed by the XML formula parser. */ + ::com::sun::star::sheet::ExternalLinkInfo getLinkInfo() const; + + /** Returns the type of the external library if this is a library link. */ + FunctionLibraryType getFuncLibraryType() const; + + /** Returns the internal Calc sheet index or for the passed sheet. */ + sal_Int16 getCalcSheetIndex( sal_Int32 nTabId = 0 ) const; + + /** Returns the token index of the external document. */ + sal_Int32 getDocumentLinkIndex() const; + /** Returns the external sheet cache index or for the passed sheet. */ + sal_Int32 getSheetCacheIndex( sal_Int32 nTabId = 0 ) const; + /** Returns the sheet cache of the external sheet with the passed index. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XExternalSheetCache > + getSheetCache( sal_Int32 nTabId ) const; + + /** Returns the internal sheet range or range of external sheet caches for the passed sheet range (BIFF only). */ + void getSheetRange( LinkSheetRange& orSheetRange, sal_Int32 nTabId1, sal_Int32 nTabId2 ) const; + + /** Returns the external name with the passed zero-based index. */ + ExternalNameRef getNameByIndex( sal_Int32 nIndex ) const; + +private: + void setExternalTargetUrl( const ::rtl::OUString& rTargetUrl, const ::rtl::OUString& rTargetType ); + void setDdeOleTargetUrl( const ::rtl::OUString& rClassName, const ::rtl::OUString& rTargetUrl, ExternalLinkType eLinkType ); + void parseExternalReference( const ::oox::core::Relations& rRelations, const ::rtl::OUString& rRelId ); + ::rtl::OUString parseBiffTargetUrl( const ::rtl::OUString& rBiffTargetUrl ); + + /** Creates an external locument link and the sheet cache for the passed sheet name. */ + void insertExternalSheet( const ::rtl::OUString& rSheetName ); + + ExternalNameRef createExternalName(); + +private: + typedef ::std::vector< sal_Int16 > Int16Vector; + typedef ::std::vector< sal_Int32 > Int32Vector; + typedef RefVector< ExternalName > ExternalNameVector; + + ExternalLinkType meLinkType; /// Type of this link object. + FunctionLibraryType meFuncLibType; /// Type of the function library, if link type is LINKTYPE_LIBRARY. + ::rtl::OUString maRelId; /// Relation identifier for the external link fragment. + ::rtl::OUString maClassName; /// DDE service, OLE class name. + ::rtl::OUString maTargetUrl; /// Target link, DDE topic, OLE target. + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XExternalDocLink > + mxDocLink; /// Interface for an external document. + Int16Vector maCalcSheets; /// Internal sheet indexes. + Int32Vector maSheetCaches; /// External sheet cache indexes. + ExternalNameVector maExtNames; /// Defined names in external document. +}; + +typedef ::boost::shared_ptr< ExternalLink > ExternalLinkRef; + +// ============================================================================ + +/** Represents a REF entry in the OOBIN EXTERNALSHEETS or in the BIFF8 + EXTERNSHEET record. + + This struct is used to map ref identifiers to external books (OOBIN: + EXTERNALREF records, BIFF8: EXTERNALBOOK records), and provides sheet + indexes into the sheet list of the external document. + */ +struct RefSheetsModel +{ + sal_Int32 mnExtRefId; /// Zero-based index into list of external documents. + sal_Int32 mnTabId1; /// Zero-based index to first sheet in external document. + sal_Int32 mnTabId2; /// Zero-based index to last sheet in external document. + + explicit RefSheetsModel(); + + void readOobData( RecordInputStream& rStrm ); + void readBiff8Data( BiffInputStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +class ExternalLinkBuffer : public WorkbookHelper +{ +public: + explicit ExternalLinkBuffer( const WorkbookHelper& rHelper ); + + /** Imports the externalReference element containing . */ + ExternalLinkRef importExternalReference( const AttributeList& rAttribs ); + + /** Imports the EXTERNALREF record from the passed stream. */ + ExternalLinkRef importExternalRef( RecordInputStream& rStrm ); + /** Imports the EXTERNALSELF record from the passed stream. */ + void importExternalSelf( RecordInputStream& rStrm ); + /** Imports the EXTERNALSAME record from the passed stream. */ + void importExternalSame( RecordInputStream& rStrm ); + /** Imports the EXTERNALADDIN record from the passed stream. */ + void importExternalAddin( RecordInputStream& rStrm ); + /** Imports the EXTERNALSHEETS record from the passed stream. */ + void importExternalSheets( RecordInputStream& rStrm ); + + /** Imports the EXTERNSHEET record from the passed stream. */ + ExternalLinkRef importExternSheet( BiffInputStream& rStrm ); + /** Imports the EXTERNALBOOK record from the passed stream. */ + ExternalLinkRef importExternalBook( BiffInputStream& rStrm ); + /** Imports the EXTERNALNAME record from the passed stream. */ + void importExternalName( BiffInputStream& rStrm ); + /** Imports the BIFF8 EXTERNSHEET record from the passed stream. */ + void importExternSheet8( BiffInputStream& rStrm ); + + /** Returns the sequence of link infos needed by the XML formula parser. */ + ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::ExternalLinkInfo > + getLinkInfos() const; + + /** Returns the external link for the passed reference identifier. */ + ExternalLinkRef getExternalLink( sal_Int32 nRefId ) const; + + /** Returns the sheet range for the specified reference (BIFF2-BIFF5 only). */ + LinkSheetRange getSheetRange( sal_Int32 nRefId, sal_Int16 nTabId1, sal_Int16 nTabId2 ) const; + /** Returns the sheet range for the specified reference (BIFF8 only). */ + LinkSheetRange getSheetRange( sal_Int32 nRefId ) const; + +private: + /** Creates a new external link and inserts it into the list of links. */ + ExternalLinkRef createExternalLink(); + + /** Returns the specified sheet indexes for a reference identifier. */ + const RefSheetsModel* getRefSheets( sal_Int32 nRefId ) const; + +private: + typedef RefVector< ExternalLink > ExternalLinkVec; + typedef ::std::vector< RefSheetsModel > RefSheetsModelVec; + + ExternalLinkVec maLinks; /// List of link structures for all kinds of links. + ExternalLinkVec maExtLinks; /// Real external links needed for formula parser. + RefSheetsModelVec maRefSheets; /// Sheet indexes for reference ids. + bool mbUseRefSheets; /// True = use maRefSheets list (OOBIN only). +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/externallinkfragment.hxx b/oox/inc/oox/xls/externallinkfragment.hxx new file mode 100644 index 000000000000..ec310974818a --- /dev/null +++ b/oox/inc/oox/xls/externallinkfragment.hxx @@ -0,0 +1,159 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_EXTERNALLINKFRAGMENT_HXX +#define OOX_XLS_EXTERNALLINKFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" +#include "oox/xls/externallinkbuffer.hxx" + +namespace oox { +namespace xls { + +class ExternalLink; + +// ============================================================================ + +/** This class implements importing the sheetData element in external sheets. + + The sheetData element embedded in the externalBook element contains cached + cells from externally linked sheets. + */ +class OoxExternalSheetDataContext : public OoxWorkbookContextBase +{ +public: + explicit OoxExternalSheetDataContext( + OoxWorkbookFragmentBase& rFragment, + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XExternalSheetCache >& rxSheetCache ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + +private: + /** Imports cell settings from a c element. */ + void importCell( const AttributeList& rAttribs ); + + /** Imports the EXTCELL_BLANK from the passed stream. */ + void importExtCellBlank( RecordInputStream& rStrm ); + /** Imports the EXTCELL_BOOL from the passed stream. */ + void importExtCellBool( RecordInputStream& rStrm ); + /** Imports the EXTCELL_DOUBLE from the passed stream. */ + void importExtCellDouble( RecordInputStream& rStrm ); + /** Imports the EXTCELL_ERROR from the passed stream. */ + void importExtCellError( RecordInputStream& rStrm ); + /** Imports the EXTCELL_STRING from the passed stream. */ + void importExtCellString( RecordInputStream& rStrm ); + + /** Sets the passed cell value to the current position in the sheet cache. */ + void setCellValue( const ::com::sun::star::uno::Any& rValue ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XExternalSheetCache > + mxSheetCache; /// The sheet cache used to store external cell values. + ::com::sun::star::table::CellAddress maCurrPos; /// Position of current cell. + sal_Int32 mnCurrType; /// Data type of current cell. +}; + +// ============================================================================ + +class OoxExternalLinkFragment : public OoxWorkbookFragmentBase +{ +public: + explicit OoxExternalLinkFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath, + ExternalLink& rExtLink ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + +private: + ::oox::core::ContextHandlerRef createSheetDataContext( sal_Int32 nSheetId ); + +private: + ExternalLink& mrExtLink; + ExternalNameRef mxExtName; + ::rtl::OUString maResultValue; + sal_Int32 mnResultType; +}; + +// ============================================================================ + +class BiffExternalLinkFragment : public BiffWorkbookFragmentBase +{ +public: + explicit BiffExternalLinkFragment( const BiffWorkbookFragmentBase& rParent, bool bImportDefNames ); + virtual ~BiffExternalLinkFragment(); + + /** Imports all records related to external links. */ + virtual bool importFragment(); + + /** Tries to import a record related to external links and defined names. */ + void importRecord(); + + /** Finalizes buffers related to external links and defined names. */ + void finalizeImport(); + +private: + void importExternSheet(); + void importExternalBook(); + void importExternalName(); + void importXct(); + void importCrn(); + void importDefinedName(); + + /** Sets the passed cell value to the passed position in the sheet cache. */ + void setCellValue( const BinAddress& rBinAddr, const ::com::sun::star::uno::Any& rValue ); + +private: + ExternalLinkRef mxExtLink; /// Current external link. + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XExternalSheetCache > + mxSheetCache; /// The sheet cache used to store external cell values. + bool mbImportDefNames; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/formulabase.hxx b/oox/inc/oox/xls/formulabase.hxx new file mode 100644 index 000000000000..510404d2b662 --- /dev/null +++ b/oox/inc/oox/xls/formulabase.hxx @@ -0,0 +1,936 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_FORMULABASE_HXX +#define OOX_XLS_FORMULABASE_HXX + +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/table/CellAddress.hpp> +#include <com/sun/star/table/CellRangeAddress.hpp> +#include <com/sun/star/sheet/FormulaToken.hpp> +#include <com/sun/star/sheet/FormulaOpCodeMapEntry.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/helper/propertyset.hxx" +#include "oox/xls/addressconverter.hxx" + +namespace com { namespace sun { namespace star { + namespace sheet { class XFormulaParser; } + namespace sheet { class XFormulaTokens; } + namespace sheet { class XFormulaOpCodeMapper; } +} } } + +namespace oox { template< typename Type > class Matrix; } + +namespace oox { +namespace xls { + +// Constants ================================================================== + +const size_t BIFF_TOKARR_MAXLEN = 4096; /// Maximum size of a token array. + +// token class flags ---------------------------------------------------------- + +const sal_uInt8 BIFF_TOKCLASS_MASK = 0x60; +const sal_uInt8 BIFF_TOKCLASS_NONE = 0x00; /// 00-1F: Base tokens. +const sal_uInt8 BIFF_TOKCLASS_REF = 0x20; /// 20-3F: Reference class tokens. +const sal_uInt8 BIFF_TOKCLASS_VAL = 0x40; /// 40-5F: Value class tokens. +const sal_uInt8 BIFF_TOKCLASS_ARR = 0x60; /// 60-7F: Array class tokens. + +const sal_uInt8 BIFF_TOKFLAG_INVALID = 0x80; /// This bit must be null for a valid token identifier. + +// base token identifiers ----------------------------------------------------- + +const sal_uInt8 BIFF_TOKID_MASK = 0x1F; + +const sal_uInt8 BIFF_TOKID_NONE = 0x00; /// Placeholder for invalid token id. +const sal_uInt8 BIFF_TOKID_EXP = 0x01; /// Array or shared formula reference. +const sal_uInt8 BIFF_TOKID_TBL = 0x02; /// Multiple operation reference. +const sal_uInt8 BIFF_TOKID_ADD = 0x03; /// Addition operator. +const sal_uInt8 BIFF_TOKID_SUB = 0x04; /// Subtraction operator. +const sal_uInt8 BIFF_TOKID_MUL = 0x05; /// Multiplication operator. +const sal_uInt8 BIFF_TOKID_DIV = 0x06; /// Division operator. +const sal_uInt8 BIFF_TOKID_POWER = 0x07; /// Power operator. +const sal_uInt8 BIFF_TOKID_CONCAT = 0x08; /// String concatenation operator. +const sal_uInt8 BIFF_TOKID_LT = 0x09; /// Less than operator. +const sal_uInt8 BIFF_TOKID_LE = 0x0A; /// Less than or equal operator. +const sal_uInt8 BIFF_TOKID_EQ = 0x0B; /// Equal operator. +const sal_uInt8 BIFF_TOKID_GE = 0x0C; /// Greater than or equal operator. +const sal_uInt8 BIFF_TOKID_GT = 0x0D; /// Greater than operator. +const sal_uInt8 BIFF_TOKID_NE = 0x0E; /// Not equal operator. +const sal_uInt8 BIFF_TOKID_ISECT = 0x0F; /// Intersection operator. +const sal_uInt8 BIFF_TOKID_LIST = 0x10; /// List operator. +const sal_uInt8 BIFF_TOKID_RANGE = 0x11; /// Range operator. +const sal_uInt8 BIFF_TOKID_UPLUS = 0x12; /// Unary plus. +const sal_uInt8 BIFF_TOKID_UMINUS = 0x13; /// Unary minus. +const sal_uInt8 BIFF_TOKID_PERCENT = 0x14; /// Percent sign. +const sal_uInt8 BIFF_TOKID_PAREN = 0x15; /// Parentheses. +const sal_uInt8 BIFF_TOKID_MISSARG = 0x16; /// Missing argument. +const sal_uInt8 BIFF_TOKID_STR = 0x17; /// String constant. +const sal_uInt8 BIFF_TOKID_NLR = 0x18; /// Natural language reference (NLR). +const sal_uInt8 BIFF_TOKID_ATTR = 0x19; /// Special attribute. +const sal_uInt8 BIFF_TOKID_SHEET = 0x1A; /// Start of a sheet reference (BIFF2-BIFF4). +const sal_uInt8 BIFF_TOKID_ENDSHEET = 0x1B; /// End of a sheet reference (BIFF2-BIFF4). +const sal_uInt8 BIFF_TOKID_ERR = 0x1C; /// Error constant. +const sal_uInt8 BIFF_TOKID_BOOL = 0x1D; /// Boolean constant. +const sal_uInt8 BIFF_TOKID_INT = 0x1E; /// Integer constant. +const sal_uInt8 BIFF_TOKID_NUM = 0x1F; /// Floating-point constant. + +// base identifiers of classified tokens -------------------------------------- + +const sal_uInt8 BIFF_TOKID_ARRAY = 0x00; /// Array constant. +const sal_uInt8 BIFF_TOKID_FUNC = 0x01; /// Function, fixed number of arguments. +const sal_uInt8 BIFF_TOKID_FUNCVAR = 0x02; /// Function, variable number of arguments. +const sal_uInt8 BIFF_TOKID_NAME = 0x03; /// Defined name. +const sal_uInt8 BIFF_TOKID_REF = 0x04; /// 2D cell reference. +const sal_uInt8 BIFF_TOKID_AREA = 0x05; /// 2D area reference. +const sal_uInt8 BIFF_TOKID_MEMAREA = 0x06; /// Constant reference subexpression. +const sal_uInt8 BIFF_TOKID_MEMERR = 0x07; /// Deleted reference subexpression. +const sal_uInt8 BIFF_TOKID_MEMNOMEM = 0x08; /// Constant reference subexpression without result. +const sal_uInt8 BIFF_TOKID_MEMFUNC = 0x09; /// Variable reference subexpression. +const sal_uInt8 BIFF_TOKID_REFERR = 0x0A; /// Deleted 2D cell reference. +const sal_uInt8 BIFF_TOKID_AREAERR = 0x0B; /// Deleted 2D area reference. +const sal_uInt8 BIFF_TOKID_REFN = 0x0C; /// Relative 2D cell reference (in names). +const sal_uInt8 BIFF_TOKID_AREAN = 0x0D; /// Relative 2D area reference (in names). +const sal_uInt8 BIFF_TOKID_MEMAREAN = 0x0E; /// Reference subexpression (in names). +const sal_uInt8 BIFF_TOKID_MEMNOMEMN = 0x0F; /// Reference subexpression (in names) without result. +const sal_uInt8 BIFF_TOKID_FUNCCE = 0x18; +const sal_uInt8 BIFF_TOKID_NAMEX = 0x19; /// External reference. +const sal_uInt8 BIFF_TOKID_REF3D = 0x1A; /// 3D cell reference. +const sal_uInt8 BIFF_TOKID_AREA3D = 0x1B; /// 3D area reference. +const sal_uInt8 BIFF_TOKID_REFERR3D = 0x1C; /// Deleted 3D cell reference. +const sal_uInt8 BIFF_TOKID_AREAERR3D = 0x1D; /// Deleted 3D area reference + +// specific token constants --------------------------------------------------- + +const sal_uInt8 OOBIN_TOK_ARRAY_DOUBLE = 0; +const sal_uInt8 OOBIN_TOK_ARRAY_STRING = 1; +const sal_uInt8 OOBIN_TOK_ARRAY_BOOL = 2; +const sal_uInt8 OOBIN_TOK_ARRAY_ERROR = 4; + +const sal_uInt8 BIFF_TOK_BOOL_FALSE = 0; /// FALSE value of a tBool token. +const sal_uInt8 BIFF_TOK_BOOL_TRUE = 1; /// TRUE value of a tBool token. + +const sal_uInt8 OOBIN_TOK_ATTR_VOLATILE = 0x01; /// Volatile function. +const sal_uInt8 OOBIN_TOK_ATTR_IF = 0x02; /// Start of true condition in IF function. +const sal_uInt8 OOBIN_TOK_ATTR_CHOOSE = 0x04; /// Jump array of CHOOSE function. +const sal_uInt8 OOBIN_TOK_ATTR_SKIP = 0x08; /// Skip tokens. +const sal_uInt8 OOBIN_TOK_ATTR_SUM = 0x10; /// SUM function with one parameter. +const sal_uInt8 OOBIN_TOK_ATTR_ASSIGN = 0x20; /// BASIC style assignment. +const sal_uInt8 OOBIN_TOK_ATTR_SPACE = 0x40; /// Spaces in formula representation. +const sal_uInt8 OOBIN_TOK_ATTR_SPACE_VOLATILE = 0x41; /// Leading spaces and volatile formula. +const sal_uInt8 OOBIN_TOK_ATTR_IFERROR = 0x80; /// Start of condition in IFERROR function. + +const sal_uInt8 BIFF_TOK_ATTR_VOLATILE = 0x01; /// Volatile function. +const sal_uInt8 BIFF_TOK_ATTR_IF = 0x02; /// Start of true condition in IF function. +const sal_uInt8 BIFF_TOK_ATTR_CHOOSE = 0x04; /// Jump array of CHOOSE function. +const sal_uInt8 BIFF_TOK_ATTR_SKIP = 0x08; /// Skip tokens. +const sal_uInt8 BIFF_TOK_ATTR_SUM = 0x10; /// SUM function with one parameter. +const sal_uInt8 BIFF_TOK_ATTR_ASSIGN = 0x20; /// BASIC style assignment. +const sal_uInt8 BIFF_TOK_ATTR_SPACE = 0x40; /// Spaces in formula representation. +const sal_uInt8 BIFF_TOK_ATTR_SPACE_VOLATILE = 0x41; /// Leading spaces and volatile formula. + +const sal_uInt8 BIFF_TOK_ATTR_SPACE_SP = 0x00; /// Spaces before next token. +const sal_uInt8 BIFF_TOK_ATTR_SPACE_BR = 0x01; /// Line breaks before next token. +const sal_uInt8 BIFF_TOK_ATTR_SPACE_SP_OPEN = 0x02; /// Spaces before opening parenthesis. +const sal_uInt8 BIFF_TOK_ATTR_SPACE_BR_OPEN = 0x03; /// Line breaks before opening parenthesis. +const sal_uInt8 BIFF_TOK_ATTR_SPACE_SP_CLOSE = 0x04; /// Spaces before closing parenthesis. +const sal_uInt8 BIFF_TOK_ATTR_SPACE_BR_CLOSE = 0x05; /// Line breaks before closing parenthesis. +const sal_uInt8 BIFF_TOK_ATTR_SPACE_SP_PRE = 0x06; /// Spaces before formula (BIFF3). + +const sal_uInt16 BIFF_TOK_FUNCVAR_CMD = 0x8000; /// Macro command. +const sal_uInt16 BIFF_TOK_FUNCVAR_FUNCIDMASK = 0x7FFF; /// Mask for function/command index. +const sal_uInt8 BIFF_TOK_FUNCVAR_CMDPROMPT = 0x80; /// User prompt for macro commands. +const sal_uInt8 BIFF_TOK_FUNCVAR_COUNTMASK = 0x7F; /// Mask for parameter count. + +const sal_uInt16 OOBIN_TOK_REF_COLMASK = 0x3FFF; /// Mask to extract column from reference. +const sal_Int32 OOBIN_TOK_REF_ROWMASK = 0xFFFFF; /// Mask to extract row from reference. +const sal_uInt16 OOBIN_TOK_REF_COLREL = 0x4000; /// True = column is relative. +const sal_uInt16 OOBIN_TOK_REF_ROWREL = 0x8000; /// True = row is relative. + +const sal_uInt16 BIFF_TOK_REF_COLMASK = 0x00FF; /// Mask to extract BIFF8 column from reference. +const sal_uInt16 BIFF_TOK_REF_ROWMASK = 0x3FFF; /// Mask to extract BIFF2-BIFF5 row from reference. +const sal_uInt16 BIFF_TOK_REF_COLREL = 0x4000; /// True = column is relative. +const sal_uInt16 BIFF_TOK_REF_ROWREL = 0x8000; /// True = row is relative. + +const sal_uInt16 OOBIN_TOK_TABLE_COLUMN = 0x0001; /// Table reference: Single column. +const sal_uInt16 OOBIN_TOK_TABLE_COLRANGE = 0x0002; /// Table reference: Range of columns. +const sal_uInt16 OOBIN_TOK_TABLE_ALL = 0x0004; /// Table reference: Special [#All] range. +const sal_uInt16 OOBIN_TOK_TABLE_HEADERS = 0x0008; /// Table reference: Special [#Headers] range. +const sal_uInt16 OOBIN_TOK_TABLE_DATA = 0x0010; /// Table reference: Special [#Data] range. +const sal_uInt16 OOBIN_TOK_TABLE_TOTALS = 0x0020; /// Table reference: Special [#Totals] range. +const sal_uInt16 OOBIN_TOK_TABLE_THISROW = 0x0040; /// Table reference: Special [#This Row] range. +const sal_uInt16 OOBIN_TOK_TABLE_SP_BRACKETS = 0x0080; /// Table reference: Spaces in outer brackets. +const sal_uInt16 OOBIN_TOK_TABLE_SP_SEP = 0x0100; /// Table reference: Spaces after separators. +const sal_uInt16 OOBIN_TOK_TABLE_ROW = 0x0200; /// Table reference: Single row. +const sal_uInt16 OOBIN_TOK_TABLE_CELL = 0x0400; /// Table reference: Single cell. + +const sal_uInt8 BIFF_TOK_NLR_ERR = 0x01; /// NLR: Invalid/deleted. +const sal_uInt8 BIFF_TOK_NLR_ROWR = 0x02; /// NLR: Row index. +const sal_uInt8 BIFF_TOK_NLR_COLR = 0x03; /// NLR: Column index. +const sal_uInt8 BIFF_TOK_NLR_ROWV = 0x06; /// NLR: Value in row. +const sal_uInt8 BIFF_TOK_NLR_COLV = 0x07; /// NLR: Value in column. +const sal_uInt8 BIFF_TOK_NLR_RANGE = 0x0A; /// NLR: Range. +const sal_uInt8 BIFF_TOK_NLR_SRANGE = 0x0B; /// Stacked NLR: Range. +const sal_uInt8 BIFF_TOK_NLR_SROWR = 0x0C; /// Stacked NLR: Row index. +const sal_uInt8 BIFF_TOK_NLR_SCOLR = 0x0D; /// Stacked NLR: Column index. +const sal_uInt8 BIFF_TOK_NLR_SROWV = 0x0E; /// Stacked NLR: Value in row. +const sal_uInt8 BIFF_TOK_NLR_SCOLV = 0x0F; /// Stacked NLR: Value in column. +const sal_uInt8 BIFF_TOK_NLR_RANGEERR = 0x10; /// NLR: Invalid/deleted range. +const sal_uInt8 BIFF_TOK_NLR_SXNAME = 0x1D; /// NLR: Pivot table name. +const sal_uInt16 BIFF_TOK_NLR_REL = 0x8000; /// True = NLR is relative. +const sal_uInt16 BIFF_TOK_NLR_MASK = 0x3FFF; /// Mask to extract BIFF8 column from NLR. + +const sal_uInt32 BIFF_TOK_NLR_ADDREL = 0x80000000; /// NLR relative (in appended data). +const sal_uInt32 BIFF_TOK_NLR_ADDMASK = 0x3FFFFFFF; /// Mask for number of appended ranges. + +// function constants --------------------------------------------------------- + +const sal_uInt8 OOX_MAX_PARAMCOUNT = 255; /// Maximum parameter count for OOXML/OOBIN files. +const sal_uInt8 BIFF_MAX_PARAMCOUNT = 30; /// Maximum parameter count for BIFF files. + +const sal_uInt16 OOBIN_FUNC_IF = 1; /// OOBIN function id of the IF function. +const sal_uInt16 OOBIN_FUNC_SUM = 4; /// OOBIN function id of the SUM function. +const sal_uInt16 OOBIN_FUNC_TRUE = 34; /// OOBIN function id of the TRUE function. +const sal_uInt16 OOBIN_FUNC_FALSE = 35; /// OOBIN function id of the FALSE function. +const sal_uInt16 OOBIN_FUNC_ROWS = 76; /// OOBIN function id of the ROWS function. +const sal_uInt16 OOBIN_FUNC_COLUMNS = 77; /// OOBIN function id of the COLUMNS function. +const sal_uInt16 OOBIN_FUNC_OFFSET = 78; /// OOBIN function id of the OFFSET function. +const sal_uInt16 OOBIN_FUNC_FLOOR = 285; /// OOBIN function id of the FLOOR function. +const sal_uInt16 OOBIN_FUNC_CEILING = 288; /// OOBIN function id of the CEILING function. +const sal_uInt16 OOBIN_FUNC_HYPERLINK = 359; /// OOBIN function id of the HYPERLINK function. +const sal_uInt16 OOBIN_FUNC_WEEKNUM = 465; /// OOBIN function id of the WEEKNUM function. + +const sal_uInt16 BIFF_FUNC_SUM = 4; /// BIFF function id of the SUM function. +const sal_uInt16 BIFF_FUNC_EXTERNCALL = 255; /// BIFF function id of the EXTERN.CALL function. + +// reference helpers ========================================================== + +/** A 2D formula cell reference struct with relative flags. */ +struct BinSingleRef2d +{ + sal_Int32 mnCol; /// Column index. + sal_Int32 mnRow; /// Row index. + bool mbColRel; /// True = relative column reference. + bool mbRowRel; /// True = relative row reference. + + explicit BinSingleRef2d(); + + void setOobData( sal_uInt16 nCol, sal_Int32 nRow, bool bRelativeAsOffset ); + void setBiff2Data( sal_uInt8 nCol, sal_uInt16 nRow, bool bRelativeAsOffset ); + void setBiff8Data( sal_uInt16 nCol, sal_uInt16 nRow, bool bRelativeAsOffset ); + + void readOobData( RecordInputStream& rStrm, bool bRelativeAsOffset ); + void readBiff2Data( BiffInputStream& rStrm, bool bRelativeAsOffset ); + void readBiff8Data( BiffInputStream& rStrm, bool bRelativeAsOffset ); +}; + +// ---------------------------------------------------------------------------- + +/** A 2D formula cell range reference struct with relative flags. */ +struct BinComplexRef2d +{ + BinSingleRef2d maRef1; /// Start (top-left) cell address. + BinSingleRef2d maRef2; /// End (bottom-right) cell address. + + void readOobData( RecordInputStream& rStrm, bool bRelativeAsOffset ); + void readBiff2Data( BiffInputStream& rStrm, bool bRelativeAsOffset ); + void readBiff8Data( BiffInputStream& rStrm, bool bRelativeAsOffset ); +}; + +// token vector, sequence ===================================================== + +typedef ::com::sun::star::sheet::FormulaToken ApiToken; +typedef ::com::sun::star::uno::Sequence< ApiToken > ApiTokenSequence; + +/** A vector of formula tokens with additional convenience functions. */ +class ApiTokenVector : public ::std::vector< ApiToken > +{ +public: + explicit ApiTokenVector(); + + /** Appends a new token with the passed op-code, returns its data field. */ + ::com::sun::star::uno::Any& + append( sal_Int32 nOpCode ); + + /** Appends a new token with the passed op-code and data. */ + template< typename Type > + inline void append( sal_Int32 nOpCode, const Type& rData ) { append( nOpCode ) <<= rData; } +}; + +// token sequence iterator ==================================================== + +/** Token sequence iterator that is able to skip space tokens. */ +class ApiTokenIterator +{ +public: + explicit ApiTokenIterator( const ApiTokenSequence& rTokens, sal_Int32 nSpacesOpCode, bool bSkipSpaces ); + /** Copy constructor that allows to change the skip spaces mode. */ + explicit ApiTokenIterator( const ApiTokenIterator& rIter, bool bSkipSpaces ); + + inline bool is() const { return mpToken != mpTokenEnd; } + inline const ApiToken* get() const { return mpToken; } + inline const ApiToken* operator->() const { return mpToken; } + inline const ApiToken& operator*() const { return *mpToken; } + + ApiTokenIterator& operator++(); + +private: + void skipSpaces(); + +private: + const ApiToken* mpToken; /// Pointer to current token of the token sequence. + const ApiToken* mpTokenEnd; /// Pointer behind last token of the token sequence. + const sal_Int32 mnSpacesOpCode; /// Op-code for whitespace tokens. + const bool mbSkipSpaces; /// true = Skip whitespace tokens. +}; + +// list of API op-codes ======================================================= + +/** Contains all API op-codes needed to build formulas with tokens. */ +struct ApiOpCodes +{ + // special + sal_Int32 OPCODE_UNKNOWN; /// Internal: function name unknown to mapper. + sal_Int32 OPCODE_EXTERNAL; /// External function call (e.g. add-ins). + // formula structure + sal_Int32 OPCODE_PUSH; /// Op-code for common value operands. + sal_Int32 OPCODE_MISSING; /// Placeholder for a missing function parameter. + sal_Int32 OPCODE_SPACES; /// Spaces between other formula tokens. + sal_Int32 OPCODE_NAME; /// Index of a defined name. + sal_Int32 OPCODE_DBAREA; /// Index of a database area. + sal_Int32 OPCODE_NLR; /// Natural language reference. + sal_Int32 OPCODE_DDE; /// DDE link function. + sal_Int32 OPCODE_MACRO; /// Macro function call. + sal_Int32 OPCODE_BAD; /// Bad token (unknown name, formula error). + sal_Int32 OPCODE_NONAME; /// Function style #NAME? error. + // separators + sal_Int32 OPCODE_OPEN; /// Opening parenthesis. + sal_Int32 OPCODE_CLOSE; /// Closing parenthesis. + sal_Int32 OPCODE_SEP; /// Function parameter separator. + // array separators + sal_Int32 OPCODE_ARRAY_OPEN; /// Opening brace for constant arrays. + sal_Int32 OPCODE_ARRAY_CLOSE; /// Closing brace for constant arrays. + sal_Int32 OPCODE_ARRAY_ROWSEP; /// Row separator in constant arrays. + sal_Int32 OPCODE_ARRAY_COLSEP; /// Column separator in constant arrays. + // unary operators + sal_Int32 OPCODE_PLUS_SIGN; /// Unary plus sign. + sal_Int32 OPCODE_MINUS_SIGN; /// Unary minus sign. + sal_Int32 OPCODE_PERCENT; /// Percent sign. + // binary operators + sal_Int32 OPCODE_ADD; /// Addition operator. + sal_Int32 OPCODE_SUB; /// Subtraction operator. + sal_Int32 OPCODE_MULT; /// Multiplication operator. + sal_Int32 OPCODE_DIV; /// Division operator. + sal_Int32 OPCODE_POWER; /// Power operator. + sal_Int32 OPCODE_CONCAT; /// String concatenation operator. + sal_Int32 OPCODE_EQUAL; /// Compare equal operator. + sal_Int32 OPCODE_NOT_EQUAL; /// Compare not equal operator. + sal_Int32 OPCODE_LESS; /// Compare less operator. + sal_Int32 OPCODE_LESS_EQUAL; /// Compare less or equal operator. + sal_Int32 OPCODE_GREATER; /// Compare greater operator. + sal_Int32 OPCODE_GREATER_EQUAL; /// Compare greater or equal operator. + sal_Int32 OPCODE_INTERSECT; /// Range intersection operator. + sal_Int32 OPCODE_LIST; /// Range list operator. + sal_Int32 OPCODE_RANGE; /// Range operator. +}; + +// Function parameter info ==================================================== + +/** Enumerates validity modes for a function parameter. */ +enum FuncParamValidity +{ + FUNC_PARAM_NONE = 0, /// Default for an unspecified entry in a C-array. + FUNC_PARAM_REGULAR, /// Parameter supported by Calc and Excel. + FUNC_PARAM_CALCONLY, /// Parameter supported by Calc only. + FUNC_PARAM_EXCELONLY /// Parameter supported by Excel only. +}; + +/** Enumerates different types of token class conversion in function parameters. */ +enum FuncParamConversion +{ + FUNC_PARAMCONV_ORG, /// Use original class of current token. + FUNC_PARAMCONV_VAL, /// Convert tokens to VAL class. + FUNC_PARAMCONV_ARR, /// Convert tokens to ARR class. + FUNC_PARAMCONV_RPT, /// Repeat parent conversion in VALTYPE parameters. + FUNC_PARAMCONV_RPX, /// Repeat parent conversion in REFTYPE parameters. + FUNC_PARAMCONV_RPO /// Repeat parent conversion in operands of operators. +}; + +/** Structure that contains all needed information for a parameter in a + function. + + The member meValid specifies which application supports the parameter. If + set to CALCONLY, import filters have to insert a default value for this + parameter, and export filters have to skip the parameter. If set to + EXCELONLY, import filters have to skip the parameter, and export filters + have to insert a default value for this parameter. + + The member mbValType specifies whether the parameter requires tokens to be + of value type (VAL or ARR class). + + If set to false, the parameter is called to be REFTYPE. Tokens with REF + default class can be inserted for the parameter (e.g. tAreaR tokens). + + If set to true, the parameter is called to be VALTYPE. Tokens with REF + class need to be converted to VAL tokens first (e.g. tAreaR will be + converted to tAreaV), and further conversion is done according to this + new token class. + + The member meConv specifies how to convert the current token class of the + token inserted for the parameter. If the token class is still REF this + means that the token has default REF class and the parameter is REFTYPE + (see member mbValType), the token will not be converted at all and remains + in REF class. Otherwise, token class conversion is depending on the actual + token class of the return value of the function containing this parameter. + The function may return REF class (tFuncR, tFuncVarR, tFuncCER), or it may + return VAL or ARR class (tFuncV, tFuncA, tFuncVarV, tFuncVarA, tFuncCEV, + tFuncCEA). Even if the function is able to return REF class, it may return + VAL or ARR class instead due to the VALTYPE data type of the parent + function parameter that calls the own function. Example: The INDIRECT + function returns REF class by default. But if called from a VALTYPE + function parameter, e.g. in the formula =ABS(INDIRECT("A1")), it returns + VAL or ARR class instead. Additionally, the repeating conversion types RPT + and RPX rely on the conversion executed for the function token class. + + 1) ORG: + Use the original class of the token (VAL or ARR), regardless of any + conversion done for the function return class. + + 2) VAL: + Convert ARR tokens to VAL class, regardless of any conversion done for + the function return class. + + 3) ARR: + Convert VAL tokens to ARR class, regardless of any conversion done for + the function return class. + + 4) RPT: + If the own function returns REF class (thus it is called from a REFTYPE + parameter, see above), and the parent conversion type (for the function + return class) was ORG, VAL, or ARR, ignore that conversion and always + use VAL conversion for the own token instead. If the parent conversion + type was RPT or RPX, repeat the conversion that would have been used if + the function would return value type. + If the own function returns value type (VAL or ARR class, see above), + and the parent conversion type (for the function return class) was ORG, + VAL, ARR, or RPT, repeat this conversion for the own token. If the + parent conversion type was RPX, always use ORG conversion type for the + own token instead. + + 5) RPX: + This type of conversion only occurs in functions returning VAL class by + default. If the own token is value type, and the VAL return class of + the own function has been changed to ARR class (due to direct ARR + conversion, or due to ARR conversion repeated by RPT or RPX), set the + own token to ARR type. Otherwise use the original token type (VAL + conversion from parent parameter will not be repeated at all). If + nested functions have RPT or value-type RPX parameters, they will not + repeat this conversion type, but will use ORG conversion instead (see + description of RPT above). + + 6) RPO: + This type of conversion is only used for the operands of all operators + (unary and binary arithmetic operators, comparison operators, and range + operators). It is not used for function parameters. On conversion, it + will be replaced by the last conversion type that was not the RPO + conversion. This leads to a slightly different behaviour than the RPT + conversion for operands in conjunction with a parent RPX conversion. + */ +struct FunctionParamInfo +{ + FuncParamValidity meValid; /// Parameter validity. + FuncParamConversion meConv; /// Token class conversion type. + bool mbValType; /// Data type (false = REFTYPE, true = VALTYPE). +}; + +// function data ============================================================== + +/** This enumeration contains constants for all known external libraries + containing supported sheet functions. */ +enum FunctionLibraryType +{ + FUNCLIB_EUROTOOL, /// EuroTool add-in with EUROCONVERT function. + FUNCLIB_UNKNOWN /// Unknown library. +}; + +// ---------------------------------------------------------------------------- + +/** Represents information for a spreadsheet function. + + The member mpParamInfos points to an array of type information structures + for all parameters of the function. The last initialized structure + describing a regular parameter (member meValid == EXC_PARAMVALID_ALWAYS) in + this array is used repeatedly for all following parameters supported by a + function. + */ +struct FunctionInfo +{ + ::rtl::OUString maOdfFuncName; /// ODF function name. + ::rtl::OUString maOoxFuncName; /// OOXML function name. + ::rtl::OUString maBiffMacroName; /// Expected macro name in EXTERN.CALL function. + ::rtl::OUString maExtProgName; /// Programmatic function name for external functions. + FunctionLibraryType meFuncLibType; /// The external library this function is part of. + sal_Int32 mnApiOpCode; /// API function opcode. + sal_uInt16 mnOobFuncId; /// OOBIN function identifier. + sal_uInt16 mnBiffFuncId; /// BIFF function identifier. + sal_uInt8 mnMinParamCount; /// Minimum number of parameters. + sal_uInt8 mnMaxParamCount; /// Maximum number of parameters. + sal_uInt8 mnRetClass; /// BIFF token class of the return value. + const FunctionParamInfo* mpParamInfos; /// Information about all parameters. + bool mbParamPairs; /// true = optional parameters are expected to appear in pairs. + bool mbVolatile; /// True = volatile function. + bool mbExternal; /// True = external function in Calc. + bool mbMacroFunc; /// True = macro sheet function or command. + bool mbVarParam; /// True = use a tFuncVar token, also if min/max are equal. +}; + +typedef RefVector< FunctionInfo > FunctionInfoVector; + +// function info parameter class iterator ===================================== + +/** Iterator working on the mpParamInfos member of the FunctionInfo struct. + + This iterator can be used to iterate through the array containing the + token class conversion information of function parameters. This iterator + repeats the last valid structure in the array - it stops automatically + before the first empty array entry or before the end of the array, even for + repeated calls to the increment operator. + */ +class FunctionParamInfoIterator +{ +public: + explicit FunctionParamInfoIterator( const FunctionInfo& rFuncInfo ); + + const FunctionParamInfo& getParamInfo() const; + bool isCalcOnlyParam() const; + bool isExcelOnlyParam() const; + FunctionParamInfoIterator& operator++(); + +private: + const FunctionParamInfo* mpParamInfo; + const FunctionParamInfo* mpParamInfoEnd; + bool mbParamPairs; +}; + +// base function provider ===================================================== + +struct FunctionProviderImpl; + +/** Provides access to function info structs for all available sheet functions. + */ +class FunctionProvider // not derived from WorkbookHelper to make it usable in file dumpers +{ +public: + explicit FunctionProvider( FilterType eFilter, BiffType eBiff, bool bImportFilter ); + virtual ~FunctionProvider(); + + /** Returns the function info for an ODF function name, or 0 on error. */ + const FunctionInfo* getFuncInfoFromOdfFuncName( const ::rtl::OUString& rFuncName ) const; + + /** Returns the function info for an OOX function name, or 0 on error. */ + const FunctionInfo* getFuncInfoFromOoxFuncName( const ::rtl::OUString& rFuncName ) const; + + /** Returns the function info for an OOBIN function index, or 0 on error. */ + const FunctionInfo* getFuncInfoFromOobFuncId( sal_uInt16 nFuncId ) const; + + /** Returns the function info for a BIFF function index, or 0 on error. */ + const FunctionInfo* getFuncInfoFromBiffFuncId( sal_uInt16 nFuncId ) const; + + /** Returns the function info for a macro function referred by the + EXTERN.CALL function, or 0 on error. */ + const FunctionInfo* getFuncInfoFromMacroName( const ::rtl::OUString& rFuncName ) const; + + /** Returns the library type associated with the passed URL of a function + library (function add-in). */ + FunctionLibraryType getFuncLibTypeFromLibraryName( const ::rtl::OUString& rLibraryName ) const; + +protected: + /** Returns the list of all function infos. */ + const FunctionInfoVector& getFuncs() const; + +private: + typedef ::boost::shared_ptr< FunctionProviderImpl > FunctionProviderImplRef; + FunctionProviderImplRef mxFuncImpl; /// Shared implementation between all copies of the provider. +}; + +// op-code and function provider ============================================== + +struct OpCodeProviderImpl; + +/** Provides access to API op-codes for all available formula tokens and to + function info structs for all available sheet functions. + */ +class OpCodeProvider : public FunctionProvider // not derived from WorkbookHelper to make it usable as UNO service +{ +public: + explicit OpCodeProvider( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + FilterType eFilter, BiffType eBiff, bool bImportFilter ); + virtual ~OpCodeProvider(); + + /** Returns the structure containing all token op-codes for operators and + special tokens used by the Calc document and its formula parser. */ + const ApiOpCodes& getOpCodes() const; + + /** Returns the function info for an API token, or 0 on error. */ + const FunctionInfo* getFuncInfoFromApiToken( const ApiToken& rToken ) const; + + /** Returns the op-code map that is used by the OOX formula parser. */ + ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaOpCodeMapEntry > + getOoxParserMap() const; + +private: + typedef ::boost::shared_ptr< OpCodeProviderImpl > OpCodeProviderImplRef; + OpCodeProviderImplRef mxOpCodeImpl; /// Shared implementation between all copies of the provider. +}; + +// API formula parser wrapper ================================================= + +/** A wrapper around the FormulaParser service provided by the Calc document. */ +class ApiParserWrapper : public OpCodeProvider +{ +public: + explicit ApiParserWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory, + const OpCodeProvider& rOpCodeProv ); + + /** Returns read/write access to the formula parser property set. */ + inline PropertySet& getParserProperties() { return maParserProps; } + + /** Calls the XFormulaParser::parseFormula() function of the API parser. */ + ApiTokenSequence parseFormula( + const ::rtl::OUString& rFormula, + const ::com::sun::star::table::CellAddress& rRefPos ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XFormulaParser > + mxParser; + PropertySet maParserProps; +}; + +// formula contexts =========================================================== + +class FormulaContext +{ +public: + inline void setBaseAddress( const ::com::sun::star::table::CellAddress& rBaseAddress ) + { maBaseAddress = rBaseAddress; } + + inline const ::com::sun::star::table::CellAddress& getBaseAddress() const { return maBaseAddress; } + inline bool isRelativeAsOffset() const { return mbRelativeAsOffset; } + inline bool is2dRefsAs3dRefs() const { return mb2dRefsAs3dRefs; } + inline bool isNulCharsAllowed() const { return mbAllowNulChars; } + + virtual void setTokens( const ApiTokenSequence& rTokens ) = 0; + virtual void setSharedFormula( const ::com::sun::star::table::CellAddress& rBaseAddr ); + +protected: + explicit FormulaContext( + bool bRelativeAsOffset, + bool b2dRefsAs3dRefs, + bool bAllowNulChars = false ); + virtual ~FormulaContext(); + +private: + ::com::sun::star::table::CellAddress maBaseAddress; + bool mbRelativeAsOffset; + bool mb2dRefsAs3dRefs; + bool mbAllowNulChars; +}; + +// ---------------------------------------------------------------------------- + +/** Stores the converted formula token sequence in a class member. */ +class TokensFormulaContext : public FormulaContext +{ +public: + explicit TokensFormulaContext( + bool bRelativeAsOffset, + bool b2dRefsAs3dRefs, + bool bAllowNulChars = false ); + + inline const ApiTokenSequence& getTokens() const { return maTokens; } + + virtual void setTokens( const ApiTokenSequence& rTokens ); + +private: + ApiTokenSequence maTokens; +}; + +// ---------------------------------------------------------------------------- + +/** Uses the com.sun.star.sheet.XFormulaTokens interface to set a token sequence. */ +class SimpleFormulaContext : public FormulaContext +{ +public: + explicit SimpleFormulaContext( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XFormulaTokens >& rxTokens, + bool bRelativeAsOffset, + bool b2dRefsAs3dRefs, + bool bAllowNulChars = false ); + + virtual void setTokens( const ApiTokenSequence& rTokens ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XFormulaTokens > mxTokens; +}; + +// formula parser/printer base class for filters ============================== + +/** Base class for import formula parsers and export formula compilers. */ +class FormulaProcessorBase : public OpCodeProvider, protected ApiOpCodes, public WorkbookHelper +{ +public: + explicit FormulaProcessorBase( const WorkbookHelper& rHelper ); + + // ------------------------------------------------------------------------ + + /** Generates a cell address string in A1 notation from the passed cell + address. + + @param rAddress The cell address containing column and row index. + @param bAbsolute True = adds dollar signs before column and row. + */ + static ::rtl::OUString generateAddress2dString( + const ::com::sun::star::table::CellAddress& rAddress, + bool bAbsolute ); + + /** Generates a cell address string in A1 notation from the passed binary + cell address. + + @param rAddress The cell address containing column and row index. + @param bAbsolute True = adds dollar signs before column and row. + */ + static ::rtl::OUString generateAddress2dString( + const BinAddress& rAddress, + bool bAbsolute ); + + /** Generates a cell range string in A1:A1 notation from the passed cell + range address. + + @param rRange The cell range address containing column and row indexes. + @param bAbsolute True = adds dollar signs before columns and rows. + */ + static ::rtl::OUString generateRange2dString( + const ::com::sun::star::table::CellRangeAddress& rRange, + bool bAbsolute ); + + /** Generates a cell range string in A1:A1 notation from the passed binary + cell range address. + + @param rRange The cell range address containing column and row indexes. + @param bAbsolute True = adds dollar signs before columns and rows. + */ + static ::rtl::OUString generateRange2dString( + const BinRange& rRange, + bool bAbsolute ); + + /** Generates a cell range list string in A1:A1 notation from the passed + cell range addresses. May enclose multiple ranges into parentheses. + + @param rRanges The list of cell range addresses. + @param bAbsolute True = adds dollar signs before columns and rows. + @param cSeparator Separator character between ranges. + @param bEncloseMultiple True = enclose multiple ranges in parentheses. + */ + static ::rtl::OUString generateRangeList2dString( + const ApiCellRangeList& rRanges, + bool bAbsolute, + sal_Unicode cSeparator, + bool bEncloseMultiple ); + + // ------------------------------------------------------------------------ + + /** Generates a cell address string in Calc's absolute $Sheet.$A$1 notation + from the passed cell address. + + @param rAddress The cell address to be converted to a string. + */ + ::rtl::OUString generateApiAddressString( + const ::com::sun::star::table::CellAddress& rAddress ) const; + + /** Generates a cell range string in Calc's absolute $Sheet.$A$1:$A$ + notation from the passed cell range address. + + @param rRange The cell range address to be converted to a string. + */ + ::rtl::OUString generateApiRangeString( + const ::com::sun::star::table::CellRangeAddress& rRange ) const; + + /** Generates a cell range list string in Calc's absolute $Sheet.$A$1:$A$1 + notation from the passed cell range addresses. + + @param rRanges The list of cell ranges to be converted to a string. + */ + ::rtl::OUString generateApiRangeListString( const ApiCellRangeList& rRanges ) const; + + /** Generates a string in Calc formula notation from the passed string. + + @param rString The string value. + + @return The string enclosed in double quotes, where all contained + quote characters are doubled. + */ + static ::rtl::OUString generateApiString( const ::rtl::OUString& rString ); + + /** Generates an array string in Calc formula notation from the passed + matrix with Any's containing double values or strings. + + @param rMatrix The matrix containing double values or strings. + */ + static ::rtl::OUString generateApiArray( const Matrix< ::com::sun::star::uno::Any >& rMatrix ); + + // ------------------------------------------------------------------------ + + /** Tries to extract a single cell reference from a formula token sequence. + + @param rTokens The token sequence to be parsed. Should contain exactly + one address token or cell range address token. The token sequence + may contain whitespace tokens. + + @return If the token sequence is valid, this function returns an Any + containing a com.sun.star.sheet.SingleReference object, or a + com.sun.star.sheet.ComplexReference object. If the token sequence + contains too many, or unexpected tokens, an empty Any is returned. + */ + ::com::sun::star::uno::Any + extractReference( const ApiTokenSequence& rTokens ) const; + + /** Tries to extract a single cell address from a formula token sequence. + + @param orAddress (output parameter) If the token sequence is valid, + this parameter will contain the extracted cell address. If the + token sequence contains unexpected tokens, nothing meaningful is + inserted, and the function returns false. + + @param rTokens The token sequence to be parsed. Should contain exactly + one cell address token. The token sequence may contain whitespace + tokens. + + @param bAllowRelative True = it is allowed that rTokens contains + relative references (based on cell A1 of the current sheet). + False = only real absolute references will be accepted. + + @return True, if the token sequence contains a valid cell address + which has been extracted to orAddress, false otherwise. + */ + bool extractCellAddress( + ::com::sun::star::table::CellAddress& orAddress, + const ApiTokenSequence& rTokens, + bool bAllowRelative ) const; + + /** Tries to extract a cell range address from a formula token sequence. + + @param orAddress (output parameter) If the token sequence is valid, + this parameter will contain the extracted cell range address. If + the token sequence contains unexpected tokens, nothing meaningful + is inserted, and the function returns false. + + @param rTokens The token sequence to be parsed. Should contain exactly + one cell range address token. The token sequence may contain + whitespace tokens. + + @param bAllowRelative True = it is allowed that rTokens contains + relative references (based on cell A1 of the current sheet). + False = only real absolute references will be accepted. + + @return True, if the token sequence contains a valid cell range + address which has been extracted to orRange, false otherwise. + */ + bool extractCellRange( + ::com::sun::star::table::CellRangeAddress& orRange, + const ApiTokenSequence& rTokens, + bool bAllowRelative ) const; + + /** Tries to extract a cell range list from a formula token sequence. + + @param orRanges (output parameter) If the token sequence is valid, + this parameter will contain the extracted cell range list. Deleted + cells or cell ranges (shown as #REF! error in a formula) will be + skipped. If the token sequence contains unexpected tokens, an empty + list is returned here. + + @param rTokens The token sequence to be parsed. Should contain cell + address tokens or cell range address tokens, separated by the + standard function parameter separator token. The token sequence may + contain parentheses and whitespace tokens. + + @param bAllowRelative True = it is allowed that rTokens contains + relative references (based on cell A1 of the current sheet). + False = only real absolute references will be accepted. + + @param nFilterBySheet If non-negative, this function returns only cell + ranges located in the specified sheet, otherwise returns all cell + ranges contained in the token sequence. + */ + void extractCellRangeList( + ApiCellRangeList& orRanges, + const ApiTokenSequence& rTokens, + bool bAllowRelative, + sal_Int32 nFilterBySheet = -1 ) const; + + /** Tries to extract a string from a formula token sequence. + + @param orString (output parameter) The extracted string. + + @param rTokens The token sequence to be parsed. Should contain exactly + one string token, may contain whitespace tokens. + + @return True = token sequence is valid, output parameter orString + contains the string extracted from the token sequence. + */ + bool extractString( + ::rtl::OUString& orString, + const ApiTokenSequence& rTokens ) const; + + /** Converts a single string with separators in the passed formula token + sequence to a list of string tokens. + + @param orTokens (input/output parameter) Expects a single string token + in this token sequence (whitespace tokens are allowed). The string + is split into substrings. A list of string tokens separated with + parameter separator tokens is returned in this psrameter. + + @param cStringSep The separator character used to split the input + string. + + @param bTrimLeadingSpaces True = removes leading whitespace from all + substrings inserted into the formula token sequence. + */ + void convertStringToStringList( + ApiTokenSequence& orTokens, + sal_Unicode cStringSep, + bool bTrimLeadingSpaces ) const; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/formulaparser.hxx b/oox/inc/oox/xls/formulaparser.hxx new file mode 100644 index 000000000000..0227e8efee6d --- /dev/null +++ b/oox/inc/oox/xls/formulaparser.hxx @@ -0,0 +1,170 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_FORMULAPARSER_HXX +#define OOX_XLS_FORMULAPARSER_HXX + +#include "oox/xls/formulabase.hxx" + +namespace oox { +namespace xls { + +// formula finalizer ========================================================== + +/** A generic formula token array finalizer. + + After building a formula token array from alien binary file formats, or + parsing an XML formula string using the com.sun.star.sheet.FormulaParser + service, the token array is still not ready to be put into the spreadsheet + document. There may be functions with a wrong number of parameters (missing + but required parameters, or unsupported parameters) or intermediate tokens + used to encode references to macro functions or add-in functions. This + helper processes a passed token array and builds a new compatible token + array. + + Derived classes may add more functionality by overwriting the virtual + functions. + */ +class FormulaFinalizer : public OpCodeProvider, protected ApiOpCodes +{ +public: + explicit FormulaFinalizer( const OpCodeProvider& rOpCodeProv ); + + /** Finalizes and returns the passed token array. */ + ApiTokenSequence finalizeTokenArray( const ApiTokenSequence& rTokens ); + +protected: + /** Derived classed may try to find a function info struct from the passed + string extracted from an OPCODE_BAD token. + + @param rTokenData The string that has been found in an OPCODE_BAD + token preceding the function parentheses. + */ + virtual const FunctionInfo* resolveBadFuncName( const ::rtl::OUString& rTokenData ) const; + + /** Derived classed may try to find the name of a defined name with the + passed index extracted from an OPCODE_NAME token. + + @param nTokenIndex The index of the defined name that has been found + in an OPCODE_NAME token preceding the function parentheses. + */ + virtual ::rtl::OUString resolveDefinedName( sal_Int32 nTokenIndex ) const; + +private: + typedef ::std::vector< const ApiToken* > ParameterPosVector; + + const FunctionInfo* getFunctionInfo( ApiToken& orFuncToken ); + const FunctionInfo* getExternCallInfo( ApiToken& orFuncToken, const ApiToken& rECToken ); + + void processTokens( const ApiToken* pToken, const ApiToken* pTokenEnd ); + const ApiToken* processParameters( const FunctionInfo& rFuncInfo, const ApiToken* pToken, const ApiToken* pTokenEnd ); + + bool isEmptyParameter( const ApiToken* pToken, const ApiToken* pTokenEnd ) const; + const ApiToken* getSingleToken( const ApiToken* pToken, const ApiToken* pTokenEnd ) const; + const ApiToken* skipParentheses( const ApiToken* pToken, const ApiToken* pTokenEnd ) const; + const ApiToken* findParameters( ParameterPosVector& rParams, const ApiToken* pToken, const ApiToken* pTokenEnd ) const; + void appendCalcOnlyParameter( const FunctionInfo& rFuncInfo, size_t nParam ); + void appendRequiredParameters( const FunctionInfo& rFuncInfo, size_t nParamCount ); + + bool appendFinalToken( const ApiToken& rToken ); + +private: + ApiTokenVector maTokens; +}; + +// ============================================================================ + +class FormulaParserImpl; + +/** Import formula parser for OOX and BIFF filters. + + This class implements formula import for the OOX and BIFF filter. One + instance is contained in the global filter data to prevent construction and + destruction of internal buffers for every imported formula. + */ +class FormulaParser : public FormulaProcessorBase +{ +public: + explicit FormulaParser( const WorkbookHelper& rHelper ); + virtual ~FormulaParser(); + + /** Converts an XML formula string. */ + void importFormula( + FormulaContext& rContext, + const ::rtl::OUString& rFormulaString ) const; + + /** Imports and converts a OOBIN token array from the passed stream. */ + void importFormula( + FormulaContext& rContext, + RecordInputStream& rStrm ) const; + + /** Imports and converts a BIFF token array from the passed stream. + @param pnFmlaSize Size of the token array. If null is passed, reads + it from stream (1 byte in BIFF2, 2 bytes otherwise) first. */ + void importFormula( + FormulaContext& rContext, + BiffInputStream& rStrm, + const sal_uInt16* pnFmlaSize = 0 ) const; + + /** Converts the passed BIFF error code to a similar formula. */ + void convertErrorToFormula( + FormulaContext& rContext, + sal_uInt8 nErrorCode ) const; + + /** Converts the passed token index of a defined name to a formula calling that name. */ + void convertNameToFormula( + FormulaContext& rContext, + sal_Int32 nTokenIndex ) const; + + /** Converts the passed number into a HYPERLINK formula with the passed URL. */ + void convertNumberToHyperlink( + FormulaContext& rContext, + const ::rtl::OUString& rUrl, + double fValue ) const; + + /** Converts the passed XML formula to an OLE link target. */ + ::rtl::OUString importOleTargetLink( const ::rtl::OUString& rFormulaString ); + + /** Imports and converts an OLE link target from the passed stream. */ + ::rtl::OUString importOleTargetLink( RecordInputStream& rStrm ); + + /** Imports and converts an OLE link target from the passed stream. */ + ::rtl::OUString importOleTargetLink( + BiffInputStream& rStrm, + const sal_uInt16* pnFmlaSize = 0 ) const; + +private: + ::std::auto_ptr< FormulaParserImpl > mxImpl; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/numberformatsbuffer.hxx b/oox/inc/oox/xls/numberformatsbuffer.hxx new file mode 100644 index 000000000000..59a2c4e9324e --- /dev/null +++ b/oox/inc/oox/xls/numberformatsbuffer.hxx @@ -0,0 +1,140 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_NUMBERFORMATSBUFFER_HXX +#define OOX_XLS_NUMBERFORMATSBUFFER_HXX + +#include <com/sun/star/lang/Locale.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace util { class XNumberFormats; } +} } } + +namespace oox { class PropertyMap; } + +namespace oox { +namespace xls { + +// ============================================================================ + +struct NumFmtModel +{ + ::com::sun::star::lang::Locale maLocale; + ::rtl::OUString maFmtCode; + sal_Int16 mnPredefId; + + explicit NumFmtModel(); +}; + +// ---------------------------------------------------------------------------- + +/** Contains all API number format attributes. */ +struct ApiNumFmtData +{ + sal_Int32 mnIndex; /// API number format index. + + explicit ApiNumFmtData(); +}; + +// ---------------------------------------------------------------------------- + +/** Contains all data for a number format code. */ +class NumberFormat : public WorkbookHelper +{ +public: + explicit NumberFormat( const WorkbookHelper& rHelper ); + + /** Sets the passed format code. */ + void setFormatCode( const ::rtl::OUString& rFmtCode ); + /** Sets the passed format code, encoded in UTF-8. */ + void setFormatCode( + const ::com::sun::star::lang::Locale& rLocale, + const sal_Char* pcFmtCode ); + /** Sets the passed predefined format code identifier. */ + void setPredefinedId( + const ::com::sun::star::lang::Locale& rLocale, + sal_Int16 nPredefId ); + + /** Final processing after import of all style settings. Returns the API format index. */ + sal_Int32 finalizeImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormats >& rxNumFmts, + const ::com::sun::star::lang::Locale& rFromLocale ); + + /** Writes the number format to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap ) const; + +private: + NumFmtModel maModel; + ApiNumFmtData maApiData; +}; + +typedef ::boost::shared_ptr< NumberFormat > NumberFormatRef; + +// ============================================================================ + +class NumberFormatsBuffer : public WorkbookHelper +{ +public: + explicit NumberFormatsBuffer( const WorkbookHelper& rHelper ); + + /** Inserts a new number format. */ + NumberFormatRef createNumFmt( sal_Int32 nNumFmtId, const ::rtl::OUString& rFmtCode ); + + /** Inserts a new number format code. */ + NumberFormatRef importNumFmt( const AttributeList& rAttribs ); + /** Inserts a new number format code from a NUMFMT record. */ + void importNumFmt( RecordInputStream& rStrm ); + /** Inserts a new number format code from a FORMAT record. */ + void importFormat( BiffInputStream& rStrm ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Writes the specified number format to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap, sal_Int32 nNumFmtId ) const; + +private: + /** Inserts built-in number formats for the current system language. */ + void insertBuiltinFormats(); + +private: + typedef RefMap< sal_Int32, NumberFormat > NumberFormatMap; + + NumberFormatMap maNumFmts; /// List of number formats. + ::rtl::OUString maLocaleStr; /// Current office locale. + sal_Int32 mnNextBiffIndex; /// Format id counter for BIFF2-BIFF4. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/ooxformulaparser.hxx b/oox/inc/oox/xls/ooxformulaparser.hxx new file mode 100644 index 000000000000..1c20febf5f43 --- /dev/null +++ b/oox/inc/oox/xls/ooxformulaparser.hxx @@ -0,0 +1,112 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_OOXFORMULAPARSER_HXX +#define OOX_XLS_OOXFORMULAPARSER_HXX + +#include <boost/shared_ptr.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/sheet/XFilterFormulaParser.hpp> +#include <cppuhelper/implbase3.hxx> + +namespace oox { +namespace xls { + +class OOXMLFormulaParserImpl; +class OOXMLFormulaPrinterImpl; + +// ============================================================================ + +typedef ::cppu::WeakImplHelper3< + ::com::sun::star::lang::XServiceInfo, + ::com::sun::star::lang::XInitialization, + ::com::sun::star::sheet::XFilterFormulaParser > OOXMLFormulaParserBase; + +/** OOXML formula parser/compiler service for usage in ODF filters. */ +class OOXMLFormulaParser : public OOXMLFormulaParserBase +{ +public: + explicit OOXMLFormulaParser(); + virtual ~OOXMLFormulaParser(); + + // com.sun.star.lang.XServiceInfo interface ------------------------------- + + virtual ::rtl::OUString SAL_CALL + getImplementationName() throw( ::com::sun::star::uno::RuntimeException ); + + virtual sal_Bool SAL_CALL + supportsService( const ::rtl::OUString& rService ) + throw( ::com::sun::star::uno::RuntimeException ); + + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL + getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.lang.XInitialization interface ---------------------------- + + virtual void SAL_CALL initialize( + const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rArgs ) + throw( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.sheet.XFilterFormulaParser interface ---------------------- + + virtual ::rtl::OUString SAL_CALL + getSupportedNamespace() + throw( ::com::sun::star::uno::RuntimeException ); + + // com.sun.star.sheet.XFormulaParser interface ---------------------------- + + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken > SAL_CALL + parseFormula( + const ::rtl::OUString& rFormula, + const ::com::sun::star::table::CellAddress& rReferencePos ) + throw( ::com::sun::star::uno::RuntimeException ); + + virtual ::rtl::OUString SAL_CALL + printFormula( + const ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken >& rTokens, + const ::com::sun::star::table::CellAddress& rReferencePos ) + throw( ::com::sun::star::uno::RuntimeException ); + +private: + typedef ::boost::shared_ptr< OOXMLFormulaParserImpl > ParserImplRef; + typedef ::boost::shared_ptr< OOXMLFormulaPrinterImpl > PrinterImplRef; + + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > + mxComponent; + ParserImplRef mxParserImpl; /// Implementation of import parser. + PrinterImplRef mxPrinterImpl; /// Implementation of export printer. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/pagesettings.hxx b/oox/inc/oox/xls/pagesettings.hxx new file mode 100644 index 000000000000..eb163daf94c8 --- /dev/null +++ b/oox/inc/oox/xls/pagesettings.hxx @@ -0,0 +1,220 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_PAGESETTINGS_HXX +#define OOX_XLS_PAGESETTINGS_HXX + +#include "oox/xls/worksheethelper.hxx" + +namespace oox { class PropertySet; } +namespace oox { namespace core { class Relations; } } + +namespace oox { +namespace xls { + +class HeaderFooterParser; + +// ============================================================================ + +/** Holds page style data for a single sheet. */ +struct PageSettingsModel +{ + ::rtl::OUString maGraphicUrl; /// URL of the graphic object. + ::rtl::OUString maBinSettPath; /// Relation identifier of binary printer settings. + ::rtl::OUString maOddHeader; /// Header string for odd pages. + ::rtl::OUString maOddFooter; /// Footer string for odd pages. + ::rtl::OUString maEvenHeader; /// Header string for even pages. + ::rtl::OUString maEvenFooter; /// Footer string for even pages. + ::rtl::OUString maFirstHeader; /// Header string for first page of the sheet. + ::rtl::OUString maFirstFooter; /// Footer string for first page of the sheet. + double mfLeftMargin; /// Margin between left edge of page and begin of sheet area. + double mfRightMargin; /// Margin between end of sheet area and right edge of page. + double mfTopMargin; /// Margin between top egde of page and begin of sheet area. + double mfBottomMargin; /// Margin between end of sheet area and bottom edge of page. + double mfHeaderMargin; /// Margin between top edge of page and begin of header. + double mfFooterMargin; /// Margin between end of footer and bottom edge of page. + sal_Int32 mnPaperSize; /// Paper size (enumeration). + sal_Int32 mnCopies; /// Number of copies to print. + sal_Int32 mnScale; /// Page scale (zoom in percent). + sal_Int32 mnFirstPage; /// First page number. + sal_Int32 mnFitToWidth; /// Fit to number of pages in horizontal direction. + sal_Int32 mnFitToHeight; /// Fit to number of pages in vertical direction. + sal_Int32 mnHorPrintRes; /// Horizontal printing resolution in DPI. + sal_Int32 mnVerPrintRes; /// Vertical printing resolution in DPI. + sal_Int32 mnOrientation; /// Landscape or portrait. + sal_Int32 mnPageOrder; /// Page order through sheet area (to left or down). + sal_Int32 mnCellComments; /// Cell comments printing mode. + sal_Int32 mnPrintErrors; /// Cell error printing mode. + bool mbUseEvenHF; /// True = use maEvenHeader/maEvenFooter. + bool mbUseFirstHF; /// True = use maFirstHeader/maFirstFooter. + bool mbValidSettings; /// True = use imported settings. + bool mbUseFirstPage; /// True = start page numbering with mnFirstPage. + bool mbBlackWhite; /// True = print black and white. + bool mbDraftQuality; /// True = print in draft quality. + bool mbFitToPages; /// True = Fit to width/height; false = scale in percent. + bool mbHorCenter; /// True = horizontally centered. + bool mbVerCenter; /// True = vertically centered. + bool mbPrintGrid; /// True = print grid lines. + bool mbPrintHeadings; /// True = print column/row headings. + + explicit PageSettingsModel(); + + /** Sets the OOBIN or BIFF print errors mode. */ + void setBinPrintErrors( sal_uInt8 nPrintErrors ); +}; + +// ============================================================================ + +class PageSettings : public WorksheetHelper +{ +public: + explicit PageSettings( const WorksheetHelper& rHelper ); + + /** Imports printing options from a printOptions element. */ + void importPrintOptions( const AttributeList& rAttribs ); + /** Imports pageMarings element containing page margins. */ + void importPageMargins( const AttributeList& rAttribs ); + /** Imports pageSetup element for worksheets. */ + void importPageSetup( const ::oox::core::Relations& rRelations, const AttributeList& rAttribs ); + /** Imports pageSetup element for chart sheets. */ + void importChartPageSetup( const ::oox::core::Relations& rRelations, const AttributeList& rAttribs ); + /** Imports header and footer settings from a headerFooter element. */ + void importHeaderFooter( const AttributeList& rAttribs ); + /** Imports header/footer characters from a headerFooter element. */ + void importHeaderFooterCharacters( const ::rtl::OUString& rChars, sal_Int32 nElement ); + /** Imports the picture element. */ + void importPicture( const ::oox::core::Relations& rRelations, const AttributeList& rAttribs ); + + /** Imports the PRINTOPTIONS record from the passed stream. */ + void importPrintOptions( RecordInputStream& rStrm ); + /** Imports the PAGEMARGINS record from the passed stream. */ + void importPageMargins( RecordInputStream& rStrm ); + /** Imports the PAGESETUP record from the passed stream. */ + void importPageSetup( const ::oox::core::Relations& rRelations, RecordInputStream& rStrm ); + /** Imports the CHARTPAGESETUP record from the passed stream. */ + void importChartPageSetup( const ::oox::core::Relations& rRelations, RecordInputStream& rStrm ); + /** Imports the HEADERFOOTER record from the passed stream. */ + void importHeaderFooter( RecordInputStream& rStrm ); + /** Imports the PICTURE record from the passed stream. */ + void importPicture( const ::oox::core::Relations& rRelations, RecordInputStream& rStrm ); + + /** Imports the LEFTMARGIN record from the passed BIFF stream. */ + void importLeftMargin( BiffInputStream& rStrm ); + /** Imports the RIGHTMARGIN record from the passed BIFF stream. */ + void importRightMargin( BiffInputStream& rStrm ); + /** Imports the TOPMARGIN record from the passed BIFF stream. */ + void importTopMargin( BiffInputStream& rStrm ); + /** Imports the BOTTOMMARGIN record from the passed BIFF stream. */ + void importBottomMargin( BiffInputStream& rStrm ); + /** Imports the SETUP record from the passed BIFF stream. */ + void importPageSetup( BiffInputStream& rStrm ); + /** Imports the HCENTER record from the passed BIFF stream. */ + void importHorCenter( BiffInputStream& rStrm ); + /** Imports the VCENTER record from the passed BIFF stream. */ + void importVerCenter( BiffInputStream& rStrm ); + /** Imports the PRINTHEADERS record from the passed BIFF stream. */ + void importPrintHeaders( BiffInputStream& rStrm ); + /** Imports the PRINTGRIDLINES record from the passed BIFF stream. */ + void importPrintGridLines( BiffInputStream& rStrm ); + /** Imports the HEADER record from the passed BIFF stream. */ + void importHeader( BiffInputStream& rStrm ); + /** Imports the FOOTER record from the passed BIFF stream. */ + void importFooter( BiffInputStream& rStrm ); + /** Imports the PICTURE record from the passed BIFF stream. */ + void importPicture( BiffInputStream& rStrm ); + + /** Sets whether percentual scaling or fit to width/height scaling is used. */ + void setFitToPagesMode( bool bFitToPages ); + + /** Creates a page style for the spreadsheet and sets all page properties. */ + void finalizeImport(); + +private: + /** Imports the binary picture data from the fragment with the passed identifier. */ + void importPictureData( const ::oox::core::Relations& rRelations, const ::rtl::OUString& rRelId ); + +private: + PageSettingsModel maModel; +}; + +// ============================================================================ + +class PageSettingsConverter : public WorkbookHelper +{ +public: + explicit PageSettingsConverter( const WorkbookHelper& rHelper ); + virtual ~PageSettingsConverter(); + + /** Writes all properties to the passed property set of a page style object. */ + void writePageSettingsProperties( + PropertySet& rPropSet, + const PageSettingsModel& rModel, + WorksheetType eSheetType ); + +private: + struct HFHelperData + { + sal_Int32 mnLeftPropId; + sal_Int32 mnRightPropId; + sal_Int32 mnHeight; + sal_Int32 mnBodyDist; + bool mbHasContent; + bool mbShareOddEven; + bool mbDynamicHeight; + + explicit HFHelperData( sal_Int32 nLeftPropId, sal_Int32 nRightPropId ); + }; + +private: + void convertHeaderFooterData( + PropertySet& rPropSet, + HFHelperData& orHFData, + const ::rtl::OUString rOddContent, + const ::rtl::OUString rEvenContent, + bool bUseEvenContent, + double fPageMargin, + double fContentMargin ); + + sal_Int32 writeHeaderFooter( + PropertySet& rPropSet, + sal_Int32 nPropId, + const ::rtl::OUString& rContent ); + +private: + typedef ::std::auto_ptr< HeaderFooterParser > HeaderFooterParserPtr; + HeaderFooterParserPtr mxHFParser; + HFHelperData maHeaderData; + HFHelperData maFooterData; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/pivotcachebuffer.hxx b/oox/inc/oox/xls/pivotcachebuffer.hxx new file mode 100644 index 000000000000..8f79ab0685b3 --- /dev/null +++ b/oox/inc/oox/xls/pivotcachebuffer.hxx @@ -0,0 +1,511 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_PIVOTCACHEBUFFER_HXX +#define OOX_XLS_PIVOTCACHEBUFFER_HXX + +#include <com/sun/star/util/DateTime.hpp> +#include <com/sun/star/table/CellAddress.hpp> +#include <com/sun/star/table/CellRangeAddress.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace sheet { class XDataPilotField; } +} } } + +namespace oox { namespace core { class Relations; } } + +namespace oox { +namespace xls { + +class WorksheetHelper; + +// ============================================================================ + +class PivotCacheItem +{ +public: + explicit PivotCacheItem(); + + /** Reads the string value from a pivot cache item. */ + void readString( const AttributeList& rAttribs ); + /** Reads the double value from a pivot cache item. */ + void readNumeric( const AttributeList& rAttribs ); + /** Reads the date/time value from a pivot cache item. */ + void readDate( const AttributeList& rAttribs ); + /** Reads the boolean value from a pivot cache item. */ + void readBool( const AttributeList& rAttribs ); + /** Reads the error code value from a pivot cache item. */ + void readError( const AttributeList& rAttribs, const UnitConverter& rUnitConverter ); + /** Reads the index of a shared item. */ + void readIndex( const AttributeList& rAttribs ); + + /** Reads the string value from a pivot cache item. */ + void readString( RecordInputStream& rStrm ); + /** Reads the double value from a pivot cache item. */ + void readDouble( RecordInputStream& rStrm ); + /** Reads the date/time value from a pivot cache item. */ + void readDate( RecordInputStream& rStrm ); + /** Reads the boolean value from a pivot cache item. */ + void readBool( RecordInputStream& rStrm ); + /** Reads the error code value from a pivot cache item. */ + void readError( RecordInputStream& rStrm ); + /** Reads the index of a shared item. */ + void readIndex( RecordInputStream& rStrm ); + + /** Reads the string value from a pivot cache item. */ + void readString( BiffInputStream& rStrm, const WorkbookHelper& rHelper ); + /** Reads the double value from a pivot cache item. */ + void readDouble( BiffInputStream& rStrm ); + /** Reads the integer value from a pivot cache item. */ + void readInteger( BiffInputStream& rStrm ); + /** Reads the date/time value from a pivot cache item. */ + void readDate( BiffInputStream& rStrm ); + /** Reads the boolean value from a pivot cache item. */ + void readBool( BiffInputStream& rStrm ); + /** Reads the error code value from a pivot cache item. */ + void readError( BiffInputStream& rStrm ); + + /** Returns the type of the item. */ + inline sal_Int32 getType() const { return mnType; } + /** Returns the value of the item. */ + inline const ::com::sun::star::uno::Any& getValue() const { return maValue; } + /** Returns the string representation of the item. */ + ::rtl::OUString getName() const; + +private: + ::com::sun::star::uno::Any maValue; /// Value of the item. + sal_Int32 mnType; /// Value type (OOX token identifier). +}; + +// ---------------------------------------------------------------------------- + +class PivotCacheItemList : public WorkbookHelper +{ +public: + explicit PivotCacheItemList( const WorkbookHelper& rHelper ); + + /** Imports the item from the passed attribute list. */ + void importItem( sal_Int32 nElement, const AttributeList& rAttribs ); + /** Imports the item from the passed stream and record. */ + void importItem( sal_Int32 nRecId, RecordInputStream& rStrm ); + /** Imports a complete item list from the passed stream. */ + void importItemList( BiffInputStream& rStrm, sal_uInt16 nCount ); + + /** Returns true, if this item list is empty. */ + inline bool empty() const { return maItems.empty(); } + /** Returns the size of the item list. */ + inline size_t size() const { return maItems.size(); } + + /** Returns the specified item. */ + const PivotCacheItem* getCacheItem( sal_Int32 nItemIdx ) const; + /** Returns the names of all items. */ + void getCacheItemNames( ::std::vector< ::rtl::OUString >& orItemNames ) const; + +private: + /** Creates and returns a new item at the end of the items list. */ + PivotCacheItem& createItem(); + /** Imports an array of items from the PCITEM_ARRAY record */ + void importArray( RecordInputStream& rStrm ); + +private: + typedef ::std::vector< PivotCacheItem > CacheItemVector; + CacheItemVector maItems; /// All items of this list. +}; + +// ============================================================================ + +struct PCFieldModel +{ + ::rtl::OUString maName; /// Fixed name of the cache field. + ::rtl::OUString maCaption; /// Caption of the ccahe field. + ::rtl::OUString maPropertyName; /// OLAP property name. + ::rtl::OUString maFormula; /// Formula of a calculated field. + sal_Int32 mnNumFmtId; /// Number format for all items. + sal_Int32 mnSqlType; /// Data type from ODBC data source. + sal_Int32 mnHierarchy; /// Hierarchy this field is part of. + sal_Int32 mnLevel; /// Hierarchy level this field is part of. + sal_Int32 mnMappingCount; /// Number of property mappings. + bool mbDatabaseField; /// True = field from source data; false = calculated field. + bool mbServerField; /// True = ODBC server-based page field. + bool mbUniqueList; /// True = list of unique ODBC items exists. + bool mbMemberPropField; /// True = contains OLAP member properties. + + explicit PCFieldModel(); +}; + +// ---------------------------------------------------------------------------- + +struct PCSharedItemsModel +{ + bool mbHasSemiMixed; /// True = has (blank|string|bool|error) item(s), maybe other types. + bool mbHasNonDate; /// True = has non-date item(s), maybe date items. + bool mbHasDate; /// True = has date item(s), maybe other types. + bool mbHasString; /// True = has (string|bool|error) item(s), maybe other types. + bool mbHasBlank; /// True = has blank item(s), maybe other types. + bool mbHasMixed; /// True = has [(string|bool|error) and (number|date)] or (number and date). + bool mbIsNumeric; /// True = has numeric item(s), maybe other types except date. + bool mbIsInteger; /// True = has numeric item(s) with only integers, maybe other types except date. + bool mbHasLongText; /// True = contains strings with >255 charascters. + bool mbHasLongIndexes; /// True = indexes to shared items are 16-bit (BIFF only). + + explicit PCSharedItemsModel(); +}; + +// ---------------------------------------------------------------------------- + +struct PCFieldGroupModel +{ + ::com::sun::star::util::DateTime maStartDate; /// Manual or calculated start date for range grouping. + ::com::sun::star::util::DateTime maEndDate; /// Manual or calculated end date for range grouping. + double mfStartValue; /// Manual or calculated start value for range grouping. + double mfEndValue; /// Manual or calculated end value for range grouping. + double mfInterval; /// Interval for numeric range grouping. + sal_Int32 mnParentField; /// Index of cache field that contains item groups based on this field. + sal_Int32 mnBaseField; /// Index of cache field this grouped field is based on. + sal_Int32 mnGroupBy; /// Type of numeric or date range grouping. + bool mbRangeGroup; /// True = items are grouped by numeric ranges or date ranges. + bool mbDateGroup; /// True = items are grouped by date ranges or by item names. + bool mbAutoStart; /// True = start value for range groups is calculated from source data. + bool mbAutoEnd; /// True = end value for range groups is calculated from source data. + + explicit PCFieldGroupModel(); + + /** Sets the group-by value for BIFF/OOBIN import. */ + void setBinGroupBy( sal_uInt8 nGroupBy ); +}; + +// ---------------------------------------------------------------------------- + +/** Helper struct for mapping original item names from/to group item names. */ +struct PivotCacheGroupItem +{ + ::rtl::OUString maOrigName; + ::rtl::OUString maGroupName; + + inline explicit PivotCacheGroupItem( const ::rtl::OUString& rItemName ) : + maOrigName( rItemName ), maGroupName( rItemName ) {} +}; + +typedef ::std::vector< PivotCacheGroupItem > PivotCacheGroupItemVector; + +// ---------------------------------------------------------------------------- + +class PivotCacheField : public WorkbookHelper +{ +public: + explicit PivotCacheField( const WorkbookHelper& rHelper, bool bIsDatabaseField ); + + /** Imports pivot cache field settings from the cacheField element. */ + void importCacheField( const AttributeList& rAttribs ); + /** Imports shared items settings from the sharedItems element. */ + void importSharedItems( const AttributeList& rAttribs ); + /** Imports a shared item from the passed element. */ + void importSharedItem( sal_Int32 nElement, const AttributeList& rAttribs ); + /** Imports grouping settings from the fieldGroup element. */ + void importFieldGroup( const AttributeList& rAttribs ); + /** Imports numeric grouping settings from the rangePr element. */ + void importRangePr( const AttributeList& rAttribs ); + /** Imports an item of the mapping between group items and base items from the passed element. */ + void importDiscretePrItem( sal_Int32 nElement, const AttributeList& rAttribs ); + /** Imports a group item from the passed element. */ + void importGroupItem( sal_Int32 nElement, const AttributeList& rAttribs ); + + /** Imports pivot cache field settings from the PCDFIELD record. */ + void importPCDField( RecordInputStream& rStrm ); + /** Imports shared items settings from the PCDFSHAREDITEMS record. */ + void importPCDFSharedItems( RecordInputStream& rStrm ); + /** Imports one or more shared items from the passed record. */ + void importPCDFSharedItem( sal_Int32 nRecId, RecordInputStream& rStrm ); + /** Imports grouping settings from the PCDFIELDGROUP record. */ + void importPCDFieldGroup( RecordInputStream& rStrm ); + /** Imports numeric grouping settings from the PCDFRANGEPR record. */ + void importPCDFRangePr( RecordInputStream& rStrm ); + /** Imports an item of the mapping between group items and base items from the passed record. */ + void importPCDFDiscretePrItem( sal_Int32 nRecId, RecordInputStream& rStrm ); + /** Imports one or more group items from the passed record. */ + void importPCDFGroupItem( sal_Int32 nRecId, RecordInputStream& rStrm ); + + /** Imports pivot cache field settings from the PCDFIELD record. */ + void importPCDField( BiffInputStream& rStrm ); + /** Imports numeric grouping settings from the PCDFRANGEPR record. */ + void importPCDFRangePr( BiffInputStream& rStrm ); + /** Imports the mapping between group items and base items from the PCDFDISCRETEPR record. */ + void importPCDFDiscretePr( BiffInputStream& rStrm ); + + /** Returns true, if the field is based on source data, or false if it is grouped or calculated. */ + inline bool isDatabaseField() const { return maFieldModel.mbDatabaseField; } + + /** Returns true, if the field contains a list of shared items. */ + inline bool hasSharedItems() const { return !maSharedItems.empty(); } + /** Returns true, if the field contains a list of grouping items. */ + inline bool hasGroupItems() const { return !maGroupItems.empty(); } + /** Returns true, if the field has inplace numeric grouping settings. */ + inline bool hasNumericGrouping() const { return maFieldGroupModel.mbRangeGroup && !maFieldGroupModel.mbDateGroup; } + /** Returns true, if the field has inplace date grouping settings. */ + inline bool hasDateGrouping() const { return maFieldGroupModel.mbRangeGroup && maFieldGroupModel.mbDateGroup; } + /** Returns true, if the field has a parent group field that groups the items of this field. */ + inline bool hasParentGrouping() const { return maFieldGroupModel.mnParentField >= 0; } + + /** Returns the name of the cache field. */ + inline const ::rtl::OUString& getName() const { return maFieldModel.maName; } + /** Returns the index of the parent group field that groups the items of this field. */ + inline sal_Int32 getParentGroupField() const { return maFieldGroupModel.mnParentField; } + /** Returns the index of the base field grouping is based on. */ + inline sal_Int32 getGroupBaseField() const { return maFieldGroupModel.mnBaseField; } + + /** Returns the shared or group item with the specified index. */ + const PivotCacheItem* getCacheItem( sal_Int32 nItemIdx ) const; + /** Returns the names of all shared or group items. */ + void getCacheItemNames( ::std::vector< ::rtl::OUString >& orItemNames ) const; + + /** Creates inplace numeric grouping settings. */ + void convertNumericGrouping( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxDPField ) const; + /** Creates inplace date grouping settings or a new date group field. */ + ::rtl::OUString createDateGroupField( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxBaseDPField ) const; + /** Creates a new grouped DataPilot field and returns its name. */ + ::rtl::OUString createParentGroupField( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxBaseDPField, + PivotCacheGroupItemVector& orItemNames ) const; + + /** Writes the title of the field into the passed sheet at the passed address. */ + void writeSourceHeaderCell( WorksheetHelper& rSheetHelper, + sal_Int32 nCol, sal_Int32 nRow ) const; + /** Writes a source field item value into the passed sheet. */ + void writeSourceDataCell( WorksheetHelper& rSheetHelper, + sal_Int32 nCol, sal_Int32 nRow, + const PivotCacheItem& rItem ) const; + + /** Reads an item from the PCRECORD record and writes it to the passed sheet. */ + void importPCRecordItem( RecordInputStream& rStrm, + WorksheetHelper& rSheetHelper, sal_Int32 nCol, sal_Int32 nRow ) const; + /** Reads an item index from the PCITEM_INDEXLIST record and writes the item to the passed sheet. */ + void importPCItemIndex( BiffInputStream& rStrm, + WorksheetHelper& rSheetHelper, sal_Int32 nCol, sal_Int32 nRow ) const; + + +private: + /** Tries to write the passed value to the passed sheet position. */ + void writeItemToSourceDataCell( WorksheetHelper& rSheetHelper, + sal_Int32 nCol, sal_Int32 nRow, const PivotCacheItem& rItem ) const; + /** Tries to write the value of a shared item to the passed sheet position. */ + void writeSharedItemToSourceDataCell( WorksheetHelper& rSheetHelper, + sal_Int32 nCol, sal_Int32 nRow, sal_Int32 nItemIdx ) const; + +private: + typedef ::std::vector< sal_Int32 > IndexVector; + + PivotCacheItemList maSharedItems; /// All shared items of this field. + PivotCacheItemList maGroupItems; /// All group items of this field. + IndexVector maDiscreteItems; /// Mapping between group and base items. + PCFieldModel maFieldModel; /// Settings for this cache field. + PCSharedItemsModel maSharedItemsModel; /// Settings for shared items. + PCFieldGroupModel maFieldGroupModel; /// Settings for item grouping. +}; + +// ============================================================================ + +struct PCDefinitionModel +{ + ::rtl::OUString maRelId; /// Relation identifier for cache records fragment. + ::rtl::OUString maRefreshedBy; /// Name of user who last refreshed the cache. + double mfRefreshedDate; /// Date/time of last refresh. + sal_Int32 mnRecords; /// Number of data records in the cache. + sal_Int32 mnMissItemsLimit; /// Limit for discarding unused items. + sal_uInt16 mnDatabaseFields; /// Number of database (source data) fields (BIFF only). + bool mbInvalid; /// True = cache needs refresh. + bool mbSaveData; /// True = cached item values are present. + bool mbRefreshOnLoad; /// True = try to refresh cache on load. + bool mbOptimizeMemory; /// True = application may optimize memory usage. + bool mbEnableRefresh; /// True = refreshing cache is enabled in UI. + bool mbBackgroundQuery; /// True = application queries data asynchonously. + bool mbUpgradeOnRefresh; /// True = application may upgrade cache version. + bool mbTupleCache; /// True = cache stores OLAP functions. + bool mbSupportSubquery; /// True = data source supports subqueries. + bool mbSupportDrill; /// True = data source supports drilldown. + + explicit PCDefinitionModel(); +}; + +// ---------------------------------------------------------------------------- + +struct PCSourceModel +{ + sal_Int32 mnSourceType; /// Type of the source data (sheet, consolidation, scenario, external). + sal_Int32 mnConnectionId; /// Connection identifier for external data source. + + explicit PCSourceModel(); +}; + +// ---------------------------------------------------------------------------- + +struct PCWorksheetSourceModel +{ + ::rtl::OUString maRelId; /// Relation identifier for an external document URL. + ::rtl::OUString maSheet; /// Sheet name for cell range or sheet-local defined names. + ::rtl::OUString maDefName; /// Defined name containing a cell range if present. + ::com::sun::star::table::CellRangeAddress + maRange; /// Source cell range of the data. + + explicit PCWorksheetSourceModel(); +}; + +// ---------------------------------------------------------------------------- + +class PivotCache : public WorkbookHelper +{ +public: + explicit PivotCache( const WorkbookHelper& rHelper ); + + /** Reads pivot cache global settings from the pivotCacheDefinition element. */ + void importPivotCacheDefinition( const AttributeList& rAttribs ); + /** Reads cache source settings from the cacheSource element. */ + void importCacheSource( const AttributeList& rAttribs ); + /** Reads sheet source settings from the worksheetSource element. */ + void importWorksheetSource( const AttributeList& rAttribs, const ::oox::core::Relations& rRelations ); + + /** Reads pivot cache global settings from the PCDEFINITION record. */ + void importPCDefinition( RecordInputStream& rStrm ); + /** Reads cache source settings from the PCDSOURCE record. */ + void importPCDSource( RecordInputStream& rStrm ); + /** Reads sheet source settings from the PCDSHEETSOURCE record. */ + void importPCDSheetSource( RecordInputStream& rStrm, const ::oox::core::Relations& rRelations ); + + /** Reads cache source settings from the PCDSOURCE record. */ + void importPCDSource( BiffInputStream& rStrm ); + /** Reads pivot cache global settings from the PCDEFINITION record. */ + void importPCDefinition( BiffInputStream& rStrm ); + + /** Creates and returns a new pivot cache field. */ + PivotCacheField& createCacheField( bool bInitDatabaseField = false ); + /** Checks validity of source data and creates a dummy data sheet for external sheet sources. */ + void finalizeImport(); + + /** Returns true, if the pivot cache is based on a valid data source, so + that pivot tables can be created based on this pivot cache. */ + inline bool isValidDataSource() const { return mbValidSource; } + /** Returns true, if the pivot cache is based on a dummy sheet created in finalizeImport. */ + inline bool isBasedOnDummySheet() const { return mbDummySheet; } + /** Returns the internal cell range the cache is based on. */ + inline const ::com::sun::star::table::CellRangeAddress& + getSourceRange() const { return maSheetSrcModel.maRange; } + /** Returns the relation identifier of the pivot cache records fragment. */ + inline const ::rtl::OUString& getRecordsRelId() const { return maDefModel.maRelId; } + + /** Returns the number of pivot cache fields. */ + sal_Int32 getCacheFieldCount() const; + /** Returns the cache field with the specified index. */ + const PivotCacheField* getCacheField( sal_Int32 nFieldIdx ) const; + /** Returns the source column index of the field with the passed index. */ + sal_Int32 getCacheDatabaseIndex( sal_Int32 nFieldIdx ) const; + + /** Writes the titles of all source fields into the passed sheet. */ + void writeSourceHeaderCells( WorksheetHelper& rSheetHelper ) const; + /** Writes a source field item value into the passed sheet. */ + void writeSourceDataCell( WorksheetHelper& rSheetHelper, + sal_Int32 nCol, sal_Int32 nRow, + const PivotCacheItem& rItem ) const; + + /** Reads a PCRECORD record and writes all item values to the passed sheet. */ + void importPCRecord( RecordInputStream& rStrm, + WorksheetHelper& rSheetHelper, sal_Int32 nRow ) const; + /** Reads a PCITEM_INDEXLIST record and writes all item values to the passed sheet. */ + void importPCItemIndexList( BiffInputStream& rStrm, + WorksheetHelper& rSheetHelper, sal_Int32 nRow ) const; + +private: + /** Reads the worksheet source range from the DCONREF record. */ + void importDConRef( BiffInputStream& rStrm ); + /** Reads the defined name used for source data from the DCONNAME record. */ + void importDConName( BiffInputStream& rStrm ); + /** Reads the built-in defined name used for source data from the DCONBINAME record. */ + void importDConBIName( BiffInputStream& rStrm ); + /** Reads the sheet name and URL from the DCONREF, DCONNAME, or DCONBINAME records. */ + void importDConUrl( BiffInputStream& rStrm ); + + /** Finalizes the pivot cache if it is based on internal sheet data. */ + void finalizeInternalSheetSource(); + /** Finalizes the pivot cache if it is based on sheet data of an external spreadsheet document. */ + void finalizeExternalSheetSource(); + /** Creates a dummy sheet that will be filled with the pivot cache data. */ + void prepareSourceDataSheet(); + +private: + typedef RefVector< PivotCacheField > PivotCacheFieldVector; + typedef ::std::vector< sal_Int32 > IndexVector; + + PivotCacheFieldVector maFields; /// All pivot cache fields. + PivotCacheFieldVector maDatabaseFields; /// All cache fields that are based on source data. + IndexVector maDatabaseIndexes; /// Database field index for all fields. + PCDefinitionModel maDefModel; /// Global pivot cache settings. + PCSourceModel maSourceModel; /// Pivot cache source settings. + PCWorksheetSourceModel maSheetSrcModel; /// Sheet source data if cache type is sheet. + ::rtl::OUString maTargetUrl; /// URL of an external source document. + bool mbValidSource; /// True = pivot cache is based on supported data source. + bool mbDummySheet; /// True = pivot cache is based on a dummy sheet. +}; + +// ============================================================================ + +class PivotCacheBuffer : public WorkbookHelper +{ +public: + explicit PivotCacheBuffer( const WorkbookHelper& rHelper ); + + /** Registers a pivot cache definition fragment. The fragment will be loaded on demand (OOX/OOBIN only). */ + void registerPivotCacheFragment( sal_Int32 nCacheId, const ::rtl::OUString& rFragmentPath ); + /** Reads the reference to a pivot cache stream. The stream will be loaded on demand (BIFF only). */ + void importPivotCacheRef( BiffInputStream& rStrm ); + + /** Imports and stores a pivot cache definition fragment on first call, + returns the imported cache on subsequent calls with the same identifier. */ + PivotCache* importPivotCacheFragment( sal_Int32 nCacheId ); + +private: + /** Creates and returns a new pivot cache object with the passed identifier. */ + PivotCache& createPivotCache( sal_Int32 nCacheId ); + +private: + typedef ::std::map< sal_Int32, ::rtl::OUString > FragmentPathMap; + typedef RefMap< sal_Int32, PivotCache > PivotCacheMap; + typedef ::std::vector< sal_Int32 > PivotCacheIdVector; + + FragmentPathMap maFragmentPaths; + PivotCacheMap maCaches; + PivotCacheIdVector maCacheIds; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/pivotcachefragment.hxx b/oox/inc/oox/xls/pivotcachefragment.hxx new file mode 100644 index 000000000000..745208f485e6 --- /dev/null +++ b/oox/inc/oox/xls/pivotcachefragment.hxx @@ -0,0 +1,156 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_PIVOTCACHEFRAGMENT_HXX +#define OOX_XLS_PIVOTCACHEFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +class PivotCache; +class PivotCacheField; + +// ============================================================================ + +class OoxPivotCacheFieldContext : public OoxWorkbookContextBase +{ +public: + explicit OoxPivotCacheFieldContext( + OoxWorkbookFragmentBase& rFragment, + PivotCacheField& rCacheField ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onStartRecord( RecordInputStream& rStrm ); + +private: + PivotCacheField& mrCacheField; +}; + +// ============================================================================ + +class OoxPivotCacheDefinitionFragment : public OoxWorkbookFragmentBase +{ +public: + explicit OoxPivotCacheDefinitionFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath, + PivotCache& rPivotCache ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + virtual void finalizeImport(); + +private: + PivotCache& mrPivotCache; +}; + +// ============================================================================ + +class OoxPivotCacheRecordsFragment : public OoxWorksheetFragmentBase +{ +public: + explicit OoxPivotCacheRecordsFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath, + const PivotCache& rPivotCache ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + +private: + void startCacheRecord(); + void importPCRecord( RecordInputStream& rStrm ); + void importPCRecordItem( sal_Int32 nRecId, RecordInputStream& rStrm ); + +private: + const PivotCache& mrPivotCache; + sal_Int32 mnCol; + sal_Int32 mnRow; + bool mbInRecord; +}; + +// ============================================================================ +// ============================================================================ + +class BiffPivotCacheFragment : public BiffWorkbookFragmentBase +{ +public: + explicit BiffPivotCacheFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rStrmName, + PivotCache& rPivotCache ); + + /** Imports the entire fragment, returns true, if EOF record has been reached. */ + virtual bool importFragment(); + +private: + PivotCache& mrPivotCache; +}; + +// ============================================================================ + +class BiffPivotCacheRecordsContext : public BiffWorksheetContextBase +{ +public: + explicit BiffPivotCacheRecordsContext( + const BiffWorkbookFragmentBase& rFragment, + const PivotCache& rPivotCache ); + + /** Reads the current record from stream and tries to insert a cell into + the source data sheet. */ + virtual void importRecord(); + +private: + void startNextRow(); + +private: + typedef ::std::vector< sal_Int32 > ColumnIndexVector; + + const PivotCache& mrPivotCache; + ColumnIndexVector maUnsharedCols; /// Column indexes of all unshared cache fields. + size_t mnColIdx; /// Current index into maUnsharedCols. + sal_Int32 mnRow; /// Current row in source data (0-based). + bool mbHasShared; /// True = pivot cache contains fields with shared items. + bool mbInRow; /// True = a data row has been started. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/pivottablebuffer.hxx b/oox/inc/oox/xls/pivottablebuffer.hxx new file mode 100644 index 000000000000..6fde212f0018 --- /dev/null +++ b/oox/inc/oox/xls/pivottablebuffer.hxx @@ -0,0 +1,449 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_PIVOTTABLEBUFFER_HXX +#define OOX_XLS_PIVOTTABLEBUFFER_HXX + +#include <com/sun/star/table/CellRangeAddress.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/pivotcachebuffer.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace sheet { class XDataPilotDescriptor; } + namespace sheet { class XDataPilotField; } +} } } + +namespace oox { +namespace xls { + +class PivotTable; + +// ============================================================================ + +struct PTFieldItemModel +{ + sal_Int32 mnCacheItem; /// Index to shared item in pivot cache. + sal_Int32 mnType; /// Type of the item. + bool mbShowDetails; /// True = show item details (items of child fields). + bool mbHidden; /// True = item is hidden. + + explicit PTFieldItemModel(); + + /** Sets item type for BIFF/OOBIN import. */ + void setBinType( sal_uInt16 nType ); +}; + +// ---------------------------------------------------------------------------- + +struct PTFieldModel +{ + sal_Int32 mnAxis; /// Axis this field is assigned to (none, row, column, page). + sal_Int32 mnNumFmtId; /// Number format for field items. + sal_Int32 mnAutoShowItems; /// Number of items (or percent/sum) to be shown in auto show filter. + sal_Int32 mnAutoShowRankBy; /// Index of the data field auto show filter is based on. + sal_Int32 mnSortType; /// Autosorting type. + sal_Int32 mnSortRefField; /// Reference field for autosorting. + sal_Int32 mnSortRefItem; /// Item in reference field for autosorting. + bool mbDataField; /// True = field appears in data area. + bool mbDefaultSubtotal; /// True = show default subtotals. + bool mbSumSubtotal; /// True = show sum subtotals. + bool mbCountASubtotal; /// True = show count all subtotals. + bool mbAverageSubtotal; /// True = show average subtotals. + bool mbMaxSubtotal; /// True = show maximum subtotals. + bool mbMinSubtotal; /// True = show minimum subtotals. + bool mbProductSubtotal; /// True = show product subtotals. + bool mbCountSubtotal; /// True = show count numbers subtotals. + bool mbStdDevSubtotal; /// True = show standard deviation subtotals. + bool mbStdDevPSubtotal; /// True = show standard deviation of population subtotals. + bool mbVarSubtotal; /// True = show variance subtotals. + bool mbVarPSubtotal; /// True = show variance of population subtotals. + bool mbShowAll; /// True = show items without data. + bool mbOutline; /// True = show in outline view, false = show in tabular view. + bool mbSubtotalTop; /// True = show subtotals on top of items in outline or compact mode. + bool mbInsertBlankRow; /// True = insert blank rows after items. + bool mbInsertPageBreak; /// True = insert page breaks after items. + bool mbAutoShow; /// True = auto show (top 10) filter enabled. + bool mbTopAutoShow; /// True = auto show filter shows top entries, false = bottom. + bool mbMultiPageItems; /// True = multiple items selectable in page diemsion. + + explicit PTFieldModel(); + + /** Sets axis type for BIFF/OOBIN import. */ + void setBinAxis( sal_uInt8 nAxisFlags ); +}; + +// ---------------------------------------------------------------------------- + +struct PTPageFieldModel +{ + ::rtl::OUString maName; /// Unique name of the page field. + sal_Int32 mnField; /// Base pivot field. + sal_Int32 mnItem; /// Index of field item that is shown by the page field. + + explicit PTPageFieldModel(); +}; + +// ---------------------------------------------------------------------------- + +struct PTDataFieldModel +{ + ::rtl::OUString maName; /// Name of the data field. + sal_Int32 mnField; /// Base pivot field. + sal_Int32 mnSubtotal; /// Subtotal aggregation function. + sal_Int32 mnShowDataAs; /// Show data as, based on another field. + sal_Int32 mnBaseField; /// Base field for 'show data as'. + sal_Int32 mnBaseItem; /// Base item for 'show data as'. + sal_Int32 mnNumFmtId; /// Number format for the result. + + explicit PTDataFieldModel(); + + /** Sets the subtotal aggregation function for BIFF/OOBIN import. */ + void setBinSubtotal( sal_Int32 nSubtotal ); + /** Sets the 'show data as' type for BIFF/OOBIN import. */ + void setBinShowDataAs( sal_Int32 nShowDataAs ); +}; + +// ---------------------------------------------------------------------------- + +class PivotTableField : public WorkbookHelper +{ +public: + explicit PivotTableField( PivotTable& rPivotTable, sal_Int32 nFieldIndex ); + + /** Imports pivot field settings from the pivotField element. */ + void importPivotField( const AttributeList& rAttribs ); + /** Imports settings of an item in this pivot field from the item element. */ + void importItem( const AttributeList& rAttribs ); + /** Imports pivot field reference settings from the reference element. */ + void importReference( const AttributeList& rAttribs ); + /** Imports pivot field item reference settings from the x element. */ + void importReferenceItem( const AttributeList& rAttribs ); + + /** Imports pivot field settings from the PTFIELD record. */ + void importPTField( RecordInputStream& rStrm ); + /** Imports settings of an item in this pivot field from the PTFITEM record. */ + void importPTFItem( RecordInputStream& rStrm ); + /** Imports pivot field reference settings from the PTREFERENCE record. */ + void importPTReference( RecordInputStream& rStrm ); + /** Imports pivot field item reference settings from the PTREFERENCEITEM record. */ + void importPTReferenceItem( RecordInputStream& rStrm ); + + /** Imports pivot field settings from the PTFIELD and following records. */ + void importPTField( BiffInputStream& rStrm ); + /** Imports pivot field settings from the PTFIELD2 record. */ + void importPTField2( BiffInputStream& rStrm ); + /** Imports settings of an item in this pivot field from the PTFITEM record. */ + void importPTFItem( BiffInputStream& rStrm ); + + /** Finalizes the field after import, creates grouping and other settings. */ + void finalizeImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotDescriptor >& rxDPDesc ); + /** Finalizes the grouped date field after import. */ + void finalizeDateGroupingImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxBaseDPField, + sal_Int32 nBaseFieldIdx ); + /** Finalizes the grouped field after import. */ + void finalizeParentGroupingImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxBaseDPField, + PivotCacheGroupItemVector& orItemNames ); + + /** Returns the name of the DataPilot field in the fields collection. */ + inline const ::rtl::OUString& getDPFieldName() const { return maDPFieldName; } + + /** Converts dimension and other settings for a row field. */ + void convertRowField(); + /** Converts dimension and other settings for a column field. */ + void convertColField(); + /** Converts dimension and other settings for a hidden field. */ + void convertHiddenField(); + /** Converts dimension and other settings for a page field */ + void convertPageField( const PTPageFieldModel& rPageField ); + /** Converts dimension and other settings for a data field. */ + void convertDataField( const PTDataFieldModel& rDataField ); + +private: + /** Converts dimension and other settings for row, column, page, or hidden fields. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField > + convertRowColPageField( sal_Int32 nAxis ); + +private: + typedef ::std::vector< PTFieldItemModel > ItemModelVector; + + PivotTable& mrPivotTable; /// The parent pivot table object. + ItemModelVector maItems; /// All items of this field. + PTFieldModel maModel; /// Pivot field settings. + ::rtl::OUString maDPFieldName; /// Name of the field in DataPilot field collection. + sal_Int32 mnFieldIndex; /// Zero-based index of this field. +}; + +// ============================================================================ + +struct PTFilterModel +{ + ::rtl::OUString maName; /// Name of the field filter. + ::rtl::OUString maDescription; /// Description of the field filter. + ::rtl::OUString maStrValue1; /// First string value for label filter. + ::rtl::OUString maStrValue2; /// Second string value for label filter. + double mfValue; /// Number of items or percent or sum to be shown. + sal_Int32 mnField; /// Base pivot field. + sal_Int32 mnMemPropField; /// Member property field. + sal_Int32 mnType; /// Filter type. + sal_Int32 mnEvalOrder; /// Evaluation order index. + sal_Int32 mnId; /// Unique identifier. + sal_Int32 mnMeasureField; /// Data field for filter calculation. + sal_Int32 mnMeasureHier; /// Hierarchy for filter calculation. + bool mbTopFilter; /// True = filter shows top entries, false = bottom. + + explicit PTFilterModel(); +}; + +// ---------------------------------------------------------------------------- + +class PivotTableFilter : public WorkbookHelper +{ +public: + explicit PivotTableFilter( const PivotTable& rPivotTable ); + + /** Reads the settings of a field filter from the filter element. */ + void importFilter( const AttributeList& rAttribs ); + /** Reads additional settings of a field filter from the top10 element. */ + void importTop10( const AttributeList& rAttribs ); + + /** Reads the settings of a field filter from the PTFILTER record. */ + void importPTFilter( RecordInputStream& rStrm ); + /** Reads additional settings of a field filter from the TOP10FILTER record. */ + void importTop10Filter( RecordInputStream& rStrm ); + + /** Applies the filter to the associated pivot table field if possible. */ + void finalizeImport(); + +private: + const PivotTable& mrPivotTable; + PTFilterModel maModel; +}; + +// ============================================================================ + +struct PTDefinitionModel +{ + ::rtl::OUString maName; + ::rtl::OUString maDataCaption; + ::rtl::OUString maGrandTotalCaption; + ::rtl::OUString maRowHeaderCaption; + ::rtl::OUString maColHeaderCaption; + ::rtl::OUString maErrorCaption; + ::rtl::OUString maMissingCaption; + ::rtl::OUString maPageStyle; + ::rtl::OUString maPivotTableStyle; + ::rtl::OUString maVacatedStyle; + ::rtl::OUString maTag; + sal_Int32 mnCacheId; + sal_Int32 mnDataPosition; + sal_Int32 mnPageWrap; + sal_Int32 mnIndent; + sal_Int32 mnChartFormat; + sal_uInt16 mnRowFields; + sal_uInt16 mnColFields; + bool mbDataOnRows; + bool mbShowError; + bool mbShowMissing; + bool mbShowItems; + bool mbDisableFieldList; + bool mbShowCalcMembers; + bool mbVisualTotals; + bool mbShowDataDropDown; + bool mbShowDrill; + bool mbPrintDrill; + bool mbEnableDrill; + bool mbPreserveFormatting; + bool mbPageOverThenDown; + bool mbSubtotalHiddenItems; + bool mbRowGrandTotals; + bool mbColGrandTotals; + bool mbFieldPrintTitles; + bool mbItemPrintTitles; + bool mbMergeItem; + bool mbShowEmptyRow; + bool mbShowEmptyCol; + bool mbShowHeaders; + bool mbFieldListSortAsc; + bool mbCustomListSort; + + explicit PTDefinitionModel(); +}; + +// ---------------------------------------------------------------------------- + +struct PTLocationModel +{ + ::com::sun::star::table::CellRangeAddress + maRange; /// Target cell range for the pivot table. + sal_Int32 mnFirstHeaderRow; /// First row of header cells (relative in pivot table). + sal_Int32 mnFirstDataRow; /// First row of data cells (relative in pivot table). + sal_Int32 mnFirstDataCol; /// First column of data cells (relative in pivot table). + sal_Int32 mnRowPageCount; /// Number of rows in page filter area. + sal_Int32 mnColPageCount; /// Number of columns in page filter area. + + explicit PTLocationModel(); +}; + +// ---------------------------------------------------------------------------- + +class PivotTable : public WorkbookHelper +{ +public: + explicit PivotTable( const WorkbookHelper& rHelper ); + + /** Reads global pivot table settings from the pivotTableDefinition element. */ + void importPivotTableDefinition( const AttributeList& rAttribs ); + /** Reads the location of the pivot table from the location element. */ + void importLocation( const AttributeList& rAttribs, sal_Int16 nSheet ); + /** Reads the index of a field located in the row dimension. */ + void importRowField( const AttributeList& rAttribs ); + /** Reads the index of a field located in the column dimension. */ + void importColField( const AttributeList& rAttribs ); + /** Reads the settings of a field located in the page dimension from the pageField element. */ + void importPageField( const AttributeList& rAttribs ); + /** Reads the settings of a field located in the data dimension from the dataField element. */ + void importDataField( const AttributeList& rAttribs ); + + /** Reads global pivot table settings from the PTDEFINITION record. */ + void importPTDefinition( RecordInputStream& rStrm ); + /** Reads the location of the pivot table from the PTLOCATION record. */ + void importPTLocation( RecordInputStream& rStrm, sal_Int16 nSheet ); + /** Reads the indexes of all fields located in the row dimension from a PTROWFIELDS record. */ + void importPTRowFields( RecordInputStream& rStrm ); + /** Reads the indexes of all fields located in the column dimension from a PTCOLFIELDS record. */ + void importPTColFields( RecordInputStream& rStrm ); + /** Reads the settings of a field located in the page dimension from the PTPAGEFIELD record. */ + void importPTPageField( RecordInputStream& rStrm ); + /** Reads the settings of a field located in the data dimension from the PTDATAFIELD record. */ + void importPTDataField( RecordInputStream& rStrm ); + + /** Reads global pivot table settings from the PTDEFINITION record. */ + void importPTDefinition( BiffInputStream& rStrm, sal_Int16 nSheet ); + /** Reads additional global pivot table settings from the PTDEFINITION2 record. */ + void importPTDefinition2( BiffInputStream& rStrm ); + /** Reads the indexes of all fields located in the row or column dimension from a PTROWCOLFIELDS record. */ + void importPTRowColFields( BiffInputStream& rStrm ); + /** Reads the settings of all fields located in the page dimension from a PTPAGEFIELDS record. */ + void importPTPageFields( BiffInputStream& rStrm ); + /** Reads the settings of a field located in the data dimension from a PTDATAFIELD record. */ + void importPTDataField( BiffInputStream& rStrm ); + + /** Creates and returns a new pivot table field. */ + PivotTableField& createTableField(); + /** Creates and returns a new pivot table filter. */ + PivotTableFilter& createTableFilter(); + /** Inserts the pivot table into the sheet. */ + void finalizeImport(); + /** Creates all date group fields for the specified cache field after import. */ + void finalizeDateGroupingImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxBaseDPField, + sal_Int32 nBaseFieldIdx ); + /** Creates all grouped fields for the specified cache field after import. */ + void finalizeParentGroupingImport( + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxBaseDPField, + const PivotCacheField& rBaseCacheField, + PivotCacheGroupItemVector& orItemNames ); + + /** Returns the associated data pilot field for the specified pivot table field. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField > + getDataPilotField( const ::rtl::OUString& rFieldName ) const; + /** Returns the associated data pilot field for the specified pivot table field. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField > + getDataPilotField( sal_Int32 nFieldIdx ) const; + /** Returns the data layout field used to store all data fields in row/col dimension. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField > + getDataLayoutField() const; + + /** Returns the cache field with the specified index. */ + const PivotCacheField* getCacheField( sal_Int32 nFieldIdx ) const; + /** Returns the base cache field of the data field item with the specified index. */ + const PivotCacheField* getCacheFieldOfDataField( sal_Int32 nDataItemIdx ) const; + /** Returns the source column index of the pivot field with the passed index, or -1. */ + sal_Int32 getCacheDatabaseIndex( sal_Int32 nFieldIdx ) const; + +private: + typedef RefVector< PivotTableField > PivotTableFieldVector; + typedef RefVector< PivotTableFilter > PivotTableFilterVector; + typedef ::std::vector< sal_Int32 > IndexVector; + typedef ::std::vector< PTPageFieldModel > PageFieldVector; + typedef ::std::vector< PTDataFieldModel > DataFieldVector; + +private: + /** Returns a pivot table field by its index. */ + PivotTableField* getTableField( sal_Int32 nFieldIdx ); + + /** Reads a field index for the row or column dimension. */ + static void importField( IndexVector& orFields, const AttributeList& rAttribs ); + /** Reads an array of field indexes for the row or column dimension. */ + static void importFields( IndexVector& orFields, RecordInputStream& rStrm ); + /** Reads an array of field indexes for the row or column dimension. */ + static void importFields( IndexVector& orFields, BiffInputStream& rStrm, sal_Int32 nCount ); + +private: + PivotTableFieldVector maFields; /// All pivot table fields. + PivotTableField maDataField; /// Data layout field. + IndexVector maRowFields; /// Indexes to fields in row dimension. + IndexVector maColFields; /// Indexes to fields in column dimension. + PageFieldVector maPageFields; /// Settings for all fields in page dimension. + DataFieldVector maDataFields; /// Settings for all fields in data area. + PivotTableFilterVector maFilters; /// All field filters. + PTDefinitionModel maDefModel; /// Global pivot table settings. + PTLocationModel maLocationModel; /// Location settings of the pivot table. + const PivotCache* mpPivotCache; /// The pivot cache this table is based on. + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotDescriptor > + mxDPDescriptor; /// Descriptor of the DataPilot object. +}; + +// ============================================================================ + +class PivotTableBuffer : public WorkbookHelper +{ +public: + explicit PivotTableBuffer( const WorkbookHelper& rHelper ); + + /** Creates and returns a new pivot table. */ + PivotTable& createPivotTable(); + + /** Inserts all pivot tables into the sheet. */ + void finalizeImport(); + +private: + typedef RefVector< PivotTable > PivotTableVector; + PivotTableVector maTables; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/pivottablefragment.hxx b/oox/inc/oox/xls/pivottablefragment.hxx new file mode 100644 index 000000000000..59c86b4ba3cb --- /dev/null +++ b/oox/inc/oox/xls/pivottablefragment.hxx @@ -0,0 +1,118 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_PIVOTTABLEFRAGMENT_HXX +#define OOX_XLS_PIVOTTABLEFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" +#include "oox/xls/worksheethelper.hxx" + +namespace oox { +namespace xls { + +class PivotTable; +class PivotTableField; +class PivotTableFilter; + +// ============================================================================ + +class OoxPivotTableFieldContext : public OoxWorksheetContextBase +{ +public: + explicit OoxPivotTableFieldContext( + OoxWorksheetFragmentBase& rFragment, + PivotTableField& rTableField ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onStartRecord( RecordInputStream& rStrm ); + +private: + PivotTableField& mrTableField; +}; + +// ============================================================================ + +class OoxPivotTableFilterContext : public OoxWorksheetContextBase +{ +public: + explicit OoxPivotTableFilterContext( + OoxWorksheetFragmentBase& rFragment, + PivotTableFilter& rTableFilter ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onStartRecord( RecordInputStream& rStrm ); + +private: + PivotTableFilter& mrTableFilter; +}; + +// ============================================================================ + +class OoxPivotTableFragment : public OoxWorksheetFragmentBase +{ +public: + explicit OoxPivotTableFragment( + const WorksheetHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + +private: + PivotTable& mrPivotTable; +}; + +// ============================================================================ +// ============================================================================ + +class BiffPivotTableContext : public BiffWorksheetContextBase +{ +public: + explicit BiffPivotTableContext( const BiffWorksheetFragmentBase& rFragment, PivotTable& rPivotTable ); + + /** Imports all records related to the current pivot table. */ + virtual void importRecord(); + +private: + PivotTable& mrPivotTable; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/querytablefragment.hxx b/oox/inc/oox/xls/querytablefragment.hxx new file mode 100644 index 000000000000..3702069b4859 --- /dev/null +++ b/oox/inc/oox/xls/querytablefragment.hxx @@ -0,0 +1,57 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_QUERYTABLEFRAGMENT_HXX +#define OOX_XLS_QUERYTABLEFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxQueryTableFragment : public OoxWorkbookFragmentBase +{ +public: + explicit OoxQueryTableFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/richstring.hxx b/oox/inc/oox/xls/richstring.hxx new file mode 100644 index 000000000000..6293aac4d340 --- /dev/null +++ b/oox/inc/oox/xls/richstring.hxx @@ -0,0 +1,295 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_RICHSTRING_HXX +#define OOX_XLS_RICHSTRING_HXX + +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/stylesbuffer.hxx" + +namespace com { namespace sun { namespace star { + namespace text { class XText; } +} } } + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Flags used to specify import/export mode of strings. */ +typedef sal_Int32 BiffStringFlags; + +const BiffStringFlags BIFF_STR_DEFAULT = 0x0000; /// Default string settings. +const BiffStringFlags BIFF_STR_FORCEUNICODE = 0x0001; /// Always use UCS-2 characters (default: try to compress). BIFF8 export only. +const BiffStringFlags BIFF_STR_8BITLENGTH = 0x0002; /// 8-bit string length field (default: 16-bit). +const BiffStringFlags BIFF_STR_SMARTFLAGS = 0x0004; /// Omit flags on empty string (default: read/write always). BIFF8 only. +const BiffStringFlags BIFF_STR_KEEPFONTS = 0x0008; /// Keep old fonts when reading unformatted string (default: clear fonts). Import only. +const BiffStringFlags BIFF_STR_EXTRAFONTS = 0x0010; /// Read trailing rich-string font array (default: nothing). BIFF2-BIFF5 import only. + +// ============================================================================ + +/** Contains text data and font attributes for a part of a rich formatted string. */ +class RichStringPortion : public WorkbookHelper +{ +public: + explicit RichStringPortion( const WorkbookHelper& rHelper ); + + /** Sets text data for this portion. */ + void setText( const ::rtl::OUString& rText ); + /** Creates and returns a new font formatting object. */ + FontRef createFont(); + /** Links this portion to a font object from the global font list. */ + void setFontId( sal_Int32 nFontId ); + + /** Final processing after import of all strings. */ + void finalizeImport(); + + /** Returns the text data of this portion. */ + inline const ::rtl::OUString& getText() const { return maText; } + + /** Converts the portion and appends it to the passed XText. */ + void convert( + const ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >& rxText, + sal_Int32 nXfId ); + +private: + ::rtl::OUString maText; /// Portion text. + FontRef mxFont; /// Embedded portion font, may be empty. + sal_Int32 mnFontId; /// Link to global font list. +}; + +typedef ::boost::shared_ptr< RichStringPortion > RichStringPortionRef; + +// ---------------------------------------------------------------------------- + +enum BiffFontPortionMode +{ + BIFF_FONTPORTION_8BIT, /// Font portion with 8-bit values. + BIFF_FONTPORTION_16BIT, /// Font portion with 16-bit values. + BIFF_FONTPORTION_OBJ /// Font portion in OBJ or TXO record. +}; + +// ---------------------------------------------------------------------------- + +/** Represents a position in a rich-string containing current font identifier. + + This object stores the position of a formatted character in a rich-string + and the identifier of a font from the global font list used to format this + and the following characters. Used in binary filters only. + */ +struct FontPortionModel +{ + sal_Int32 mnPos; /// First character in the string. + sal_Int32 mnFontId; /// Font identifier for the next characters. + + explicit inline FontPortionModel() : mnPos( 0 ), mnFontId( -1 ) {} + explicit inline FontPortionModel( sal_Int32 nPos, sal_Int32 nFontId ) : + mnPos( nPos ), mnFontId( nFontId ) {} + + void read( RecordInputStream& rStrm ); + void read( BiffInputStream& rStrm, BiffFontPortionMode eMode ); +}; + +// ---------------------------------------------------------------------------- + +/** A vector with all font portions in a rich-string. */ +class FontPortionModelList : public ::std::vector< FontPortionModel > +{ +public: + inline explicit FontPortionModelList() {} + + /** Appends a rich-string font identifier. */ + void appendPortion( const FontPortionModel& rPortion ); + /** Reads count and font identifiers from the passed stream. */ + void importPortions( RecordInputStream& rStrm ); + /** Reads nCount font identifiers from the passed stream. */ + void importPortions( BiffInputStream& rStrm, sal_uInt16 nCount, BiffFontPortionMode eMode ); + /** Reads count and font identifiers from the passed stream. */ + void importPortions( BiffInputStream& rStrm, bool b16Bit ); +}; + +// ============================================================================ + +struct PhoneticDataModel +{ + sal_Int32 mnFontId; /// Font identifier for text formatting. + sal_Int32 mnType; /// Phonetic text type. + sal_Int32 mnAlignment; /// Phonetic portion alignment. + + explicit PhoneticDataModel(); + + /** Sets the passed data from binary import. */ + void setBinData( sal_Int32 nType, sal_Int32 nAlignment ); +}; + +// ---------------------------------------------------------------------------- + +class PhoneticSettings : public WorkbookHelper +{ +public: + explicit PhoneticSettings( const WorkbookHelper& rHelper ); + + /** Imports phonetic settings from the phoneticPr element. */ + void importPhoneticPr( const AttributeList& rAttribs ); + /** Imports phonetic settings from the PHONETICPR record. */ + void importPhoneticPr( RecordInputStream& rStrm ); + /** Imports phonetic settings from the PHONETICPR record. */ + void importPhoneticPr( BiffInputStream& rStrm ); + + /** Imports phonetic settings from a rich string. */ + void importStringData( RecordInputStream& rStrm ); + /** Imports phonetic settings from a rich string. */ + void importStringData( BiffInputStream& rStrm ); + +private: + PhoneticDataModel maModel; +}; + +// ============================================================================ + +/** Contains text data and positioning information for a phonetic text portion. */ +class RichStringPhonetic : public WorkbookHelper +{ +public: + explicit RichStringPhonetic( const WorkbookHelper& rHelper ); + + /** Sets text data for this phonetic portion. */ + void setText( const ::rtl::OUString& rText ); + /** Imports attributes of a phonetic run (rPh element). */ + void importPhoneticRun( const AttributeList& rAttribs ); + /** Sets the associated range in base text for this phonetic portion. */ + void setBaseRange( sal_Int32 nBasePos, sal_Int32 nBaseEnd ); + +private: + ::rtl::OUString maText; /// Portion text. + sal_Int32 mnBasePos; /// Start position in base text. + sal_Int32 mnBaseEnd; /// One-past-end position in base text. +}; + +typedef ::boost::shared_ptr< RichStringPhonetic > RichStringPhoneticRef; + +// ---------------------------------------------------------------------------- + +/** Represents a phonetic text portion in a rich-string with phonetic text. + Used in binary filters only. */ +struct PhoneticPortionModel +{ + sal_Int32 mnPos; /// First character in phonetic text. + sal_Int32 mnBasePos; /// First character in base text. + sal_Int32 mnBaseLen; /// Number of characters in base text. + + explicit inline PhoneticPortionModel() : mnPos( -1 ), mnBasePos( -1 ), mnBaseLen( 0 ) {} + explicit inline PhoneticPortionModel( sal_Int32 nPos, sal_Int32 nBasePos, sal_Int32 nBaseLen ) : + mnPos( nPos ), mnBasePos( nBasePos ), mnBaseLen( nBaseLen ) {} + + void read( RecordInputStream& rStrm ); + void read( BiffInputStream& rStrm ); +}; + +// ---------------------------------------------------------------------------- + +/** A vector with all phonetic portions in a rich-string. */ +class PhoneticPortionModelList : public ::std::vector< PhoneticPortionModel > +{ +public: + inline explicit PhoneticPortionModelList() {} + + /** Appends a rich-string phonetic portion. */ + void appendPortion( const PhoneticPortionModel& rPortion ); + /** Reads all phonetic portions from the passed stream. */ + void importPortions( RecordInputStream& rStrm ); + /** Reads phonetic portion data from the passed stream. */ + ::rtl::OUString importPortions( BiffInputStream& rStrm, sal_Int32 nPhoneticSize ); +}; + +// ============================================================================ + +/** Contains string data and a list of formatting runs for a rich formatted string. */ +class RichString : public WorkbookHelper +{ +public: + explicit RichString( const WorkbookHelper& rHelper ); + + /** Appends and returns a portion object for a plain string (t element). */ + RichStringPortionRef importText( const AttributeList& rAttribs ); + /** Appends and returns a portion object for a new formatting run (r element). */ + RichStringPortionRef importRun( const AttributeList& rAttribs ); + /** Appends and returns a phonetic text object for a new phonetic run (rPh element). */ + RichStringPhoneticRef importPhoneticRun( const AttributeList& rAttribs ); + /** Imports phonetic settings from the rPhoneticPr element. */ + void importPhoneticPr( const AttributeList& rAttribs ); + + /** Imports a Unicode rich-string from the passed record stream. */ + void importString( RecordInputStream& rStrm, bool bRich ); + + /** Imports a byte string from the passed BIFF stream. */ + void importByteString( BiffInputStream& rStrm, rtl_TextEncoding eDefaultTextEnc, BiffStringFlags nFlags = BIFF_STR_DEFAULT ); + /** Imports a Unicode rich-string from the passed BIFF stream. */ + void importUniString( BiffInputStream& rStrm, BiffStringFlags nFlags = BIFF_STR_DEFAULT ); + + /** Final processing after import of all strings. */ + void finalizeImport(); + + /** Returns the plain text concatenated from all string portions. */ + ::rtl::OUString getPlainText() const; + + /** Converts the string and writes it into the passed XText. */ + void convert( + const ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >& rxText, + sal_Int32 nXfId ) const; + +private: + /** Creates, appends, and returns a new empty string portion. */ + RichStringPortionRef createPortion(); + /** Creates, appends, and returns a new empty phonetic text portion. */ + RichStringPhoneticRef createPhonetic(); + + /** Create base text portions from the passed string and character formatting. */ + void createFontPortions( const ::rtl::OString& rText, rtl_TextEncoding eDefaultTextEnc, FontPortionModelList& rPortions ); + /** Create base text portions from the passed string and character formatting. */ + void createFontPortions( const ::rtl::OUString& rText, FontPortionModelList& rPortions ); + /** Create phonetic text portions from the passed string and portion data. */ + void createPhoneticPortions( const ::rtl::OUString& rText, PhoneticPortionModelList& rPortions, sal_Int32 nBaseLen ); + +private: + typedef RefVector< RichStringPortion > PortionVec; + typedef RefVector< RichStringPhonetic > PhoneticVec; + + PortionVec maFontPortions; /// String portions with font data. + PhoneticSettings maPhonSettings; /// Phonetic settings for this string. + PhoneticVec maPhonPortions; /// Phonetic text portions. +}; + +typedef ::boost::shared_ptr< RichString > RichStringRef; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/richstringcontext.hxx b/oox/inc/oox/xls/richstringcontext.hxx new file mode 100644 index 000000000000..53882641df7e --- /dev/null +++ b/oox/inc/oox/xls/richstringcontext.hxx @@ -0,0 +1,74 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_RICHSTRINGCONTEXT_HXX +#define OOX_XLS_RICHSTRINGCONTEXT_HXX + +#include "oox/xls/excelhandlers.hxx" +#include "oox/xls/richstring.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxRichStringContext : public OoxWorkbookContextBase +{ +public: + template< typename ParentType > + explicit OoxRichStringContext( ParentType& rParent, RichStringRef xString ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + +private: + RichStringRef mxString; /// Processed string. + RichStringPortionRef mxPortion; /// Processed portion in the string. + RichStringPhoneticRef mxPhonetic; /// Processed phonetic text portion. + FontRef mxFont; /// Processed font of the portion. +}; + +// ---------------------------------------------------------------------------- + +template< typename ParentType > +OoxRichStringContext::OoxRichStringContext( ParentType& rParent, RichStringRef xString ) : + OoxWorkbookContextBase( rParent ), + mxString( xString ) +{ + OSL_ENSURE( mxString.get(), "OoxRichStringContext::OoxRichStringContext - missing string object" ); +} + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/scenariobuffer.hxx b/oox/inc/oox/xls/scenariobuffer.hxx new file mode 100644 index 000000000000..8c2e0b0f1065 --- /dev/null +++ b/oox/inc/oox/xls/scenariobuffer.hxx @@ -0,0 +1,155 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_SCENARIOBUFFER_HXX +#define OOX_XLS_SCENARIOBUFFER_HXX + +#include <com/sun/star/table/CellAddress.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +struct ScenarioCellModel +{ + ::com::sun::star::table::CellAddress maPos; + ::rtl::OUString maValue; + sal_Int32 mnNumFmtId; + bool mbDeleted; + + explicit ScenarioCellModel(); +}; + +// ---------------------------------------------------------------------------- + +struct ScenarioModel +{ + ::rtl::OUString maName; /// Name of the scenario. + ::rtl::OUString maComment; /// Comment. + ::rtl::OUString maUser; /// Name of user created the scenario. + bool mbLocked; /// True = input cell values locked. + bool mbHidden; /// True = scenario is hidden. + + explicit ScenarioModel(); +}; + +// ---------------------------------------------------------------------------- + +class Scenario : public WorkbookHelper +{ +public: + explicit Scenario( const WorkbookHelper& rHelper, sal_Int16 nSheet ); + + /** Imports a scenario definition from a scenario element. */ + void importScenario( const AttributeList& rAttribs ); + /** Imports a new cell for this scenario from a inputCells element. */ + void importInputCells( const AttributeList& rAttribs ); + + /** Imports a scenario definition from a SCENARIO record. */ + void importScenario( RecordInputStream& rStrm ); + /** Imports a new cell for this scenario from a INPUTCELLS record. */ + void importInputCells( RecordInputStream& rStrm ); + + /** Imports a scenario definition from a SCENARIO record. */ + void importScenario( BiffInputStream& rStrm ); + + /** Creates the scenario in the Calc document. */ + void finalizeImport(); + +private: + typedef ::std::vector< ScenarioCellModel > ScenarioCellVector; + + ScenarioCellVector maCells; /// Scenario cells. + ScenarioModel maModel; /// Scenario model data. + sal_Int16 mnSheet; /// Index of the sheet this scenario is based on. +}; + +// ============================================================================ + +struct SheetScenariosModel +{ + sal_Int32 mnCurrent; /// Selected scenario. + sal_Int32 mnShown; /// Visible scenario. + + explicit SheetScenariosModel(); +}; + +// ---------------------------------------------------------------------------- + +class SheetScenarios : public WorkbookHelper +{ +public: + explicit SheetScenarios( const WorkbookHelper& rHelper, sal_Int16 nSheet ); + + /** Imports sheet scenario settings from a scenarios element. */ + void importScenarios( const AttributeList& rAttribs ); + /** Imports sheet scenario settings from a SCENARIOS record. */ + void importScenarios( RecordInputStream& rStrm ); + /** Imports sheet scenario settings from a SCENARIOS record. */ + void importScenarios( BiffInputStream& rStrm ); + + /** Creates and returns a new scenario in this collection. */ + Scenario& createScenario(); + + /** Creates all scenarios in the Calc sheet. */ + void finalizeImport(); + +private: + typedef RefVector< Scenario > ScenarioVector; + ScenarioVector maScenarios; + SheetScenariosModel maModel; + sal_Int16 mnSheet; +}; + +// ============================================================================ + +class ScenarioBuffer : public WorkbookHelper +{ +public: + explicit ScenarioBuffer( const WorkbookHelper& rHelper ); + + /** Creates and returns a scenario collection for the passed sheet. */ + SheetScenarios& createSheetScenarios( sal_Int16 nSheet ); + + /** Creates all scenarios in the Calc dcument. */ + void finalizeImport(); + +private: + typedef RefMap< sal_Int16, SheetScenarios, ::std::greater< sal_Int16 > > SheetScenariosMap; + SheetScenariosMap maSheetScenarios; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/scenariocontext.hxx b/oox/inc/oox/xls/scenariocontext.hxx new file mode 100644 index 000000000000..f3286f144656 --- /dev/null +++ b/oox/inc/oox/xls/scenariocontext.hxx @@ -0,0 +1,81 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_SCENARIOCONTEXT_HXX +#define OOX_XLS_SCENARIOCONTEXT_HXX + +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +class Scenario; +class SheetScenarios; + +// ============================================================================ + +class OoxScenarioContext : public OoxWorksheetContextBase +{ +public: + explicit OoxScenarioContext( OoxWorksheetContextBase& rParent, SheetScenarios& rSheetScenarios ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onStartRecord( RecordInputStream& rStrm ); + +private: + Scenario& mrScenario; +}; + +// ============================================================================ + +class OoxScenariosContext : public OoxWorksheetContextBase +{ +public: + explicit OoxScenariosContext( OoxWorksheetFragmentBase& rFragment ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onStartElement( const AttributeList& rAttribs ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + virtual void onStartRecord( RecordInputStream& rStrm ); + +private: + SheetScenarios& mrSheetScenarios; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/sharedformulabuffer.hxx b/oox/inc/oox/xls/sharedformulabuffer.hxx new file mode 100644 index 000000000000..0f9fb0bb093e --- /dev/null +++ b/oox/inc/oox/xls/sharedformulabuffer.hxx @@ -0,0 +1,112 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_SHAREDFORMULABUFFER_HXX +#define OOX_XLS_SHAREDFORMULABUFFER_HXX + +#include <map> +#include <memory> +#include "oox/xls/worksheethelper.hxx" + +namespace com { namespace sun { namespace star { + namespace sheet { class XFormulaTokens; } + namespace sheet { class XNamedRange; } +} } } + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Formula context that supports shared formulas. */ +class ExtCellFormulaContext : public SimpleFormulaContext, public WorksheetHelper +{ +public: + explicit ExtCellFormulaContext( + const WorksheetHelper& rHelper, + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XFormulaTokens >& rxTokens, + const ::com::sun::star::table::CellAddress& rCellPos ); + + virtual void setSharedFormula( const ::com::sun::star::table::CellAddress& rBaseAddr ); +}; + +// ============================================================================ + +class SharedFormulaBuffer : public WorksheetHelper +{ +public: + explicit SharedFormulaBuffer( const WorksheetHelper& rHelper ); + + /** Imports a shared formula from a OOX formula string. */ + void importSharedFmla( const ::rtl::OUString& rFormula, + const ::rtl::OUString& rSharedRange, sal_Int32 nId, + const ::com::sun::star::table::CellAddress& rBaseAddr ); + /** Imports a shared formula from a SHAREDFORMULA record in the passed stream */ + void importSharedFmla( RecordInputStream& rStrm, + const ::com::sun::star::table::CellAddress& rBaseAddr ); + /** Imports a shared formula from a SHAREDFMLA record in the passed stream. */ + void importSharedFmla( BiffInputStream& rStrm, + const ::com::sun::star::table::CellAddress& rBaseAddr ); + + /** Inserts a shared formula with the passed base address into a cell + described by the passed formula context. */ + void setSharedFormulaCell( + ExtCellFormulaContext& rContext, + const ::com::sun::star::table::CellAddress& rBaseAddr ); + /** Inserts a shared formula with the passed base address into a cell + described by the passed formula context. */ + void setSharedFormulaCell( + ExtCellFormulaContext& rContext, + sal_Int32 nSharedId ); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange > + createDefinedName( const BinAddress& rMapKey ); + + bool implSetSharedFormulaCell( + ExtCellFormulaContext& rContext, + const BinAddress& rMapKey ); + + void updateCachedCell( + const ::com::sun::star::table::CellAddress& rBaseAddr, + const BinAddress& rMapKey ); + +private: + typedef ::std::map< BinAddress, sal_Int32 > TokenIndexMap; + typedef ::std::auto_ptr< ExtCellFormulaContext > ContextPtr; + + TokenIndexMap maIndexMap; /// Maps shared formula base address to defined name identifier. + ContextPtr mxLastContext; /// Cached formula context for leading formula cell. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/sharedstringsbuffer.hxx b/oox/inc/oox/xls/sharedstringsbuffer.hxx new file mode 100644 index 000000000000..27827ec215ed --- /dev/null +++ b/oox/inc/oox/xls/sharedstringsbuffer.hxx @@ -0,0 +1,70 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_SHAREDSTRINGSBUFFER_HXX +#define OOX_XLS_SHAREDSTRINGSBUFFER_HXX + +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/richstring.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Collects all strings from the shared strings substream. */ +class SharedStringsBuffer : public WorkbookHelper +{ +public: + explicit SharedStringsBuffer( const WorkbookHelper& rHelper ); + + /** Creates and returns a new string entry. */ + RichStringRef createRichString(); + /** Imports the complete shared string table from a BIFF file. */ + void importSst( BiffInputStream& rStrm ); + + /** Final processing after import of all strings. */ + void finalizeImport(); + + /** Converts the specified string table entry. */ + void convertString( + const ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >& rxText, + sal_Int32 nStringId, + sal_Int32 nXfId ) const; + +private: + typedef RefVector< RichString > StringVec; + StringVec maStrings; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/sharedstringsfragment.hxx b/oox/inc/oox/xls/sharedstringsfragment.hxx new file mode 100644 index 000000000000..7294643b7df5 --- /dev/null +++ b/oox/inc/oox/xls/sharedstringsfragment.hxx @@ -0,0 +1,64 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_SHAREDSTRINGSFRAGMENT_HXX +#define OOX_XLS_SHAREDSTRINGSFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxSharedStringsFragment : public OoxWorkbookFragmentBase +{ +public: + explicit OoxSharedStringsFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + virtual void finalizeImport(); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/sheetdatacontext.hxx b/oox/inc/oox/xls/sheetdatacontext.hxx new file mode 100644 index 000000000000..a77f4b285fa4 --- /dev/null +++ b/oox/inc/oox/xls/sheetdatacontext.hxx @@ -0,0 +1,174 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_SHEETDATACONTEXT_HXX +#define OOX_XLS_SHEETDATACONTEXT_HXX + +#include "oox/xls/excelhandlers.hxx" +#include "oox/xls/richstring.hxx" + +namespace com { namespace sun { namespace star { + namespace table { class XCell; } +} } } + +namespace oox { +namespace xls { + +// ============================================================================ + +/** This class implements importing the sheetData element. + + The sheetData element contains all row settings and all cells in a single + sheet of a spreadsheet document. + */ +class OoxSheetDataContext : public OoxWorksheetContextBase +{ +public: + explicit OoxSheetDataContext( OoxWorksheetFragmentBase& rFragment ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + +private: + /** Different types of cell records. */ + enum CellType { CELLTYPE_VALUE, CELLTYPE_MULTI, CELLTYPE_FORMULA }; + + /** Imports row settings from a row element. */ + void importRow( const AttributeList& rAttribs ); + /** Imports cell settings from a c element. */ + void importCell( const AttributeList& rAttribs ); + /** Imports cell settings from an f element. */ + void importFormula( const AttributeList& rAttribs ); + + /** Imports a cell address and the following XF identifier. */ + void importCellHeader( RecordInputStream& rStrm, CellType eCellType ); + /** Imports an empty cell from a CELL_BLANK or MULTCELL_BLANK record. */ + void importCellBlank( RecordInputStream& rStrm, CellType eCellType ); + /** Imports a boolean cell from a CELL_BOOL, MULTCELL_BOOL, or FORMULA_BOOL record. */ + void importCellBool( RecordInputStream& rStrm, CellType eCellType ); + /** Imports a numeric cell from a CELL_DOUBLE, MULTCELL_DOUBLE, or FORMULA_DOUBLE record. */ + void importCellDouble( RecordInputStream& rStrm, CellType eCellType ); + /** Imports an error code cell from a CELL_ERROR, MULTCELL_ERROR, or FORMULA_ERROR record. */ + void importCellError( RecordInputStream& rStrm, CellType eCellType ); + /** Imports an encoded numeric cell from a CELL_RK or MULTCELL_RK record. */ + void importCellRk( RecordInputStream& rStrm, CellType eCellType ); + /** Imports a rich-string cell from a CELL_RSTRING or MULTCELL_RSTRING record. */ + void importCellRString( RecordInputStream& rStrm, CellType eCellType ); + /** Imports a string cell from a CELL_SI or MULTCELL_SI record. */ + void importCellSi( RecordInputStream& rStrm, CellType eCellType ); + /** Imports a string cell from a CELL_STRING, MULTCELL_STRING, or FORMULA_STRING record. */ + void importCellString( RecordInputStream& rStrm, CellType eCellType ); + + /** Imports a cell formula for the current cell. */ + void importCellFormula( RecordInputStream& rStrm ); + + /** Imports row settings from a ROW record. */ + void importRow( RecordInputStream& rStrm ); + /** Imports an array formula from an ARRAY record. */ + void importArray( RecordInputStream& rStrm ); + /** Imports a shared formula from a SHAREDFORMULA record. */ + void importSharedFmla( RecordInputStream& rStrm ); + /** Imports table operation from a DATATABLE record. */ + void importDataTable( RecordInputStream& rStrm ); + +private: + CellModel maCurrCell; /// Position and formatting of current imported cell. + DataTableModel maTableData; /// Additional data for table operation ranges. + BinAddress maCurrPos; /// Current position for binary import. + RichStringRef mxInlineStr; /// Inline rich string from 'is' element. +}; + +// ============================================================================ + +/** This class implements importing row settings and all cells of a sheet. + */ +class BiffSheetDataContext : public BiffWorksheetContextBase +{ +public: + explicit BiffSheetDataContext( const BiffWorksheetFragmentBase& rParent ); + + /** Tries to import a sheet data record. */ + virtual void importRecord(); + +private: + /** Sets current cell according to the passed address. */ + void setCurrCell( const BinAddress& rAddr ); + + /** Imports an XF identifier and sets the mnXfId member. */ + void importXfId( bool bBiff2 ); + /** Imports a BIFF cell address and the following XF identifier. */ + void importCellHeader( bool bBiff2 ); + + /** Imports a BLANK record describing a blank but formatted cell. */ + void importBlank(); + /** Imports a BOOLERR record describing a boolean or error code cell. */ + void importBoolErr(); + /** Imports a FORMULA record describing a formula cell. */ + void importFormula(); + /** Imports an INTEGER record describing a BIFF2 integer cell. */ + void importInteger(); + /** Imports a LABEL record describing an unformatted string cell. */ + void importLabel(); + /** Imports a LABELSST record describing a string cell using the shared string list. */ + void importLabelSst(); + /** Imports a MULTBLANK record describing a range of blank but formatted cells. */ + void importMultBlank(); + /** Imports a MULTRK record describing a range of numeric cells. */ + void importMultRk(); + /** Imports a NUMBER record describing a floating-point cell. */ + void importNumber(); + /** Imports an RK record describing a numeric cell. */ + void importRk(); + + /** Imports row settings from a ROW record. */ + void importRow(); + /** Imports an ARRAY record describing an array formula of a cell range. */ + void importArray(); + /** Imports a SHAREDFMLA record describing a shared formula in a cell range. */ + void importSharedFmla(); + /** Imports table operation from a DATATABLE or DATATABLE2 record. */ + void importDataTable(); + +private: + CellModel maCurrCell; /// Position and formatting of current imported cell. + sal_uInt32 mnFormulaIgnoreSize; /// Number of bytes to be ignored in FORMULA record. + sal_uInt32 mnArrayIgnoreSize; /// Number of bytes to be ignored in ARRAY record. + sal_uInt16 mnBiff2XfId; /// Current XF identifier from IXFE record. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/stylesbuffer.hxx b/oox/inc/oox/xls/stylesbuffer.hxx new file mode 100644 index 000000000000..7eb00d4bd57d --- /dev/null +++ b/oox/inc/oox/xls/stylesbuffer.hxx @@ -0,0 +1,1061 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_STYLESBUFFER_HXX +#define OOX_XLS_STYLESBUFFER_HXX + +#include <com/sun/star/awt/FontDescriptor.hpp> +#include <com/sun/star/util/CellProtection.hpp> +#include <com/sun/star/table/CellHoriJustify.hpp> +#include <com/sun/star/table/CellOrientation.hpp> +#include <com/sun/star/table/CellVertJustify.hpp> +#include <com/sun/star/table/TableBorder.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/drawingml/color.hxx" +#include "oox/xls/numberformatsbuffer.hxx" + +namespace com { namespace sun { namespace star { + namespace awt { struct FontDescrtiptor; } +} } } + +namespace oox { class PropertySet; } + +namespace oox { +namespace xls { + +// ============================================================================ + +const sal_Int32 OOX_COLOR_WINDOWTEXT3 = 24; /// System window text color (BIFF3-BIFF4). +const sal_Int32 OOX_COLOR_WINDOWBACK3 = 25; /// System window background color (BIFF3-BIFF4). +const sal_Int32 OOX_COLOR_WINDOWTEXT = 64; /// System window text color (BIFF5+). +const sal_Int32 OOX_COLOR_WINDOWBACK = 65; /// System window background color (BIFF5+). +const sal_Int32 OOX_COLOR_BUTTONBACK = 67; /// System button background color (face color). +const sal_Int32 OOX_COLOR_CHWINDOWTEXT = 77; /// System window text color (BIFF8 charts). +const sal_Int32 OOX_COLOR_CHWINDOWBACK = 78; /// System window background color (BIFF8 charts). +const sal_Int32 OOX_COLOR_CHBORDERAUTO = 79; /// Automatic frame border (BIFF8 charts). +const sal_Int32 OOX_COLOR_NOTEBACK = 80; /// Note background color. +const sal_Int32 OOX_COLOR_NOTETEXT = 81; /// Note text color. +const sal_Int32 OOX_COLOR_FONTAUTO = 0x7FFF; /// Font auto color (system window text color). + +// ---------------------------------------------------------------------------- + +const sal_Int16 API_LINE_NONE = 0; +const sal_Int16 API_LINE_HAIR = 2; +const sal_Int16 API_LINE_THIN = 35; +const sal_Int16 API_LINE_MEDIUM = 88; +const sal_Int16 API_LINE_THICK = 141; + +const sal_Int16 API_ESCAPE_NONE = 0; /// No escapement. +const sal_Int16 API_ESCAPE_SUPERSCRIPT = 101; /// Superscript: raise characters automatically (magic value 101). +const sal_Int16 API_ESCAPE_SUBSCRIPT = -101; /// Subscript: lower characters automatically (magic value -101). + +const sal_Int8 API_ESCAPEHEIGHT_NONE = 100; /// Relative character height if not escaped. +const sal_Int8 API_ESCAPEHEIGHT_DEFAULT = 58; /// Relative character height if escaped. + +// ============================================================================ + +class Color : public ::oox::drawingml::Color +{ +public: + /** Sets the color to automatic. */ + void setAuto(); + /** Sets the color to the passed RGB value. */ + void setRgb( sal_Int32 nRgbValue, double fTint = 0.0 ); + /** Sets the color to the passed theme index. */ + void setTheme( sal_Int32 nThemeIdx, double fTint = 0.0 ); + /** Sets the color to the passed palette index. */ + void setIndexed( sal_Int32 nPaletteIdx, double fTint = 0.0 ); + + /** Imports the color from the passed attribute list. */ + void importColor( const AttributeList& rAttribs ); + + /** Imports a 64-bit color from the passed binary stream. */ + void importColor( RecordInputStream& rStrm ); + /** Imports a 32-bit palette color identifier from the passed OOBIN stream. */ + void importColorId( RecordInputStream& rStrm ); + /** Imports a 32-bit RGBA color value from the passed OOBIN stream. */ + void importColorRgb( RecordInputStream& rStrm ); + + /** Imports an 8-bit or 16-bit palette color identifier from the passed BIFF stream. */ + void importColorId( BiffInputStream& rStrm, bool b16Bit = true ); + /** Imports a 32-bit RGBA color value from the passed BIFF stream. */ + void importColorRgb( BiffInputStream& rStrm ); + + /** Returns true, if the color is set to automatic. */ + inline bool isAuto() const { return isPlaceHolder(); } +}; + +// ---------------------------------------------------------------------------- + +RecordInputStream& operator>>( RecordInputStream& rStrm, Color& orColor ); + +// ============================================================================ + +/** Stores all colors of the color palette. */ +class ColorPalette : public WorkbookHelper +{ +public: + /** Constructs the color palette with predefined color values. */ + explicit ColorPalette( const WorkbookHelper& rHelper ); + + /** Appends a new color from the passed attributes. */ + void importPaletteColor( const AttributeList& rAttribs ); + /** Appends a new color from the passed RGBCOLOR record. */ + void importPaletteColor( RecordInputStream& rStrm ); + /** Imports the PALETTE record from the passed stream. */ + void importPalette( BiffInputStream& rStrm ); + + /** Rturns the RGB value of the color with the passed index. */ + sal_Int32 getColor( sal_Int32 nPaletteIdx ) const; + +private: + /** Appends the passed color. */ + void appendColor( sal_Int32 nRGBValue ); + +private: + ::std::vector< sal_Int32 > maColors; /// List of RGB values. + size_t mnAppendIndex; /// Index to append a new color. +}; + +// ============================================================================ + +/** Contains all XML font attributes, e.g. from a font or rPr element. */ +struct FontModel +{ + ::rtl::OUString maName; /// Font name. + Color maColor; /// Font color. + sal_Int32 mnScheme; /// Major/minor scheme font. + sal_Int32 mnFamily; /// Font family. + sal_Int32 mnCharSet; /// Windows font character set. + double mfHeight; /// Font height in points. + sal_Int32 mnUnderline; /// Underline style. + sal_Int32 mnEscapement; /// Escapement style. + bool mbBold; /// True = bold characters. + bool mbItalic; /// True = italic characters. + bool mbStrikeout; /// True = Strike out characters. + bool mbOutline; /// True = outlined characters. + bool mbShadow; /// True = shadowed chgaracters. + + explicit FontModel(); + + void setBinScheme( sal_uInt8 nScheme ); + void setBiffHeight( sal_uInt16 nHeight ); + void setBiffWeight( sal_uInt16 nWeight ); + void setBiffUnderline( sal_uInt16 nUnderline ); + void setBiffEscapement( sal_uInt16 nEscapement ); +}; + +// ---------------------------------------------------------------------------- + +/** Enumerates different types of API font property sets. */ +enum FontPropertyType +{ + FONT_PROPTYPE_CELL, /// Font properties in a spreadsheet cell (table::Cell service). + FONT_PROPTYPE_TEXT /// Font properties in a text object (text::Text service). +}; + +// ---------------------------------------------------------------------------- + +/** Contains used flags for all API font attributes. */ +struct ApiFontUsedFlags +{ + bool mbNameUsed; /// True = font name/family/char set are used. + bool mbColorUsed; /// True = font color is used. + bool mbSchemeUsed; /// True = font scheme is used. + bool mbHeightUsed; /// True = font height is used. + bool mbUnderlineUsed; /// True = underline style is used. + bool mbEscapementUsed; /// True = escapement style is used. + bool mbWeightUsed; /// True = font weight (boldness) is used. + bool mbPostureUsed; /// True = font posture (italic) is used. + bool mbStrikeoutUsed; /// True = strike out style is used. + bool mbOutlineUsed; /// True = outline style is used. + bool mbShadowUsed; /// True = shadow style is used. + + explicit ApiFontUsedFlags( bool bAllUsed ); +}; + +// ---------------------------------------------------------------------------- + +/** Contains API font name, family, and charset for a script type. */ +struct ApiScriptFontName +{ + ::rtl::OUString maName; /// Font name. + sal_Int16 mnFamily; /// Font family. + sal_Int16 mnCharSet; /// Font character set. + + explicit ApiScriptFontName(); +}; + +// ---------------------------------------------------------------------------- + +/** Contains all API font attributes. */ +struct ApiFontData +{ + typedef ::com::sun::star::awt::FontDescriptor ApiFontDescriptor; + + ApiScriptFontName maLatinFont; /// Font name for latin scripts. + ApiScriptFontName maAsianFont; /// Font name for east-asian scripts. + ApiScriptFontName maCmplxFont; /// Font name for complex scripts. + ApiFontDescriptor maDesc; /// Font descriptor (height in twips, weight in %). + sal_Int32 mnColor; /// Font color. + sal_Int16 mnEscapement; /// Escapement style. + sal_Int8 mnEscapeHeight; /// Escapement font height. + bool mbOutline; /// True = outlined characters. + bool mbShadow; /// True = shadowed chgaracters. + + explicit ApiFontData(); +}; + +// ============================================================================ + +class Font : public WorkbookHelper +{ +public: + explicit Font( const WorkbookHelper& rHelper, bool bDxf ); + explicit Font( const WorkbookHelper& rHelper, const FontModel& rModel ); + + /** Sets font formatting attributes for the passed element. */ + void importAttribs( sal_Int32 nElement, const AttributeList& rAttribs ); + + /** Imports the FONT record from the passed stream. */ + void importFont( RecordInputStream& rStrm ); + /** Imports the font name from a DXF record. */ + void importDxfName( RecordInputStream& rStrm ); + /** Imports the font color from a DXF record. */ + void importDxfColor( RecordInputStream& rStrm ); + /** Imports the font scheme from a DXF record. */ + void importDxfScheme( RecordInputStream& rStrm ); + /** Imports the font height from a DXF record. */ + void importDxfHeight( RecordInputStream& rStrm ); + /** Imports the font weight from a DXF record. */ + void importDxfWeight( RecordInputStream& rStrm ); + /** Imports the font underline style from a DXF record. */ + void importDxfUnderline( RecordInputStream& rStrm ); + /** Imports the font escapement style from a DXF record. */ + void importDxfEscapement( RecordInputStream& rStrm ); + /** Imports a font style flag from a DXF record. */ + void importDxfFlag( sal_Int32 nElement, RecordInputStream& rStrm ); + + /** Imports the FONT record from the passed stream. */ + void importFont( BiffInputStream& rStrm ); + /** Imports the FONTCOLOR record from the passed stream. */ + void importFontColor( BiffInputStream& rStrm ); + /** Sets the font attributes from the font block of a CFRULE record. */ + void importCfRule( BiffInputStream& rStrm ); + + /** Returns the font model structure. This function can be called before + finalizeImport() has been called. */ + inline const FontModel& getModel() const { return maModel; } + /** Returns the text encoding for strings used with this font. This + function can be called before finalizeImport() has been called. */ + rtl_TextEncoding getFontEncoding() const; + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns an API font descriptor with own font information. */ + const ::com::sun::star::awt::FontDescriptor& getFontDescriptor() const; + /** Returns true, if the font requires rich text formatting in Calc. + @descr Example: Font escapement is a cell attribute in Excel, but Calc + needs an rich text cell for this attribute. */ + bool needsRichTextFormat() const; + + /** Writes all font attributes to the passed property map. */ + void writeToPropertyMap( + PropertyMap& rPropMap, + FontPropertyType ePropType ) const; + /** Writes all font attributes to the passed property set. */ + void writeToPropertySet( + PropertySet& rPropSet, + FontPropertyType ePropType ) const; + +private: + /** Reads and sets height and flags. */ + void importFontData2( BiffInputStream& rStrm ); + /** Reads and sets weight, escapement, underline, family, charset (BIFF5+). */ + void importFontData5( BiffInputStream& rStrm ); + + /** Reads and sets a byte string as font name. */ + void importFontName2( BiffInputStream& rStrm ); + /** Reads and sets a Unicode string as font name. */ + void importFontName8( BiffInputStream& rStrm ); + +private: + FontModel maModel; + ApiFontData maApiData; + ApiFontUsedFlags maUsedFlags; + bool mbDxf; +}; + +typedef ::boost::shared_ptr< Font > FontRef; + +// ============================================================================ + +/** Contains all XML cell alignment attributes, e.g. from an alignment element. */ +struct AlignmentModel +{ + sal_Int32 mnHorAlign; /// Horizontal alignment. + sal_Int32 mnVerAlign; /// Vertical alignment. + sal_Int32 mnTextDir; /// CTL text direction. + sal_Int32 mnRotation; /// Text rotation angle. + sal_Int32 mnIndent; /// Indentation. + bool mbWrapText; /// True = multi-line text. + bool mbShrink; /// True = shrink to fit cell size. + bool mbJustLastLine; /// True = justify last line in block text. + + explicit AlignmentModel(); + + /** Sets horizontal alignment from the passed OOBIN or BIFF data. */ + void setBinHorAlign( sal_uInt8 nHorAlign ); + /** Sets vertical alignment from the passed OOBIN or BIFF data. */ + void setBinVerAlign( sal_uInt8 nVerAlign ); + /** Sets rotation from the passed OOBIN or BIFF text orientation. */ + void setBinTextOrient( sal_uInt8 nTextOrient ); +}; + +// ---------------------------------------------------------------------------- + +/** Contains all API cell alignment attributes. */ +struct ApiAlignmentData +{ + typedef ::com::sun::star::table::CellHoriJustify ApiCellHoriJustify; + typedef ::com::sun::star::table::CellVertJustify ApiCellVertJustify; + typedef ::com::sun::star::table::CellOrientation ApiCellOrientation; + + ApiCellHoriJustify meHorJustify; /// Horizontal alignment. + ApiCellVertJustify meVerJustify; /// Vertical alignment. + ApiCellOrientation meOrientation; /// Normal or stacked text. + sal_Int32 mnRotation; /// Text rotation angle. + sal_Int16 mnWritingMode; /// CTL text direction. + sal_Int16 mnIndent; /// Indentation. + bool mbWrapText; /// True = multi-line text. + bool mbShrink; /// True = shrink to fit cell size. + + explicit ApiAlignmentData(); +}; + +bool operator==( const ApiAlignmentData& rLeft, const ApiAlignmentData& rRight ); + +// ============================================================================ + +class Alignment : public WorkbookHelper +{ +public: + explicit Alignment( const WorkbookHelper& rHelper ); + + /** Sets all attributes from the alignment element. */ + void importAlignment( const AttributeList& rAttribs ); + + /** Sets the alignment attributes from the passed OOBIN XF record data. */ + void setBinData( sal_uInt32 nFlags ); + /** Sets the alignment attributes from the passed BIFF2 XF record data. */ + void setBiff2Data( sal_uInt8 nFlags ); + /** Sets the alignment attributes from the passed BIFF3 XF record data. */ + void setBiff3Data( sal_uInt16 nAlign ); + /** Sets the alignment attributes from the passed BIFF4 XF record data. */ + void setBiff4Data( sal_uInt16 nAlign ); + /** Sets the alignment attributes from the passed BIFF5 XF record data. */ + void setBiff5Data( sal_uInt16 nAlign ); + /** Sets the alignment attributes from the passed BIFF8 XF record data. */ + void setBiff8Data( sal_uInt16 nAlign, sal_uInt16 nMiscAttrib ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns the alignment model structure. */ + inline const AlignmentModel& getModel() const { return maModel; } + /** Returns the converted API alignment data struct. */ + inline const ApiAlignmentData& getApiData() const { return maApiData; } + + /** Writes all alignment attributes to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap ) const; + +private: + AlignmentModel maModel; /// Alignment model data. + ApiAlignmentData maApiData; /// Alignment data converted to API constants. +}; + +typedef ::boost::shared_ptr< Alignment > AlignmentRef; + +// ============================================================================ + +/** Contains all XML cell protection attributes, e.g. from a protection element. */ +struct ProtectionModel +{ + bool mbLocked; /// True = locked against editing. + bool mbHidden; /// True = formula is hidden. + + explicit ProtectionModel(); +}; + +// ---------------------------------------------------------------------------- + +/** Contains all API cell protection attributes. */ +struct ApiProtectionData +{ + typedef ::com::sun::star::util::CellProtection ApiCellProtection; + + ApiCellProtection maCellProt; + + explicit ApiProtectionData(); +}; + +bool operator==( const ApiProtectionData& rLeft, const ApiProtectionData& rRight ); + +// ============================================================================ + +class Protection : public WorkbookHelper +{ +public: + explicit Protection( const WorkbookHelper& rHelper ); + + /** Sets all attributes from the protection element. */ + void importProtection( const AttributeList& rAttribs ); + + /** Sets the protection attributes from the passed OOBIN XF record data. */ + void setBinData( sal_uInt32 nFlags ); + /** Sets the protection attributes from the passed BIFF2 XF record data. */ + void setBiff2Data( sal_uInt8 nNumFmt ); + /** Sets the protection attributes from the passed BIFF3-BIFF8 XF record data. */ + void setBiff3Data( sal_uInt16 nProt ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns the protection model structure. */ + inline const ProtectionModel& getModel() const { return maModel; } + /** Returns the converted API protection data struct. */ + inline const ApiProtectionData& getApiData() const { return maApiData; } + + /** Writes all protection attributes to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap ) const; + +private: + ProtectionModel maModel; /// Protection model data. + ApiProtectionData maApiData; /// Protection data converted to API constants. +}; + +typedef ::boost::shared_ptr< Protection > ProtectionRef; + +// ============================================================================ + +/** Contains XML attributes of a single border line. */ +struct BorderLineModel +{ + Color maColor; /// Borderline color. + sal_Int32 mnStyle; /// Border line style. + bool mbUsed; /// True = line format used. + + explicit BorderLineModel( bool bDxf ); + + /** Sets the passed OOBIN or BIFF line style. */ + void setBiffStyle( sal_Int32 nLineStyle ); + /** Sets line style and line color from the passed BIFF data. */ + void setBiffData( sal_uInt8 nLineStyle, sal_uInt16 nLineColor ); +}; + +// ---------------------------------------------------------------------------- + +/** Contains XML attributes of a complete cell border. */ +struct BorderModel +{ + BorderLineModel maLeft; /// Left line format. + BorderLineModel maRight; /// Right line format. + BorderLineModel maTop; /// Top line format. + BorderLineModel maBottom; /// Bottom line format. + BorderLineModel maDiagonal; /// Diagonal line format. + bool mbDiagTLtoBR; /// True = top-left to bottom-right on. + bool mbDiagBLtoTR; /// True = bottom-left to top-right on. + + explicit BorderModel( bool bDxf ); +}; + +// ---------------------------------------------------------------------------- + +/** Contains API attributes of a complete cell border. */ +struct ApiBorderData +{ + typedef ::com::sun::star::table::TableBorder ApiTableBorder; + typedef ::com::sun::star::table::BorderLine ApiBorderLine; + + ApiTableBorder maBorder; /// Left/right/top/bottom line format. + ApiBorderLine maTLtoBR; /// Diagonal top-left to bottom-right line format. + ApiBorderLine maBLtoTR; /// Diagonal bottom-left to top-right line format. + bool mbBorderUsed; /// True = left/right/top/bottom line format used. + bool mbDiagUsed; /// True = diagonal line format used. + + explicit ApiBorderData(); + + /** Returns true, if any of the outer border lines is visible. */ + bool hasAnyOuterBorder() const; +}; + +bool operator==( const ApiBorderData& rLeft, const ApiBorderData& rRight ); + +// ============================================================================ + +class Border : public WorkbookHelper +{ +public: + explicit Border( const WorkbookHelper& rHelper, bool bDxf ); + + /** Sets global border attributes from the border element. */ + void importBorder( const AttributeList& rAttribs ); + /** Sets border attributes for the border line with the passed element identifier. */ + void importStyle( sal_Int32 nElement, const AttributeList& rAttribs ); + /** Sets color attributes for the border line with the passed element identifier. */ + void importColor( sal_Int32 nElement, const AttributeList& rAttribs ); + + /** Imports the BORDER record from the passed stream. */ + void importBorder( RecordInputStream& rStrm ); + /** Imports a border from a DXF record from the passed stream. */ + void importDxfBorder( sal_Int32 nElement, RecordInputStream& rStrm ); + + /** Sets the border attributes from the passed BIFF2 XF record data. */ + void setBiff2Data( sal_uInt8 nFlags ); + /** Sets the border attributes from the passed BIFF3/BIFF4 XF record data. */ + void setBiff3Data( sal_uInt32 nBorder ); + /** Sets the border attributes from the passed BIFF5 XF record data. */ + void setBiff5Data( sal_uInt32 nBorder, sal_uInt32 nArea ); + /** Sets the border attributes from the passed BIFF8 XF record data. */ + void setBiff8Data( sal_uInt32 nBorder1, sal_uInt32 nBorder2 ); + /** Sets the border attributes from the border block of a CFRULE record. */ + void importCfRule( BiffInputStream& rStrm, sal_uInt32 nFlags ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns the border model structure. */ + inline const BorderModel& getModel() const { return maModel; } + /** Returns the converted API border data struct. */ + inline const ApiBorderData& getApiData() const { return maApiData; } + + /** Writes all border attributes to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap ) const; + +private: + /** Returns the border line struct specified by the passed XML token identifier. */ + BorderLineModel* getBorderLine( sal_Int32 nElement ); + + /** Converts border line data to an API struct, returns true, if the line is marked as used. */ + bool convertBorderLine( + ::com::sun::star::table::BorderLine& rBorderLine, + const BorderLineModel& rModel ); + +private: + BorderModel maModel; + ApiBorderData maApiData; + bool mbDxf; +}; + +typedef ::boost::shared_ptr< Border > BorderRef; + +// ============================================================================ + +/** Contains XML pattern fill attributes from the patternFill element. */ +struct PatternFillModel +{ + Color maPatternColor; /// Pattern foreground color. + Color maFillColor; /// Background fill color. + sal_Int32 mnPattern; /// Pattern identifier (e.g. solid). + bool mbPattColorUsed; /// True = pattern foreground color used. + bool mbFillColorUsed; /// True = background fill color used. + bool mbPatternUsed; /// True = pattern used. + + explicit PatternFillModel( bool bDxf ); + + /** Sets the passed OOBIN or BIFF pattern identifier. */ + void setBinPattern( sal_Int32 nPattern ); + /** Sets the pattern and pattern colors from the passed BIFF data. */ + void setBiffData( sal_uInt16 nPatternColor, sal_uInt16 nFillColor, sal_uInt8 nPattern ); +}; + +// ---------------------------------------------------------------------------- + +/** Contains XML gradient fill attributes from the gradientFill element. */ +struct GradientFillModel +{ + typedef ::std::map< double, Color > ColorMap; + + sal_Int32 mnType; /// Gradient type, linear or path. + double mfAngle; /// Rotation angle for type linear. + double mfLeft; /// Left convergence for type path. + double mfRight; /// Right convergence for type path. + double mfTop; /// Top convergence for type path. + double mfBottom; /// Bottom convergence for type path. + ColorMap maColors; /// Gradient colors. + + explicit GradientFillModel(); + + /** Reads OOBIN gradient settings from a FILL or DXF record. */ + void readGradient( RecordInputStream& rStrm ); + /** Reads OOBIN gradient stop settings from a FILL or DXF record. */ + void readGradientStop( RecordInputStream& rStrm, bool bDxf ); +}; + +// ---------------------------------------------------------------------------- + +/** Contains API fill attributes. */ +struct ApiSolidFillData +{ + sal_Int32 mnColor; /// Fill color. + bool mbTransparent; /// True = transparent area. + bool mbUsed; /// True = fill data is valid. + + explicit ApiSolidFillData(); +}; + +bool operator==( const ApiSolidFillData& rLeft, const ApiSolidFillData& rRight ); + +// ============================================================================ + +/** Contains cell fill attributes, either a pattern fill or a gradient fill. */ +class Fill : public WorkbookHelper +{ +public: + explicit Fill( const WorkbookHelper& rHelper, bool bDxf ); + + /** Sets attributes of a patternFill element. */ + void importPatternFill( const AttributeList& rAttribs ); + /** Sets the pattern color from the fgColor element. */ + void importFgColor( const AttributeList& rAttribs ); + /** Sets the background color from the bgColor element. */ + void importBgColor( const AttributeList& rAttribs ); + /** Sets attributes of a gradientFill element. */ + void importGradientFill( const AttributeList& rAttribs ); + /** Sets a color from the color element in a gradient fill. */ + void importColor( const AttributeList& rAttribs, double fPosition ); + + /** Imports the FILL record from the passed stream. */ + void importFill( RecordInputStream& rStrm ); + /** Imports the fill pattern from a DXF record. */ + void importDxfPattern( RecordInputStream& rStrm ); + /** Imports the pattern color from a DXF record. */ + void importDxfFgColor( RecordInputStream& rStrm ); + /** Imports the background color from a DXF record. */ + void importDxfBgColor( RecordInputStream& rStrm ); + /** Imports gradient settings from a DXF record. */ + void importDxfGradient( RecordInputStream& rStrm ); + /** Imports gradient stop settings from a DXF record. */ + void importDxfStop( RecordInputStream& rStrm ); + + /** Sets the fill attributes from the passed BIFF2 XF record data. */ + void setBiff2Data( sal_uInt8 nFlags ); + /** Sets the fill attributes from the passed BIFF3/BIFF4 XF record data. */ + void setBiff3Data( sal_uInt16 nArea ); + /** Sets the fill attributes from the passed BIFF5 XF record data. */ + void setBiff5Data( sal_uInt32 nArea ); + /** Sets the fill attributes from the passed BIFF8 XF record data. */ + void setBiff8Data( sal_uInt32 nBorder2, sal_uInt16 nArea ); + /** Sets the fill attributes from the fill block of a CFRULE record. */ + void importCfRule( BiffInputStream& rStrm, sal_uInt32 nFlags ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns the fill pattern model structure, if extant. */ + inline const PatternFillModel* getPatternModel() const { return mxPatternModel.get(); } + /** Returns the fill gradient model structure, if extant. */ + inline const GradientFillModel* getGradientModel() const { return mxGradientModel.get(); } + /** Returns the converted API fill data struct. */ + inline const ApiSolidFillData& getApiData() const { return maApiData; } + + /** Writes all fill attributes to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap ) const; + +private: + typedef ::boost::shared_ptr< PatternFillModel > PatternModelRef; + typedef ::boost::shared_ptr< GradientFillModel > GradientModelRef; + + PatternModelRef mxPatternModel; + GradientModelRef mxGradientModel; + ApiSolidFillData maApiData; + bool mbDxf; +}; + +typedef ::boost::shared_ptr< Fill > FillRef; + +// ============================================================================ + +/** Contains all data for a cell format or cell style. */ +struct XfModel +{ + sal_Int32 mnStyleXfId; /// Index to parent style XF. + sal_Int32 mnFontId; /// Index to font data list. + sal_Int32 mnNumFmtId; /// Index to number format list. + sal_Int32 mnBorderId; /// Index to list of cell borders. + sal_Int32 mnFillId; /// Index to list of cell areas. + bool mbCellXf; /// True = cell XF, false = style XF. + bool mbFontUsed; /// True = font index used. + bool mbNumFmtUsed; /// True = number format used. + bool mbAlignUsed; /// True = alignment used. + bool mbProtUsed; /// True = cell protection used. + bool mbBorderUsed; /// True = border data used. + bool mbAreaUsed; /// True = area data used. + + explicit XfModel(); +}; + +// ============================================================================ + +/** Represents a cell format or a cell style (called XF, extended format). + + This class stores the type (cell/style), the index to the parent style (if + it is a cell format) and all "attribute used" flags, which reflect the + state of specific attribute groups (true = user has changed the attributes) + and all formatting data. + */ +class Xf : public WorkbookHelper +{ +public: + explicit Xf( const WorkbookHelper& rHelper ); + + /** Sets all "attribute used" flags to the passed state. */ + void setAllUsedFlags( bool bUsed ); + + /** Sets all attributes from the xf element. */ + void importXf( const AttributeList& rAttribs, bool bCellXf ); + /** Sets all attributes from the alignment element. */ + void importAlignment( const AttributeList& rAttribs ); + /** Sets all attributes from the protection element. */ + void importProtection( const AttributeList& rAttribs ); + + /** Imports the XF record from the passed stream. */ + void importXf( RecordInputStream& rStrm, bool bCellXf ); + + /** Imports the XF record from the passed stream. */ + void importXf( BiffInputStream& rStrm ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns true, if the XF is a cell XF, and false, if it is a style XF. */ + inline bool isCellXf() const { return maModel.mbCellXf; } + + /** Returns the referred font object. */ + FontRef getFont() const; + /** Returns the alignment data of this style. */ + inline const Alignment& getAlignment() const { return maAlignment; } + /** Returns the cell protection data of this style. */ + inline const Protection& getProtection() const { return maProtection; } + /** Returns true, if any "attribute used" flags are ste in this XF. */ + bool hasAnyUsedFlags() const; + + /** Writes all formatting attributes to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap ) const; + /** Writes all formatting attributes to the passed property set. */ + void writeToPropertySet( PropertySet& rPropSet ) const; + +private: + /** Sets 'attribute used' flags from the passed BIFF bit field. */ + void setBiffUsedFlags( sal_uInt8 nUsedFlags ); + +private: + XfModel maModel; /// Cell XF or style XF model data. + Alignment maAlignment; /// Cell alignment data. + Protection maProtection; /// Cell protection data. + ::com::sun::star::table::CellVertJustify + meRotationRef; /// Rotation reference dependent on border. +}; + +typedef ::boost::shared_ptr< Xf > XfRef; + +// ============================================================================ + +class Dxf : public WorkbookHelper +{ +public: + explicit Dxf( const WorkbookHelper& rHelper ); + + /** Creates a new empty font object. */ + FontRef createFont( bool bAlwaysNew = true ); + /** Creates a new empty border object. */ + BorderRef createBorder( bool bAlwaysNew = true ); + /** Creates a new empty fill object. */ + FillRef createFill( bool bAlwaysNew = true ); + + /** Inserts a new number format code. */ + void importNumFmt( const AttributeList& rAttribs ); + /** Sets all attributes from the alignment element. */ + void importAlignment( const AttributeList& rAttribs ); + /** Sets all attributes from the protection element. */ + void importProtection( const AttributeList& rAttribs ); + + /** Imports the DXF record from the passed stream. */ + void importDxf( RecordInputStream& rStrm ); + + /** Imports font, border, and fill settings from the CFRULE record. */ + void importCfRule( BiffInputStream& rStrm, sal_uInt32 nFlags ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Writes all formatting attributes to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap ) const; + /** Writes all formatting attributes to the passed property set. */ + void writeToPropertySet( PropertySet& rPropSet ) const; + +private: + FontRef mxFont; /// Font data. + NumberFormatRef mxNumFmt; /// Number format data. + AlignmentRef mxAlignment; /// Alignment data. + ProtectionRef mxProtection; /// Protection data. + BorderRef mxBorder; /// Border data. + FillRef mxFill; /// Fill data. +}; + +typedef ::boost::shared_ptr< Dxf > DxfRef; + +// ============================================================================ + +/** Contains attributes of a cell style, e.g. from the cellStyle element. */ +struct CellStyleModel +{ + ::rtl::OUString maName; /// Cell style name. + sal_Int32 mnXfId; /// Formatting for this cell style. + sal_Int32 mnBuiltinId; /// Identifier for builtin styles. + sal_Int32 mnLevel; /// Level for builtin column/row styles. + bool mbBuiltin; /// True = builtin style. + bool mbCustom; /// True = customized builtin style. + bool mbHidden; /// True = style not visible in GUI. + + explicit CellStyleModel(); + + /** Returns true, if this style is a builtin style. */ + bool isBuiltin() const; + /** Returns true, if this style represents the default document cell style. */ + bool isDefaultStyle() const; +}; + +// ============================================================================ + +class CellStyle : public WorkbookHelper +{ +public: + explicit CellStyle( const WorkbookHelper& rHelper ); + + /** Imports passed attributes from the cellStyle element. */ + void importCellStyle( const AttributeList& rAttribs ); + /** Imports style settings from a CELLSTYLE record. */ + void importCellStyle( RecordInputStream& rStrm ); + /** Imports style settings from a STYLE record. */ + void importStyle( BiffInputStream& rStrm ); + + /** Creates the style sheet in the document described by this cell style object. */ + void createCellStyle(); + /** Stores tha passed final style name and creates the cell style, if it is + user-defined or modified built-in. */ + void finalizeImport( const ::rtl::OUString& rFinalName ); + + /** Returns the cell style model structure. */ + inline const CellStyleModel& getModel() const { return maModel; } + /** Returns the final style name used in the document. */ + inline const ::rtl::OUString& getFinalStyleName() const { return maFinalName; } + +private: + CellStyleModel maModel; + ::rtl::OUString maFinalName; /// Final style name used in API. + bool mbCreated; /// True = style sheet created. +}; + +typedef ::boost::shared_ptr< CellStyle > CellStyleRef; + +// ============================================================================ + +class CellStyleBuffer : public WorkbookHelper +{ +public: + explicit CellStyleBuffer( const WorkbookHelper& rHelper ); + + /** Appends and returns a new named cell style object. */ + CellStyleRef importCellStyle( const AttributeList& rAttribs ); + /** Imports the CELLSTYLE record from the passed stream. */ + CellStyleRef importCellStyle( RecordInputStream& rStrm ); + /** Imports the STYLE record from the passed stream. */ + CellStyleRef importStyle( BiffInputStream& rStrm ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns the XF identifier associated to the default cell style. */ + sal_Int32 getDefaultXfId() const; + /** Returns the default style sheet for unused cells. */ + ::rtl::OUString getDefaultStyleName() const; + /** Creates the style sheet described by the style XF with the passed identifier. */ + ::rtl::OUString createCellStyle( sal_Int32 nXfId ) const; + +private: + /** Inserts the passed cell style object into the internal maps. */ + void insertCellStyle( CellStyleRef xCellStyle ); + /** Creates the style sheet described by the passed cell style object. */ + ::rtl::OUString createCellStyle( const CellStyleRef& rxCellStyle ) const; + +private: + typedef RefVector< CellStyle > CellStyleVector; + typedef RefMap< sal_Int32, CellStyle > CellStyleXfIdMap; + + CellStyleVector maBuiltinStyles; /// All built-in cell styles. + CellStyleVector maUserStyles; /// All user defined cell styles. + CellStyleXfIdMap maStylesByXf; /// All cell styles, mapped by XF identifier. + CellStyleRef mxDefStyle; /// Default cell style. +}; + +// ============================================================================ + +class StylesBuffer : public WorkbookHelper +{ +public: + explicit StylesBuffer( const WorkbookHelper& rHelper ); + + /** Creates a new empty font object. + @param opnFontId (out-param) The identifier of the new font object. */ + FontRef createFont( sal_Int32* opnFontId = 0 ); + /** Creates a number format. */ + NumberFormatRef createNumFmt( sal_Int32 nNumFmtId, const ::rtl::OUString& rFmtCode ); + /** Creates a new empty border object. + @param opnBorderId (out-param) The identifier of the new border object. */ + BorderRef createBorder( sal_Int32* opnBorderId = 0 ); + /** Creates a new empty fill object. + @param opnFillId (out-param) The identifier of the new fill object. */ + FillRef createFill( sal_Int32* opnFillId = 0 ); + /** Creates a new empty cell formatting object. + @param opnXfId (out-param) The identifier of the new XF object. */ + XfRef createCellXf( sal_Int32* opnXfId = 0 ); + /** Creates a new empty style formatting object. + @param opnXfId (out-param) The identifier of the new XF object. */ + XfRef createStyleXf( sal_Int32* opnXfId = 0 ); + /** Creates a new empty differential formatting object. + @param opnDxfId (out-param) The identifier of the new DXF object. */ + DxfRef createDxf( sal_Int32* opnDxfId = 0 ); + + /** Appends a new color to the color palette. */ + void importPaletteColor( const AttributeList& rAttribs ); + /** Inserts a new number format code. */ + NumberFormatRef importNumFmt( const AttributeList& rAttribs ); + /** Appends and returns a new named cell style object. */ + CellStyleRef importCellStyle( const AttributeList& rAttribs ); + + /** Appends a new color to the color palette. */ + void importPaletteColor( RecordInputStream& rStrm ); + /** Imports the NUMFMT record from the passed stream. */ + void importNumFmt( RecordInputStream& rStrm ); + /** Imports the CELLSTYLE record from the passed stream. */ + void importCellStyle( RecordInputStream& rStrm ); + + /** Imports the PALETTE record from the passed stream. */ + void importPalette( BiffInputStream& rStrm ); + /** Imports the FONT record from the passed stream. */ + void importFont( BiffInputStream& rStrm ); + /** Imports the FONTCOLOR record from the passed stream. */ + void importFontColor( BiffInputStream& rStrm ); + /** Imports the FORMAT record from the passed stream. */ + void importFormat( BiffInputStream& rStrm ); + /** Imports the XF record from the passed stream. */ + void importXf( BiffInputStream& rStrm ); + /** Imports the STYLE record from the passed stream. */ + void importStyle( BiffInputStream& rStrm ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns the palette color with the specified index. */ + sal_Int32 getPaletteColor( sal_Int32 nIndex ) const; + /** Returns the specified font object. */ + FontRef getFont( sal_Int32 nFontId ) const; + /** Returns the specified border object. */ + BorderRef getBorder( sal_Int32 nBorderId ) const; + /** Returns the specified cell format object. */ + XfRef getCellXf( sal_Int32 nXfId ) const; + /** Returns the specified style format object. */ + XfRef getStyleXf( sal_Int32 nXfId ) const; + /** Returns the specified diferential cell format object. */ + DxfRef getDxf( sal_Int32 nDxfId ) const; + + /** Returns the font object of the specified cell XF. */ + FontRef getFontFromCellXf( sal_Int32 nXfId ) const; + /** Returns the default application font (used in the "Normal" cell style). */ + FontRef getDefaultFont() const; + /** Returns the model of the default application font (used in the "Normal" cell style). */ + const FontModel& getDefaultFontModel() const; + + /** Returns true, if the specified borders are equal. */ + bool equalBorders( sal_Int32 nBorderId1, sal_Int32 nBorderId2 ) const; + /** Returns true, if the specified fills are equal. */ + bool equalFills( sal_Int32 nFillId1, sal_Int32 nFillId2 ) const; + + /** Returns the default style sheet for unused cells. */ + ::rtl::OUString getDefaultStyleName() const; + /** Creates the style sheet described by the style XF with the passed identifier. */ + ::rtl::OUString createCellStyle( sal_Int32 nXfId ) const; + /** Creates the style sheet described by the DXF with the passed identifier. */ + ::rtl::OUString createDxfStyle( sal_Int32 nDxfId ) const; + + /** Writes the font attributes of the specified font data to the passed property map. */ + void writeFontToPropertyMap( PropertyMap& rPropMap, sal_Int32 nFontId ) const; + /** Writes the specified number format to the passed property map. */ + void writeNumFmtToPropertyMap( PropertyMap& rPropMap, sal_Int32 nNumFmtId ) const; + /** Writes the border attributes of the specified border data to the passed property map. */ + void writeBorderToPropertyMap( PropertyMap& rPropMap, sal_Int32 nBorderId ) const; + /** Writes the fill attributes of the specified fill data to the passed property map. */ + void writeFillToPropertyMap( PropertyMap& rPropMap, sal_Int32 nFillId ) const; + /** Writes the cell formatting attributes of the specified XF to the passed property map. */ + void writeCellXfToPropertyMap( PropertyMap& rPropMap, sal_Int32 nXfId ) const; + /** Writes the cell formatting attributes of the specified style XF to the passed property map. */ + void writeStyleXfToPropertyMap( PropertyMap& rPropMap, sal_Int32 nXfId ) const; + + /** Writes the cell formatting attributes of the specified XF to the passed property set. */ + void writeCellXfToPropertySet( PropertySet& rPropSet, sal_Int32 nXfId ) const; + /** Writes the cell formatting attributes of the specified style XF to the passed property set. */ + void writeStyleXfToPropertySet( PropertySet& rPropSet, sal_Int32 nXfId ) const; + +private: + typedef RefVector< Font > FontVector; + typedef RefVector< Border > BorderVector; + typedef RefVector< Fill > FillVector; + typedef RefVector< Xf > XfVector; + typedef RefVector< Dxf > DxfVector; + typedef ::std::map< sal_Int32, ::rtl::OUString > DxfStyleMap; + + ColorPalette maPalette; /// Color palette. + FontVector maFonts; /// List of font objects. + NumberFormatsBuffer maNumFmts; /// List of all number format codes. + BorderVector maBorders; /// List of cell border objects. + FillVector maFills; /// List of cell area fill objects. + XfVector maCellXfs; /// List of cell formats. + XfVector maStyleXfs; /// List of cell styles. + CellStyleBuffer maCellStyles; /// All built-in and user defined cell styles. + DxfVector maDxfs; /// List of differential cell styles. + mutable DxfStyleMap maDxfStyles; /// Maps DXF identifiers to Calc style sheet names. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/stylesfragment.hxx b/oox/inc/oox/xls/stylesfragment.hxx new file mode 100644 index 000000000000..b3dc63fe6e31 --- /dev/null +++ b/oox/inc/oox/xls/stylesfragment.hxx @@ -0,0 +1,160 @@ +/************************************************************************* + * + * 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. + * + ***********************************************************************/ + +#ifndef OOX_XLS_STYLESFRAGMENT_HXX +#define OOX_XLS_STYLESFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" +#include "oox/xls/stylesbuffer.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxIndexedColorsContext : public OoxWorkbookContextBase +{ +public: + explicit OoxIndexedColorsContext( OoxWorkbookFragmentBase& rFragment ); + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); +}; + +// ============================================================================ + +class OoxFontContext : public OoxWorkbookContextBase +{ +public: + template< typename ParentType > + inline explicit OoxFontContext( ParentType& rParent, const FontRef& rxFont ) : + OoxWorkbookContextBase( rParent ), mxFont( rxFont ) {} + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + FontRef mxFont; +}; + +// ============================================================================ + +class OoxBorderContext : public OoxWorkbookContextBase +{ +public: + template< typename ParentType > + inline explicit OoxBorderContext( ParentType& rParent, const BorderRef& rxBorder ) : + OoxWorkbookContextBase( rParent ), mxBorder( rxBorder ) {} + +protected: + virtual void onStartElement( const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + BorderRef mxBorder; +}; + +// ============================================================================ + +class OoxFillContext : public OoxWorkbookContextBase +{ +public: + template< typename ParentType > + inline explicit OoxFillContext( ParentType& rParent, const FillRef& rxFill ) : + OoxWorkbookContextBase( rParent ), mxFill( rxFill ), mfGradPos( -1.0 ) {} + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + FillRef mxFill; + double mfGradPos; /// Gradient color position. +}; + +// ============================================================================ + +class OoxXfContext : public OoxWorkbookContextBase +{ +public: + template< typename ParentType > + inline explicit OoxXfContext( ParentType& rParent, const XfRef& rxXf, bool bCellXf ) : + OoxWorkbookContextBase( rParent ), mxXf( rxXf ), mbCellXf( bCellXf ) {} + +protected: + virtual void onStartElement( const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + XfRef mxXf; + bool mbCellXf; /// True = cell XF, false = style XF. +}; + +// ============================================================================ + +class OoxDxfContext : public OoxWorkbookContextBase +{ +public: + template< typename ParentType > + inline explicit OoxDxfContext( ParentType& rParent, const DxfRef& rxDxf ) : + OoxWorkbookContextBase( rParent ), mxDxf( rxDxf ) {} + +protected: + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + +private: + DxfRef mxDxf; +}; + +// ============================================================================ + +class OoxStylesFragment : public OoxWorkbookFragmentBase +{ +public: + explicit OoxStylesFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + virtual void finalizeImport(); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/tablebuffer.hxx b/oox/inc/oox/xls/tablebuffer.hxx new file mode 100644 index 000000000000..993b4305d03a --- /dev/null +++ b/oox/inc/oox/xls/tablebuffer.hxx @@ -0,0 +1,135 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_TABLEBUFFER_HXX +#define OOX_XLS_TABLEBUFFER_HXX + +#include <com/sun/star/table/CellRangeAddress.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +struct TableModel +{ + ::com::sun::star::table::CellRangeAddress + maRange; /// Original (unchecked) range of the table. + ::rtl::OUString maProgName; /// Programmatical name. + ::rtl::OUString maDisplayName; /// Display name. + sal_Int32 mnId; /// Unique table identifier. + sal_Int32 mnType; /// Table type (worksheet, query, etc.). + sal_Int32 mnHeaderRows; /// Number of header rows. + sal_Int32 mnTotalsRows; /// Number of totals rows. + + explicit TableModel(); +}; + +// ---------------------------------------------------------------------------- + +class Table : public WorkbookHelper +{ +public: + explicit Table( const WorkbookHelper& rHelper ); + + /** Imports a table definition from the passed attributes. */ + void importTable( const AttributeList& rAttribs, sal_Int16 nSheet ); + /** Imports a table definition from a TABLE record. */ + void importTable( RecordInputStream& rStrm, sal_Int16 nSheet ); + + /** Creates a database range from this tables. */ + void finalizeImport(); + + /** Returns the table identifier. */ + inline sal_Int32 getTableId() const { return maModel.mnId; } + /** Returns the token index used in API token arrays (com.sun.star.sheet.FormulaToken). */ + inline sal_Int32 getTokenIndex() const { return mnTokenIndex; } + /** Returns the display name of the table. */ + inline const ::rtl::OUString& getDisplayName() const { return maModel.maDisplayName; } + + /** Returns the original (unchecked) total range of the table. */ + inline const ::com::sun::star::table::CellRangeAddress& getOriginalRange() const { return maModel.maRange; } + /** Returns the cell range of this table. */ + inline const ::com::sun::star::table::CellRangeAddress& getRange() const { return maDestRange; } + /** Returns the number of columns of this table. */ + inline sal_Int32 getWidth() const { return maDestRange.EndColumn - maDestRange.StartColumn + 1; } + /** Returns the number of rows of this table. */ + inline sal_Int32 getHeight() const { return maDestRange.EndRow - maDestRange.StartRow + 1; } + /** Returns the number of header rows in the table range. */ + inline sal_Int32 getHeaderRows() const { return maModel.mnHeaderRows; } + /** Returns the number of totals rows in the table range. */ + inline sal_Int32 getTotalsRows() const { return maModel.mnTotalsRows; } + +private: + TableModel maModel; + ::com::sun::star::table::CellRangeAddress + maDestRange; /// Validated range of the table in the worksheet. + sal_Int32 mnTokenIndex; /// Token index used in API token array. +}; + +typedef ::boost::shared_ptr< Table > TableRef; + +// ============================================================================ + +class TableBuffer : public WorkbookHelper +{ +public: + explicit TableBuffer( const WorkbookHelper& rHelper ); + + /** Imports a table definition from the passed attributes. */ + TableRef importTable( const AttributeList& rAttribs, sal_Int16 nSheet ); + /** Imports a table definition from a TABLE record. */ + TableRef importTable( RecordInputStream& rStrm, sal_Int16 nSheet ); + + /** Creates database ranges from all imported tables. */ + void finalizeImport(); + + /** Returns a table by its identifier. */ + TableRef getTable( sal_Int32 nTableId ) const; + /** Returns a table by its display name. */ + TableRef getTable( const ::rtl::OUString& rDispName ) const; + +private: + void insertTable( TableRef xTable ); + +private: + typedef RefMap< sal_Int32, Table > TableIdMap; + typedef RefMap< ::rtl::OUString, Table > TableNameMap; + + TableIdMap maIdTables; + TableNameMap maNameTables; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/tablefragment.hxx b/oox/inc/oox/xls/tablefragment.hxx new file mode 100644 index 000000000000..e30eb1e2f9e8 --- /dev/null +++ b/oox/inc/oox/xls/tablefragment.hxx @@ -0,0 +1,66 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_TABLEFRAGMENT_HXX +#define OOX_XLS_TABLEFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" +#include "oox/xls/tablebuffer.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxTableFragment : public OoxWorksheetFragmentBase +{ +public: + explicit OoxTableFragment( + const WorksheetHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + +private: + TableRef mxTable; /// Current table. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/themebuffer.hxx b/oox/inc/oox/xls/themebuffer.hxx new file mode 100644 index 000000000000..338837e40427 --- /dev/null +++ b/oox/inc/oox/xls/themebuffer.hxx @@ -0,0 +1,64 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_THEMEBUFFER_HXX +#define OOX_XLS_THEMEBUFFER_HXX + +#include "oox/drawingml/theme.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace oox { +namespace xls { + +struct FontModel; + +// ============================================================================ + +class ThemeBuffer : public ::oox::drawingml::Theme, public WorkbookHelper +{ +public: + explicit ThemeBuffer( const WorkbookHelper& rHelper ); + virtual ~ThemeBuffer(); + + /** Returns the theme color with the specified token identifier. */ + sal_Int32 getColorByToken( sal_Int32 nToken ) const; + + /** Returns the default font data for the current file type. */ + inline const FontModel& getDefaultFontModel() const { return *mxDefFontModel; } + +private: + typedef ::std::auto_ptr< FontModel > FontModelPtr; + FontModelPtr mxDefFontModel; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/unitconverter.hxx b/oox/inc/oox/xls/unitconverter.hxx new file mode 100644 index 000000000000..36a70a7f4067 --- /dev/null +++ b/oox/inc/oox/xls/unitconverter.hxx @@ -0,0 +1,124 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_UNITCONVERTER_HXX +#define OOX_XLS_UNITCONVERTER_HXX + +#include <vector> +#include <map> +#include "oox/xls/workbookhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace util { struct Date; struct DateTime; } +} } } + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Units supported by the UnitConverter class. */ +enum Unit +{ + UNIT_INCH, /// Inches. + UNIT_POINT, /// Points. + UNIT_TWIP, /// Twips (1/20 point). + UNIT_EMU, /// English Metric Unit (1/360,000 cm). + UNIT_SCREENX, /// Horizontal screen pixels. + UNIT_SCREENY, /// Vertical screen pixels. + UNIT_REFDEVX, /// Horizontal pixels in Calc reference device. + UNIT_REFDEVY, /// Vertical pixels in Calc reference device. + UNIT_DIGIT, /// Digit width of document default font. + UNIT_SPACE, /// Space character width of document default font. + + UNIT_ENUM_SIZE +}; + +/** Helper class that provides functions to convert values from and to + different units. + + Provides functions to calculate the width of certain characters of the + default font of the imported/exported document. The default font is always + the first font in the styles font list, and is always referenced by the + default cell style ("Normal" style in Excel) which is used by all empty + unformatted cells in the document. To be able to calculate the charcter + width correctly, the default font must be known, which is the case after + the finalizeImport() or finalizeExport() functions have been called. Caller + must make sure to not call the character width conversion functions before. + */ +class UnitConverter : public WorkbookHelper +{ +public: + explicit UnitConverter( const WorkbookHelper& rHelper ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + /** Updates internal nulldate for date/serial conversion. */ + void finalizeNullDate( const ::com::sun::star::util::Date& rNullDate ); + + /** Converts the passed value between the passed units. */ + double scaleValue( double fValue, Unit eFromUnit, Unit eToUnit ) const; + + /** Converts the passed value to 1/100 millimeters. */ + sal_Int32 scaleToMm100( double fValue, Unit eUnit ) const; + /** Converts the passed value from 1/100 millimeters to the passed unit. */ + double scaleFromMm100( sal_Int32 nMm100, Unit eUnit ) const; + + /** Returns the serial value of the passed datetime, based on current nulldate. */ + double calcSerialFromDateTime( const ::com::sun::star::util::DateTime& rDateTime ) const; + /** Returns the datetime of the passed serial value, based on current nulldate. */ + ::com::sun::star::util::DateTime calcDateTimeFromSerial( double fSerial ) const; + + /** Returns an error string from the passed BIFF error code. */ + ::rtl::OUString calcOoxErrorCode( sal_uInt8 nErrorCode ) const; + /** Returns a BIFF error code from the passed error string. */ + sal_uInt8 calcBiffErrorCode( const ::rtl::OUString& rErrorCode ) const; + +private: + /** Adds an error code to the internal maps. */ + void addErrorCode( sal_uInt8 nErrorCode, const ::rtl::OUString& rErrorCode ); + /** Returns the conversion coefficient for the passed unit. */ + double getCoefficient( Unit eUnit ) const; + +private: + typedef ::std::vector< double > DoubleVector; + typedef ::std::map< ::rtl::OUString, sal_uInt8 > OoxErrorCodeMap; + typedef ::std::map< sal_uInt8, ::rtl::OUString > BiffErrorCodeMap; + + DoubleVector maCoeffs; /// Coefficients for unit conversion. + OoxErrorCodeMap maOoxErrCodes; /// Maps error code strings to BIFF error constants. + BiffErrorCodeMap maBiffErrCodes; /// Maps BIFF error constants to error code strings. + sal_Int32 mnNullDate; /// Nulldate of this workbook (number of days since 0000-01-01). +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/viewsettings.hxx b/oox/inc/oox/xls/viewsettings.hxx new file mode 100644 index 000000000000..9715644cd54c --- /dev/null +++ b/oox/inc/oox/xls/viewsettings.hxx @@ -0,0 +1,217 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_VIEWSETTINGS_HXX +#define OOX_XLS_VIEWSETTINGS_HXX + +#include <com/sun/star/table/CellAddress.hpp> +#include <com/sun/star/table/CellRangeAddress.hpp> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/addressconverter.hxx" +#include "oox/xls/stylesbuffer.hxx" +#include "oox/xls/worksheethelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Contains all settings for a selection in a single pane of a sheet. */ +struct PaneSelectionModel +{ + ::com::sun::star::table::CellAddress maActiveCell; /// Position of active cell (cursor). + ApiCellRangeList maSelection; /// Selected cell ranges. + sal_Int32 mnActiveCellId; /// Index of active cell in selection list. + + explicit PaneSelectionModel(); +}; + +// ---------------------------------------------------------------------------- + +/** Contains all view settings for a single sheet. */ +struct SheetViewModel +{ + typedef RefMap< sal_Int32, PaneSelectionModel > PaneSelectionModelMap; + + PaneSelectionModelMap maPaneSelMap; /// Selections of all panes. + Color maGridColor; /// Grid color. + ::com::sun::star::table::CellAddress maFirstPos; /// First visible cell. + ::com::sun::star::table::CellAddress maSecondPos; /// First visible cell in additional panes. + sal_Int32 mnWorkbookViewId; /// Index into list of workbookView elements. + sal_Int32 mnViewType; /// View type (normal, page break, layout). + sal_Int32 mnActivePaneId; /// Active pane (with cell cursor). + sal_Int32 mnPaneState; /// Pane state (frozen, split). + double mfSplitX; /// Split X position (twips), or number of frozen columns. + double mfSplitY; /// Split Y position (twips), or number of frozen rows. + sal_Int32 mnCurrentZoom; /// Zoom factor for current view. + sal_Int32 mnNormalZoom; /// Zoom factor for normal view. + sal_Int32 mnSheetLayoutZoom; /// Zoom factor for pagebreak preview. + sal_Int32 mnPageLayoutZoom; /// Zoom factor for page layout view. + bool mbSelected; /// True = sheet is selected. + bool mbRightToLeft; /// True = sheet in right-to-left mode. + bool mbDefGridColor; /// True = default grid color. + bool mbShowFormulas; /// True = show formulas instead of results. + bool mbShowGrid; /// True = show cell grid. + bool mbShowHeadings; /// True = show column/row headings. + bool mbShowZeros; /// True = show zero value zells. + bool mbShowOutline; /// True = show outlines. + bool mbZoomToFit; /// True = zoom chart sheet to fit window. + + explicit SheetViewModel(); + + /** Returns true, if page break preview is active. */ + bool isPageBreakPreview() const; + /** Returns the zoom in normal view (returns default, if current value is 0). */ + sal_Int32 getNormalZoom() const; + /** Returns the zoom in pagebreak preview (returns default, if current value is 0). */ + sal_Int32 getPageBreakZoom() const; + /** Returns the grid color as RGB value. */ + sal_Int32 getGridColor( const ::oox::core::FilterBase& rFilter ) const; + + /** Returns the selection data, if available, otherwise 0. */ + const PaneSelectionModel* getPaneSelection( sal_Int32 nPaneId ) const; + /** Returns the selection data of the active pane. */ + const PaneSelectionModel* getActiveSelection() const; + /** Returns read/write access to the selection data of the specified pane. */ + PaneSelectionModel& createPaneSelection( sal_Int32 nPaneId ); +}; + +typedef ::boost::shared_ptr< SheetViewModel > SheetViewModelRef; + +// ---------------------------------------------------------------------------- + +class SheetViewSettings : public WorksheetHelper +{ +public: + explicit SheetViewSettings( const WorksheetHelper& rHelper ); + + /** Imports the sheetView element containing sheet view settings. */ + void importSheetView( const AttributeList& rAttribs ); + /** Imports the pane element containing sheet pane settings. */ + void importPane( const AttributeList& rAttribs ); + /** Imports the selection element containing selection settings for a pane. */ + void importSelection( const AttributeList& rAttribs ); + /** Imports the sheetView element containing view settings of a chart sheet. */ + void importChartSheetView( const AttributeList& rAttribs ); + + /** Imports the SHEETVIEW record containing sheet view settings. */ + void importSheetView( RecordInputStream& rStrm ); + /** Imports the PANE record containing sheet pane settings. */ + void importPane( RecordInputStream& rStrm ); + /** Imports the SELECTION record containing selection settings for a pane. */ + void importSelection( RecordInputStream& rStrm ); + /** Imports the CHARTSHEETVIEW record containing view settings of a chart sheet. */ + void importChartSheetView( RecordInputStream& rStrm ); + + /** Imports the WINDOW2 record containing sheet view settings. */ + void importWindow2( BiffInputStream& rStrm ); + /** Imports the PANE record containing sheet pane settings. */ + void importPane( BiffInputStream& rStrm ); + /** Imports the SCL record containing sheet zoom settings. */ + void importScl( BiffInputStream& rStrm ); + /** Imports the SELECTION record containing selection settings for a pane. */ + void importSelection( BiffInputStream& rStrm ); + + /** Converts all imported sheet view settings. */ + void finalizeImport(); + +private: + SheetViewModelRef createSheetView(); + +private: + typedef RefVector< SheetViewModel > SheetViewModelVec; + SheetViewModelVec maSheetViews; +}; + +// ============================================================================ + +/** Contains all view settings for the entire document. */ +struct WorkbookViewModel +{ + sal_Int32 mnWinX; /// X position of the workbook window (twips). + sal_Int32 mnWinY; /// Y position of the workbook window (twips). + sal_Int32 mnWinWidth; /// Width of the workbook window (twips). + sal_Int32 mnWinHeight; /// Height of the workbook window (twips). + sal_Int32 mnActiveSheet; /// Displayed (active) sheet. + sal_Int32 mnFirstVisSheet; /// First visible sheet in sheet tabbar. + sal_Int32 mnTabBarWidth; /// Width of sheet tabbar (1/1000 of window width). + sal_Int32 mnVisibility; /// Visibility state of workbook window. + bool mbShowTabBar; /// True = show sheet tabbar. + bool mbShowHorScroll; /// True = show horizontal sheet scrollbars. + bool mbShowVerScroll; /// True = show vertical sheet scrollbars. + bool mbMinimized; /// True = workbook window is minimized. + + explicit WorkbookViewModel(); +}; + +typedef ::boost::shared_ptr< WorkbookViewModel > WorkbookViewModelRef; + +// ---------------------------------------------------------------------------- + +class ViewSettings : public WorkbookHelper +{ +public: + explicit ViewSettings( const WorkbookHelper& rHelper ); + + /** Imports the workbookView element containing workbook view settings. */ + void importWorkbookView( const AttributeList& rAttribs ); + /** Imports the WORKBOOKVIEW record containing workbook view settings. */ + void importWorkbookView( RecordInputStream& rStrm ); + /** Imports the WINDOW1 record containing workbook view settings. */ + void importWindow1( BiffInputStream& rStrm ); + + /** Stores converted view settings for a specific worksheet. */ + void setSheetViewSettings( sal_Int16 nSheet, + const SheetViewModelRef& rxSheetView, + const ::com::sun::star::uno::Any& rProperties ); + + /** Converts all imported document view settings. */ + void finalizeImport(); + + /** Returns the Calc index of the active sheet. */ + sal_Int16 getActiveCalcSheet() const; + +private: + WorkbookViewModel& createWorkbookView(); + +private: + typedef RefVector< WorkbookViewModel > WorkbookViewModelVec; + typedef RefMap< sal_Int16, SheetViewModel > SheetViewModelMap; + typedef ::std::map< sal_Int16, ::com::sun::star::uno::Any > SheetPropertiesMap; + + WorkbookViewModelVec maBookViews; /// Workbook view models. + SheetViewModelMap maSheetViews; /// Active view model for each sheet. + SheetPropertiesMap maSheetProps; /// Converted property sequences for each sheet. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/webquerybuffer.hxx b/oox/inc/oox/xls/webquerybuffer.hxx new file mode 100644 index 000000000000..22c91bc15d1f --- /dev/null +++ b/oox/inc/oox/xls/webquerybuffer.hxx @@ -0,0 +1,127 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_WEBQUERYBUFFER_HXX +#define OOX_XLS_WEBQUERYBUFFER_HXX + +#include <vector> +#include <hash_map> +#include <boost/shared_ptr.hpp> +#include <com/sun/star/table/CellRangeAddress.hpp> +#include "oox/xls/workbookhelper.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +struct QueryTable +{ + sal_Int32 mnConnectionId; +}; + +// struct WebQuery +// { +// enum WebQueryMode +// { +// xlWQUnknown, /// Not specified. +// xlWQDocument, /// Entire document. +// xlWQAllTables, /// All tables. +// xlWQSpecTables /// Specific tables. +// }; +// +// ::rtl::OUString maURL; /// Source document URL. +// ::rtl::OUString maTables; /// List of source range names. +// ::com::sun::star::table::CellRangeAddress maDestRange; /// Destination range. +// WebQueryMode meMode; /// Current mode of web query. +// sal_uInt16 mnRefresh; /// Refresh time in minutes. +// }; + +struct BaseProperties +{ +}; + +/** Stores web query properties from webPr element. */ +struct WebProperties : public BaseProperties +{ + ::rtl::OUString maURL; +}; + +/** Stores text data source properties from textPr element. */ +struct TextProperties : public BaseProperties +{ + ::rtl::OUString maSourceFile; +}; + +struct Connection +{ + static const sal_Int32 CONNECTION_ODBC_SOURCE; + static const sal_Int32 CONNECTION_DAO_SOURCE; + static const sal_Int32 CONNECTION_FILE_SOURCE; + static const sal_Int32 CONNECTION_WEBQUERY; + static const sal_Int32 CONNECTION_OLEDB_SOURCE; + static const sal_Int32 CONNECTION_TEXT_SOURCE; + static const sal_Int32 CONNECTION_ADO_RECORD_SET; + static const sal_Int32 CONNECTION_DSP; + + ::rtl::OUString maName; /// Connection name (must be unique). + sal_Int32 mnType; + ::boost::shared_ptr< BaseProperties > mpProperties; +}; + +// ============================================================================ + +typedef ::std::hash_map< ::rtl::OUString, QueryTable, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > QueryTableHashMap; + +class WebQueryBuffer : public WorkbookHelper +{ +public: + explicit WebQueryBuffer( const WorkbookHelper& rHelper ); + + void importQueryTable( const AttributeList& rAttribs ); + + void importConnection( const AttributeList& rAttribs ); + + void importWebPr( const AttributeList& rAttribs ); + + /** Dumps content for debug purposes. */ + void dump() const; + +private: + QueryTableHashMap maQueryTableMap; + ::std::vector< Connection > maConnections; + + sal_Int32 mnCurConnId; /// Current connection ID. +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/workbookfragment.hxx b/oox/inc/oox/xls/workbookfragment.hxx new file mode 100644 index 000000000000..f9f0bb25c78f --- /dev/null +++ b/oox/inc/oox/xls/workbookfragment.hxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_WORKBOOKFRAGMENT_HXX +#define OOX_XLS_WORKBOOKFRAGMENT_HXX + +#include "oox/xls/defnamesbuffer.hxx" +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +class ExternalLink; + +// ============================================================================ + +class OoxWorkbookFragment : public OoxWorkbookFragmentBase +{ +public: + explicit OoxWorkbookFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + virtual void finalizeImport(); + +private: + void importExternalReference( const AttributeList& rAttribs ); + void importDefinedName( const AttributeList& rAttribs ); + void importPivotCache( const AttributeList& rAttribs ); + + void importExternalRef( RecordInputStream& rStrm ); + void importPivotCache( RecordInputStream& rStrm ); + + void importExternalLinkFragment( ExternalLink& rExtLink ); + void importPivotCacheDefFragment( const ::rtl::OUString& rRelId, sal_Int32 nCacheId ); + +private: + DefinedNameRef mxCurrName; +}; + +// ============================================================================ + +class BiffWorkbookFragment : public BiffWorkbookFragmentBase +{ +public: + explicit BiffWorkbookFragment( const WorkbookHelper& rHelper, const ::rtl::OUString& rStrmName ); + + /** Imports the entire workbook stream, including all contained worksheets. */ + virtual bool importFragment(); + +private: + /** Imports a complete BIFF4 workspace fragment (with embedded sheets). */ + bool importWorkspaceFragment(); + /** Imports the workbook globals fragment from current stream position. */ + bool importGlobalsFragment( ISegmentProgressBar& rProgressBar ); + /** Imports a sheet fragment with passed type from current stream position. */ + bool importSheetFragment( + ISegmentProgressBar& rProgressBar, + BiffFragmentType eFragment, sal_Int16 nCalcSheet ); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/workbookhelper.hxx b/oox/inc/oox/xls/workbookhelper.hxx new file mode 100644 index 000000000000..90c0f33c3c50 --- /dev/null +++ b/oox/inc/oox/xls/workbookhelper.hxx @@ -0,0 +1,412 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_WORKBOOKHELPER_HXX +#define OOX_XLS_WORKBOOKHELPER_HXX + +#include <boost/shared_ptr.hpp> +#include <osl/time.h> +#include <rtl/ref.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include "oox/xls/biffhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace container { class XNameAccess; } + namespace container { class XNameContainer; } + namespace lang { class XMultiServiceFactory; } + namespace awt { class XDevice; } + namespace table { struct CellAddress; } + namespace table { struct CellRangeAddress; } + namespace table { class XCell; } + namespace table { class XCellRange; } + namespace sheet { class XSpreadsheetDocument; } + namespace sheet { class XSpreadsheet; } + namespace sheet { class XNamedRanges; } + namespace sheet { class XNamedRange; } + namespace sheet { class XDatabaseRanges; } + namespace sheet { class XExternalDocLinks; } + namespace style { class XStyle; } +} } } + +namespace oox { + class AttributeList; + class SegmentProgressBar; + class RecordInputStream; +} + +namespace oox { namespace core { + class BinaryFilterBase; + class FilterBase; + class FragmentHandler; + class XmlFilterBase; +} } + +namespace oox { namespace drawingml { + class Theme; +} } + +namespace oox { +namespace xls { + +// DEBUG ====================================================================== + +// Set this define to 1 to show the load/save time of a document in an assertion (nonpro only). +#define OOX_SHOW_LOADSAVE_TIME 0 + +// ---------------------------------------------------------------------------- + +#define OOX_LOADSAVE_TIMER( eTimerType ) (void)0 + +#if OSL_DEBUG_LEVEL > 0 +namespace dbg { + +// ---------------------------------------------------------------------------- + +#if OOX_SHOW_LOADSAVE_TIME > 0 + +enum TimerType +{ + TIMER_IMPORTFORMULA, + TIMER_IMPORTSHEETFRAGMENT, + TIMER_ONCREATESHEETCONTEXT, + TIMER_IMPORTROW, + TIMER_CONVERTROWFORMAT, + TIMER_CONVERTCOLUMNFORMAT, + TIMER_IMPORTCELL, + TIMER_ONENDSHEETELEMENT, + TIMER_SETCELL, + TIMER_SETCELLFORMAT, + TIMER_MERGECELLFORMAT, + TIMER_WRITECELLPROPERTIES, + TIMER_FINALIZESHEETDATA, + TIMER_FINALIZEDRAWING, + TIMER_FINALIZEBOOKDATA, + + // TIMER_TOTAL must be the last entry! + TIMER_TOTAL +}; + +// ---------------------------------------------------------------------------- + +struct TimeCount; + +class Timer +{ +public: + explicit Timer( TimeCount& rTimeCount ); + ~Timer(); +private: + TimeCount& mrTimeCount; + TimeValue maStartTime; +}; + +// ---------------------------------------------------------------------------- + +#undef OOX_LOADSAVE_TIMER +#define OOX_LOADSAVE_TIMER( TimerType ) ::oox::xls::dbg::Timer aDbgTimer##TimerType( getTimeCount( ::oox::xls::dbg::TIMER_##TimerType ) ) + +#endif + +// ---------------------------------------------------------------------------- + +struct WorkbookData; + +class WorkbookHelper +{ +protected: + explicit WorkbookHelper( WorkbookData& rBookData ); + explicit WorkbookHelper( const WorkbookHelper& rCopy ); + virtual ~WorkbookHelper(); +#if OOX_SHOW_LOADSAVE_TIME > 0 +public: + TimeCount& getTimeCount( TimerType eType ) const; +#endif +private: + WorkbookData& mrDbgBookData; +}; + +// ---------------------------------------------------------------------------- + +} // namespace dbg +#endif + +// ============================================================================ + +/** An enumeration for all supported spreadsheet filter types. */ +enum FilterType +{ + FILTER_OOX, /// MS Excel OOXML (Office Open XML) or OOBIN. + FILTER_BIFF, /// MS Excel BIFF (Binary Interchange File Format). + FILTER_UNKNOWN /// Unknown filter type. +}; + +// ============================================================================ + +/** Functor for case-insensitive string comparison, usable in maps etc. */ +struct IgnoreCaseCompare +{ + bool operator()( const ::rtl::OUString& rName1, const ::rtl::OUString& rName2 ) const; +}; + +// ============================================================================ + +class WorkbookData; +class WorkbookSettings; +class ViewSettings; +class WorksheetBuffer; +class ThemeBuffer; +class StylesBuffer; +class SharedStringsBuffer; +class ExternalLinkBuffer; +class DefinedNamesBuffer; +class TableBuffer; +class ScenarioBuffer; +class WebQueryBuffer; +class PivotCacheBuffer; +class PivotTableBuffer; +class FormulaParser; +class UnitConverter; +class AddressConverter; +class ExcelChartConverter; +class PageSettingsConverter; +class BiffCodecHelper; + +/** Helper class to provice access to global workbook data. + + All classes derived from this helper class will have access to a singleton + object of type WorkbookData containing global workbook settings, buffers, + converters, etc. Nearly all classes in this filter implementation are + derived directly or indirectly from this class. + */ +class WorkbookHelper +#if OSL_DEBUG_LEVEL > 0 + : public dbg::WorkbookHelper +#endif +{ +public: + /*implicit*/ WorkbookHelper( WorkbookData& rBookData ); + virtual ~WorkbookHelper(); + + // filter ----------------------------------------------------------------- + + /** Returns the base filter object (base class of all filters). */ + ::oox::core::FilterBase& getBaseFilter() const; + /** Returns a reference to the global service factory. */ + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > + getGlobalFactory() const; + /** Returns the file type of the current filter. */ + FilterType getFilterType() const; + /** Returns the filter progress bar. */ + SegmentProgressBar& getProgressBar() const; + /** Returns true, if the file is a multi-sheet document, or false if single-sheet. */ + bool isWorkbookFile() const; + /** Returns the index of the current sheet in the Calc document. */ + sal_Int16 getCurrentSheetIndex() const; + + /** Sets the index of the current sheet in the Calc document. */ + void setCurrentSheetIndex( sal_Int16 nSheet ); + /** Final conversion after importing the workbook. */ + void finalizeWorkbookImport(); + + // document model --------------------------------------------------------- + + /** Returns a reference to the source/target spreadsheet document model. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheetDocument > + getDocument() const; + /** Returns a reference to the service factory of the spreadsheet document model. */ + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > + getDocumentFactory() const; + /** Returns the reference device of the document. */ + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDevice > + getReferenceDevice() const; + /** Returns the container for defined names from the Calc document. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRanges > + getNamedRanges() const; + /** Returns the container for database ranges from the Calc document. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDatabaseRanges > + getDatabaseRanges() const; + /** Returns the container for external documents from the Calc document. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XExternalDocLinks > + getExternalDocLinks() const; + /** Returns the container for DDE links from the Calc document. */ + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > + getDdeLinks() const; + + /** Returns a reference to the specified spreadsheet in the document model. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet > + getSheetFromDoc( sal_Int16 nSheet ) const; + /** Returns a reference to the specified spreadsheet in the document model. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet > + getSheetFromDoc( const ::rtl::OUString& rSheet ) const; + + /** Returns the XCell interface for the passed cell address. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > + getCellFromDoc( + const ::com::sun::star::table::CellAddress& rAddress ) const; + /** Returns the XCellRange interface for the passed cell range address. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > + getCellRangeFromDoc( + const ::com::sun::star::table::CellRangeAddress& rRange ) const; + + /** Returns the cell or page styles container from the Calc document. */ + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > + getStyleFamily( bool bPageStyles ) const; + /** Returns the specified cell or page style from the Calc document. */ + ::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle > + getStyleObject( const ::rtl::OUString& rStyleName, bool bPageStyle ) const; + + /** Creates and returns a defined name on-the-fly in the Calc document. + The name will not be buffered in this defined names buffer. + @param orName (in/out-parameter) Returns the resulting used name. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange > + createNamedRangeObject( + ::rtl::OUString& orName, + sal_Int32 nNameFlags = 0 ) const; + /** Creates and returns a com.sun.star.style.Style object for cells or pages. */ + ::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle > + createStyleObject( + ::rtl::OUString& orStyleName, + bool bPageStyle ) const; + + // buffers ---------------------------------------------------------------- + + /** Returns the global workbook settings object. */ + WorkbookSettings& getWorkbookSettings() const; + /** Returns the workbook and sheet view settings object. */ + ViewSettings& getViewSettings() const; + /** Returns the worksheet buffer containing sheet names and properties. */ + WorksheetBuffer& getWorksheets() const; + /** Returns the office theme object read from the theme substorage. */ + ThemeBuffer& getTheme() const; + /** Returns all cell formatting objects read from the styles substream. */ + StylesBuffer& getStyles() const; + /** Returns the shared strings read from the shared strings substream. */ + SharedStringsBuffer& getSharedStrings() const; + /** Returns the external links read from the external links substream. */ + ExternalLinkBuffer& getExternalLinks() const; + /** Returns the defined names read from the workbook globals. */ + DefinedNamesBuffer& getDefinedNames() const; + /** Returns the tables collection (equivalent to Calc's database ranges). */ + TableBuffer& getTables() const; + /** Returns the scenarios collection. */ + ScenarioBuffer& getScenarios() const; + /** Returns the web queries. */ + WebQueryBuffer& getWebQueries() const; + /** Returns the collection of pivot caches. */ + PivotCacheBuffer& getPivotCaches() const; + /** Returns the collection of pivot tables. */ + PivotTableBuffer& getPivotTables() const; + + // converters ------------------------------------------------------------- + + /** Returns the import formula parser (import filter only!). */ + FormulaParser& getFormulaParser() const; + /** Returns the measurement unit converter. */ + UnitConverter& getUnitConverter() const; + /** Returns the converter for string to cell address/range conversion. */ + AddressConverter& getAddressConverter() const; + /** Returns the chart object converter. */ + ExcelChartConverter& getChartConverter() const; + /** Returns the page and print settings converter. */ + PageSettingsConverter& getPageSettingsConverter() const; + + // OOX specific ----------------------------------------------------------- + + /** Returns the base OOX filter object. + Must not be called, if current filter is not the OOX filter. */ + ::oox::core::XmlFilterBase& getOoxFilter() const; + + /** Imports a fragment using the passed fragment handler, which contains + the full path to the fragment stream. */ + bool importOoxFragment( const ::rtl::Reference< ::oox::core::FragmentHandler >& rxHandler ); + + // BIFF specific ---------------------------------------------------------- + + /** Returns the base BIFF filter object. */ + ::oox::core::BinaryFilterBase& getBiffFilter() const; + /** Returns the BIFF type in binary filter. */ + BiffType getBiff() const; + + /** Returns the text encoding used to import/export byte strings. */ + rtl_TextEncoding getTextEncoding() const; + /** Sets the text encoding to import/export byte strings. */ + void setTextEncoding( rtl_TextEncoding eTextEnc ); + /** Sets code page read from a CODEPAGE record for byte string import. */ + void setCodePage( sal_uInt16 nCodePage ); + /** Sets text encoding from the default application font, if CODEPAGE record is missing. */ + void setAppFontEncoding( rtl_TextEncoding eAppFontEnc ); + + /** Enables workbook file mode, used for BIFF4 workspace files. */ + void setIsWorkbookFile(); + /** Recreates global buffers that are used per sheet in specific BIFF versions. */ + void createBuffersPerSheet( sal_Int16 nSheet ); + + /** Returns the codec helper that stores the encoder/decoder object. */ + BiffCodecHelper& getCodecHelper() const; + +private: + WorkbookData& mrBookData; +}; + +// ============================================================================ + +namespace prv { + +typedef ::boost::shared_ptr< WorkbookData > WorkbookDataRef; + +struct WorkbookDataOwner +{ + explicit WorkbookDataOwner( WorkbookDataRef xBookData ); + virtual ~WorkbookDataOwner(); + WorkbookDataRef mxBookData; +}; + +} // namespace prv + +// ---------------------------------------------------------------------------- + +class WorkbookHelperRoot : private prv::WorkbookDataOwner, public WorkbookHelper +{ +public: + explicit WorkbookHelperRoot( ::oox::core::XmlFilterBase& rFilter ); + explicit WorkbookHelperRoot( ::oox::core::BinaryFilterBase& rFilter, BiffType eBiff ); + + /** Returns true, if this helper refers to a valid document. */ + bool isValid() const; + +private: + WorkbookHelperRoot( const WorkbookHelperRoot& ); + WorkbookHelperRoot& operator=( const WorkbookHelperRoot& ); +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/workbooksettings.hxx b/oox/inc/oox/xls/workbooksettings.hxx new file mode 100644 index 000000000000..d0f4ca17e73e --- /dev/null +++ b/oox/inc/oox/xls/workbooksettings.hxx @@ -0,0 +1,165 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_WORKBOOKSETTINGS_HXX +#define OOX_XLS_WORKBOOKSETTINGS_HXX + +#include "oox/xls/workbookhelper.hxx" + +namespace com { namespace sun { namespace star { namespace util { struct Date; } } } } + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Settings for workbook write protection. */ +struct FileSharingModel +{ + ::rtl::OUString maUserName; /// User who added the write protection password. + sal_uInt16 mnPasswordHash; /// Hash value of the write protection password. + bool mbRecommendReadOnly; /// True = recommend read-only mode on opening. + + explicit FileSharingModel(); +}; + +// ============================================================================ + +/** Global workbook settings. */ +struct WorkbookSettingsModel +{ + ::rtl::OUString maCodeName; /// VBA codename for the workbook. + sal_Int32 mnShowObjectMode; /// Specifies how objects are shown. + sal_Int32 mnUpdateLinksMode; /// Specifies how external links are updated. + sal_Int32 mnDefaultThemeVer; /// Default theme version. + bool mbDateMode1904; /// True = null date is 1904-01-01. + bool mbSaveExtLinkValues; /// True = save cached cell values for external links. + + explicit WorkbookSettingsModel(); + + /** Sets OOBIN or BIFF object visibility mode. */ + void setBinObjectMode( sal_uInt16 nObjMode ); +}; + +// ============================================================================ + +/** Workbook calculation settings. */ +struct CalcSettingsModel +{ + double mfIterateDelta; /// Minimum change in circular references. + sal_Int32 mnCalcId; /// Calculation engine identifier. + sal_Int32 mnRefMode; /// Cell reference mode: A1 or R1C1. + sal_Int32 mnCalcMode; /// Automatic or manual recalculation. + sal_Int32 mnIterateCount; /// Number of iterations in circular references. + sal_Int32 mnProcCount; /// Number of processors for concurrent calculation. + bool mbCalcOnSave; /// True = always recalculate formulas before save. + bool mbCalcCompleted; /// True = formulas have been recalculated before save. + bool mbFullPrecision; /// True = use full precision on calculation. + bool mbIterate; /// True = allow circular references. + bool mbConcurrent; /// True = concurrent calculation enabled. + bool mbUseNlr; /// True = use natural language references in formulas. + + explicit CalcSettingsModel(); +}; + +// ============================================================================ + +class WorkbookSettings : public WorkbookHelper +{ +public: + explicit WorkbookSettings( const WorkbookHelper& rHelper ); + + /** Imports the fileSharing element containing write protection settings. */ + void importFileSharing( const AttributeList& rAttribs ); + /** Imports the workbookPr element containing global workbook settings. */ + void importWorkbookPr( const AttributeList& rAttribs ); + /** Imports the calcPr element containing workbook calculation settings. */ + void importCalcPr( const AttributeList& rAttribs ); + + /** Imports the FILESHARING record containing write protection settings. */ + void importFileSharing( RecordInputStream& rStrm ); + /** Imports the WORKBOOKPR record containing global workbook settings. */ + void importWorkbookPr( RecordInputStream& rStrm ); + /** Imports the CALCPR record containing workbook calculation settings. */ + void importCalcPr( RecordInputStream& rStrm ); + + /** Sets the save external linked values flag, e.g. from the WSBOOL record. */ + void setSaveExtLinkValues( bool bSaveExtLinks ); + /** Imports the FILESHARING record. */ + void importFileSharing( BiffInputStream& rStrm ); + /** Imports the BOOKBOOL record. */ + void importBookBool( BiffInputStream& rStrm ); + /** Imports the CALCCOUNT record. */ + void importCalcCount( BiffInputStream& rStrm ); + /** Imports the CALCMODE record. */ + void importCalcMode( BiffInputStream& rStrm ); + /** Imports the CODENAME record. */ + void importCodeName( BiffInputStream& rStrm ); + /** Imports the DATEMODE record. */ + void importDateMode( BiffInputStream& rStrm ); + /** Imports the DELTA record. */ + void importDelta( BiffInputStream& rStrm ); + /** Imports the HIDEOBJ record. */ + void importHideObj( BiffInputStream& rStrm ); + /** Imports the ITERATION record. */ + void importIteration( BiffInputStream& rStrm ); + /** Imports the PRECISION record. */ + void importPrecision( BiffInputStream& rStrm ); + /** Imports the REFMODE record. */ + void importRefMode( BiffInputStream& rStrm ); + /** Imports the SAVERECALC record. */ + void importSaveRecalc( BiffInputStream& rStrm ); + /** Imports the UNCALCED record. */ + void importUncalced( BiffInputStream& rStrm ); + /** Imports the USESELFS record. */ + void importUsesElfs( BiffInputStream& rStrm ); + + /** Converts the imported workbook settings. */ + void finalizeImport(); + + /** Returns the show objects mode (considered a view setting in Calc). */ + sal_Int16 getApiShowObjectMode() const; + /** Returns the nulldate of this workbook. */ + ::com::sun::star::util::Date getNullDate() const; + +private: + /** Updates date mode and unit converter nulldate. */ + void setDateMode( bool bDateMode1904 ); + +private: + FileSharingModel maFileSharing; + WorkbookSettingsModel maBookSettings; + CalcSettingsModel maCalcSettings; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/worksheetbuffer.hxx b/oox/inc/oox/xls/worksheetbuffer.hxx new file mode 100644 index 000000000000..2f9359b38370 --- /dev/null +++ b/oox/inc/oox/xls/worksheetbuffer.hxx @@ -0,0 +1,133 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_WORKSHEETBUFFER_HXX +#define OOX_XLS_WORKSHEETBUFFER_HXX + +#include <utility> +#include "oox/helper/containerhelper.hxx" +#include "oox/xls/workbookhelper.hxx" + +namespace com { namespace sun { namespace star { + namespace i18n { class XCharacterClassification; } +} } } + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Contains data from the 'sheet' element describing a sheet in the workbook. */ +struct SheetInfoModel +{ + ::rtl::OUString maRelId; /// Relation identifier for the sheet substream. + ::rtl::OUString maName; /// Original name of the sheet. + sal_Int64 mnBiffHandle; /// BIFF record handle of the sheet substream. + sal_Int32 mnSheetId; /// Sheet identifier. + sal_Int32 mnState; /// Visibility state. + + explicit SheetInfoModel(); +}; + +// ============================================================================ + +/** Stores information about all sheets in a spreadsheet document. + + Information about sheets includes the sheet name, the visibility state, and + for the OOX filter, the relation identifier of the sheet used to obtain the + related worksheet fragment. + */ +class WorksheetBuffer : public WorkbookHelper +{ +public: + explicit WorksheetBuffer( const WorkbookHelper& rHelper ); + + /** Returns the base file name without path and file extension. */ + static ::rtl::OUString getBaseFileName( const ::rtl::OUString& rUrl ); + + /** Initializes the buffer for single sheet files (BIFF2-BIFF4). */ + void initializeSingleSheet(); + + /** Imports the attributes of a sheet element. */ + void importSheet( const AttributeList& rAttribs ); + /** Imports the SHEET record from the passed OOBIN stream. */ + void importSheet( RecordInputStream& rStrm ); + /** Imports the SHEET record from the passed BIFF stream. */ + void importSheet( BiffInputStream& rStrm ); + /** Inserts a new empty sheet into the document. Looks for an unused name. + @return Index of the new sheet in the Calc document. */ + sal_Int16 insertEmptySheet( const ::rtl::OUString& rPreferredName, bool bVisible ); + + /** Returns the number of original sheets contained in the workbook. */ + sal_Int32 getWorksheetCount() const; + /** Returns the OOX relation identifier of the specified worksheet. */ + ::rtl::OUString getWorksheetRelId( sal_Int32 nWorksheet ) const; + /** Returns the BIFF record handle of the associated sheet substream. */ + sal_Int64 getBiffRecordHandle( sal_Int32 nWorksheet ) const; + + /** Returns the Calc index of the specified worksheet. */ + sal_Int16 getCalcSheetIndex( sal_Int32 nWorksheet ) const; + /** Returns the finalized name of the specified worksheet. */ + ::rtl::OUString getCalcSheetName( sal_Int32 nWorksheet ) const; + + /** Returns the Calc index of the sheet with the passed original worksheet name. */ + sal_Int16 getCalcSheetIndex( const ::rtl::OUString& rWorksheetName ) const; + /** Returns the finalized name of the sheet with the passed worksheet name. */ + ::rtl::OUString getCalcSheetName( const ::rtl::OUString& rWorksheetName ) const; + +private: + struct SheetInfo : public SheetInfoModel + { + ::rtl::OUString maCalcName; + ::rtl::OUString maCalcQuotedName; + sal_Int16 mnCalcSheet; + + explicit SheetInfo( const SheetInfoModel& rModel, sal_Int16 nCalcSheet, const ::rtl::OUString& rCalcName ); + }; + + typedef ::std::pair< sal_Int16, ::rtl::OUString > IndexNamePair; + + /** Creates a new sheet in the Calc document. Does not insert anything in the own lists. */ + IndexNamePair createSheet( const ::rtl::OUString& rPreferredName, sal_Int32 nSheetPos, bool bVisible ); + /** Creates a new sheet in the Calc document and inserts the related SheetInfo. */ + void insertSheet( const SheetInfoModel& rModel ); + +private: + typedef RefVector< SheetInfo > SheetInfoVector; + SheetInfoVector maSheetInfos; + + typedef RefMap< ::rtl::OUString, SheetInfo, IgnoreCaseCompare > SheetInfoMap; + SheetInfoMap maSheetInfosByName; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/worksheetfragment.hxx b/oox/inc/oox/xls/worksheetfragment.hxx new file mode 100644 index 000000000000..7234153d7dd3 --- /dev/null +++ b/oox/inc/oox/xls/worksheetfragment.hxx @@ -0,0 +1,197 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_WORKSHEETFRAGMENT_HXX +#define OOX_XLS_WORKSHEETFRAGMENT_HXX + +#include "oox/xls/excelhandlers.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +class OoxDataValidationsContext : public OoxWorksheetContextBase +{ +public: + explicit OoxDataValidationsContext( OoxWorksheetFragmentBase& rFragment ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + +private: + /** Imports the dataValidation element containing data validation settings. */ + void importDataValidation( const AttributeList& rAttribs ); + /** Imports the DATAVALIDATION record containing data validation settings. */ + void importDataValidation( RecordInputStream& rStrm ); + +private: + ::std::auto_ptr< ValidationModel > mxValModel; +}; + +// ============================================================================ + +class OoxWorksheetFragment : public OoxWorksheetFragmentBase +{ +public: + explicit OoxWorksheetFragment( + const WorkbookHelper& rHelper, + const ::rtl::OUString& rFragmentPath, + ISegmentProgressBarRef xProgressBar, + WorksheetType eSheetType, + sal_Int16 nSheet ); + +protected: + // oox.core.ContextHandler2Helper interface ------------------------------- + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + virtual void onEndElement( const ::rtl::OUString& rChars ); + + virtual ::oox::core::ContextHandlerRef onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ); + + // oox.core.FragmentHandler2 interface ------------------------------------ + + virtual const ::oox::core::RecordInfo* getRecordInfos() const; + virtual void initializeImport(); + virtual void finalizeImport(); + +private: + /** Imports page settings from a pageSetUpPr element. */ + void importPageSetUpPr( const AttributeList& rAttribs ); + /** Imports the dimension element containing the used area of the sheet. */ + void importDimension( const AttributeList& rAttribs ); + /** Imports sheet format properties from a sheetFormatPr element. */ + void importSheetFormatPr( const AttributeList& rAttribs ); + /** Imports column settings from a col element. */ + void importCol( const AttributeList& rAttribs ); + /** Imports a merged cell range from a mergeCell element. */ + void importMergeCell( const AttributeList& rAttribs ); + /** Imports the hyperlink element containing a hyperlink for a cell range. */ + void importHyperlink( const AttributeList& rAttribs ); + /** Imports individual break that is either within row or column break context. */ + void importBrk( const AttributeList& rAttribs, bool bRowBreak ); + /** Imports the the relation identifier for the DrawingML part. */ + void importDrawing( const AttributeList& rAttribs ); + /** Imports the the relation identifier for the legacy VML drawing part. */ + void importLegacyDrawing( const AttributeList& rAttribs ); + /** Imports additional data for an OLE object. */ + void importOleObject( const AttributeList& rAttribs ); + /** Imports additional data for an OCX form control. */ + void importControl( const AttributeList& rAttribs ); + + /** Imports the DIMENSION record containing the used area of the sheet. */ + void importDimension( RecordInputStream& rStrm ); + /** Imports sheet format properties from a SHEETFORMATPR record. */ + void importSheetFormatPr( RecordInputStream& rStrm ); + /** Imports column settings from a COL record. */ + void importCol( RecordInputStream& rStrm ); + /** Imports a merged cell range from a MERGECELL record. */ + void importMergeCell( RecordInputStream& rStrm ); + /** Imports a hyperlink for a cell range from a HYPERLINK record. */ + void importHyperlink( RecordInputStream& rStrm ); + /** Imports the BRK record for an individual row or column page break. */ + void importBrk( RecordInputStream& rStrm, bool bRowBreak ); + /** Imports the DRAWING record containing the relation identifier for the DrawingML part. */ + void importDrawing( RecordInputStream& rStrm ); + /** Imports the LEGACYDRAWING record containing the relation identifier for the VML drawing part. */ + void importLegacyDrawing( RecordInputStream& rStrm ); + /** Imports additional data for an OLE object. */ + void importOleObject( RecordInputStream& rStrm ); + /** Imports additional data for an OCX form control. */ + void importControl( RecordInputStream& rStrm ); + + /** Imports the binary data of an embedded OLE object from the fragment with the passed ID. */ + void importEmbeddedOleData( StreamDataSequence& orEmbeddedData, const ::rtl::OUString& rRelId ); +}; + +// ============================================================================ + +class BiffPivotTableContext; + +class BiffWorksheetFragment : public BiffWorksheetFragmentBase +{ +public: + explicit BiffWorksheetFragment( + const BiffWorkbookFragmentBase& rParent, + ISegmentProgressBarRef xProgressBar, + WorksheetType eSheetType, + sal_Int16 nSheet ); + virtual ~BiffWorksheetFragment(); + + /** Imports the entire worksheet fragment, returns true, if EOF record has been reached. */ + virtual bool importFragment(); + +private: + /** Imports the COLINFO record and sets column properties and formatting. */ + void importColInfo(); + /** Imports the BIFF2 COLUMNDEFAULT record and sets column default formatting. */ + void importColumnDefault(); + /** Imports the BIFF2 COLWIDTH record and sets column width. */ + void importColWidth(); + /** Imports the DATAVALIDATION record containing cell ranges with data validation settings. */ + void importDataValidation(); + /** Imports the DATAVALIDATIONS record containing global data validation settings. */ + void importDataValidations(); + /** Imports the DEFCOLWIDTH record and sets default column width. */ + void importDefColWidth(); + /** Imports the DEFROWHEIGHT record and sets default row height and properties. */ + void importDefRowHeight(); + /** Imports the DIMENSION record containing the used area of the sheet. */ + void importDimension(); + /** Imports the HYPERLINK record and sets a cell hyperlink. */ + void importHyperlink(); + /** Imports the LABELRANGES record and sets the imported label ranges. */ + void importLabelRanges(); + /** Imports the MEREDCELLS record and merges all cells in the document. */ + void importMergedCells(); + /** Imports the HORPAGEBREAKS or VERPAGEBREAKS record and inserts page breaks. */ + void importPageBreaks( bool bRowBreak ); + /** Imports a pivot table. */ + void importPTDefinition(); + /** Imports the SCENARIOS record and the following scenarios. */ + void importScenarios(); + /** Imports the SHAREDFEATHEAD record. */ + void importSharedFeatHead(); + /** Imports the STANDARDWIDTH record and sets standard column width. */ + void importStandardWidth(); + +private: + ::boost::shared_ptr< BiffPivotTableContext > mxPTContext; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/worksheethelper.hxx b/oox/inc/oox/xls/worksheethelper.hxx new file mode 100644 index 000000000000..4fdd827ff648 --- /dev/null +++ b/oox/inc/oox/xls/worksheethelper.hxx @@ -0,0 +1,464 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_WORKSHEETHELPER_HXX +#define OOX_XLS_WORKSHEETHELPER_HXX + +#include "oox/helper/progressbar.hxx" +#include "oox/ole/olehelper.hxx" +#include "oox/xls/addressconverter.hxx" +#include "oox/xls/formulabase.hxx" + +namespace com { namespace sun { namespace star { + namespace awt { struct Point; } + namespace awt { struct Size; } + namespace util { struct DateTime; } + namespace drawing { class XDrawPage; } + namespace table { class XTableColumns; } + namespace table { class XTableRows; } + namespace table { class XCell; } + namespace table { class XCellRange; } + namespace sheet { class XSpreadsheet; } + namespace sheet { class XSheetCellRanges; } +} } } + +namespace oox { +namespace xls { + +struct BinAddress; +struct BinRange; +class BinRangeList; +class WorksheetSettings; +class SharedFormulaBuffer; +class CondFormatBuffer; +class CommentsBuffer; +class PageSettings; +class SheetViewSettings; +class VmlDrawing; + +// ============================================================================ +// ============================================================================ + +/** An enumeration for all types of sheets in a workbook. */ +enum WorksheetType +{ + SHEETTYPE_WORKSHEET, /// Worksheet. + SHEETTYPE_CHARTSHEET, /// Chart sheet. + SHEETTYPE_MACROSHEET, /// Macro sheet. + SHEETTYPE_DIALOGSHEET, /// Dialog sheet (BIFF5+). + SHEETTYPE_MODULESHEET, /// VB module sheet (BIFF5 only). + SHEETTYPE_EMPTYSHEET /// Other (unsupported) sheet type. +}; + +// ============================================================================ + +/** Stores some data about a cell. */ +struct CellModel +{ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > mxCell; + ::com::sun::star::table::CellAddress maAddress; + ::rtl::OUString maValueStr; /// String containing cell value data. + ::rtl::OUString maFormulaRef; /// String containing formula range for array/shared formulas. + sal_Int32 mnCellType; /// Data type of the cell. + sal_Int32 mnFormulaType; /// Type of the imported formula. + sal_Int32 mnSharedId; /// Shared formula identifier for current cell. + sal_Int32 mnXfId; /// XF identifier for the cell. + sal_Int32 mnNumFmtId; /// Forced number format for the cell. + bool mbHasValueStr; /// True = contents of maValueStr are valid. + bool mbShowPhonetic; /// True = show phonetic text. + + inline explicit CellModel() { reset(); } + void reset(); +}; + +// ---------------------------------------------------------------------------- + +/** Stores data about a data table a.k.a. multiple operation range. */ +struct DataTableModel +{ + ::rtl::OUString maRef1; /// String containing first reference cell for data table formulas. + ::rtl::OUString maRef2; /// String containing second reference cell for data table formulas. + bool mb2dTable; /// True = 2-dimensional data table. + bool mbRowTable; /// True = row oriented data table. + bool mbRef1Deleted; /// True = first reference cell deleted. + bool mbRef2Deleted; /// True = second reference cell deleted. + + explicit DataTableModel(); +}; + +// ---------------------------------------------------------------------------- + +/** Stores formatting data about a range of columns. */ +struct ColumnModel +{ + sal_Int32 mnFirstCol; /// 1-based (!) index of first column. + sal_Int32 mnLastCol; /// 1-based (!) index of last column. + double mfWidth; /// Column width in number of characters. + sal_Int32 mnXfId; /// Column default formatting. + sal_Int32 mnLevel; /// Column outline level. + bool mbShowPhonetic; /// True = cells in column show phonetic settings. + bool mbHidden; /// True = column is hidden. + bool mbCollapsed; /// True = column outline is collapsed. + + explicit ColumnModel(); + + /** Expands this entry with the passed column range, if column settings are equal. */ + bool tryExpand( const ColumnModel& rModel ); +}; + +// ---------------------------------------------------------------------------- + +/** Stores formatting data about a range of rows. */ +struct RowModel +{ + sal_Int32 mnFirstRow; /// 1-based (!) index of first row. + sal_Int32 mnLastRow; /// 1-based (!) index of last row. + double mfHeight; /// Row height in points. + sal_Int32 mnXfId; /// Row default formatting (see mbIsFormatted). + sal_Int32 mnLevel; /// Row outline level. + bool mbCustomHeight; /// True = row has custom height. + bool mbCustomFormat; /// True = cells in row have explicit formatting. + bool mbShowPhonetic; /// True = cells in row show phonetic settings. + bool mbHidden; /// True = row is hidden. + bool mbCollapsed; /// True = row outline is collapsed. + bool mbThickTop; /// True = row has extra space above text. + bool mbThickBottom; /// True = row has extra space below text. + + explicit RowModel(); + + /** Expands this entry with the passed row range, if row settings are equal. */ + bool tryExpand( const RowModel& rModel ); +}; + +// ---------------------------------------------------------------------------- + +/** Stores formatting data about a page break. */ +struct PageBreakModel +{ + sal_Int32 mnColRow; /// 0-based (!) index of column/row. + sal_Int32 mnMin; /// Start of limited break. + sal_Int32 mnMax; /// End of limited break. + bool mbManual; /// True = manual page break. + + explicit PageBreakModel(); +}; + +// ---------------------------------------------------------------------------- + +/** Stores data about a hyperlink range. */ +struct HyperlinkModel : public ::oox::ole::StdHlinkInfo +{ + ::com::sun::star::table::CellRangeAddress + maRange; /// The cell area containing the hyperlink. + ::rtl::OUString maTooltip; /// Additional tooltip text. + + explicit HyperlinkModel(); +}; + +// ---------------------------------------------------------------------------- + +/** Stores data about ranges with data validation settings. */ +struct ValidationModel +{ + ApiCellRangeList maRanges; + ApiTokenSequence maTokens1; + ApiTokenSequence maTokens2; + ::rtl::OUString maInputTitle; + ::rtl::OUString maInputMessage; + ::rtl::OUString maErrorTitle; + ::rtl::OUString maErrorMessage; + sal_Int32 mnType; + sal_Int32 mnOperator; + sal_Int32 mnErrorStyle; + bool mbShowInputMsg; + bool mbShowErrorMsg; + bool mbNoDropDown; + bool mbAllowBlank; + + explicit ValidationModel(); + + /** Sets the passed OOBIN or BIFF validation type. */ + void setBinType( sal_uInt8 nType ); + /** Sets the passed OOBIN or BIFF operator. */ + void setBinOperator( sal_uInt8 nOperator ); + /** Sets the passed OOBIN or BIFF error style. */ + void setBinErrorStyle( sal_uInt8 nErrorStyle ); +}; + +// ============================================================================ +// ============================================================================ + +class WorksheetData; + +class WorksheetHelper : public WorkbookHelper +{ +public: + /*implicit*/ WorksheetHelper( WorksheetData& rSheetData ); + + /** Returns the type of this sheet. */ + WorksheetType getSheetType() const; + /** Returns the index of the current sheet. */ + sal_Int16 getSheetIndex() const; + /** Returns the XSpreadsheet interface of the current sheet. */ + const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet >& + getSheet() const; + + /** Returns the XCell interface for the passed cell address. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > + getCell( + const ::com::sun::star::table::CellAddress& rAddress ) const; + /** Returns the XCell interface for the passed cell address string. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > + getCell( + const ::rtl::OUString& rAddressStr, + ::com::sun::star::table::CellAddress* opAddress = 0 ) const; + /** Returns the XCell interface for the passed cell address. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > + getCell( + const BinAddress& rBinAddress, + ::com::sun::star::table::CellAddress* opAddress = 0 ) const; + + /** Returns the XCellRange interface for the passed cell range address. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > + getCellRange( + const ::com::sun::star::table::CellRangeAddress& rRange ) const; + /** Returns the XCellRange interface for the passed range address string. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > + getCellRange( + const ::rtl::OUString& rRangeStr, + ::com::sun::star::table::CellRangeAddress* opRange = 0 ) const; + /** Returns the XCellRange interface for the passed range address. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > + getCellRange( + const BinRange& rBinRange, + ::com::sun::star::table::CellRangeAddress* opRange = 0 ) const; + + /** Returns the XSheetCellRanges interface for the passed cell range addresses. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > + getCellRangeList( const ApiCellRangeList& rRanges ) const; + /** Returns the XSheetCellRanges interface for the passed space-separated range list. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > + getCellRangeList( + const ::rtl::OUString& rRangesStr, + ApiCellRangeList* opRanges = 0 ) const; + /** Returns the XSheetCellRanges interface for the passed range list. */ + ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetCellRanges > + getCellRangeList( + const BinRangeList& rBinRanges, + ApiCellRangeList* opRanges = 0 ) const; + + /** Returns the address of the passed cell. The cell reference must be valid. */ + static ::com::sun::star::table::CellAddress + getCellAddress( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >& rxCell ); + /** Returns the address of the passed cell range. The range reference must be valid. */ + static ::com::sun::star::table::CellRangeAddress + getRangeAddress( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange >& rxRange ); + + /** Returns the XCellRange interface for a column. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > + getColumn( sal_Int32 nCol ) const; + /** Returns the XCellRange interface for a row. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > + getRow( sal_Int32 nRow ) const; + + /** Returns the XTableColumns interface for a range of columns. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XTableColumns > + getColumns( sal_Int32 nFirstCol, sal_Int32 nLastCol ) const; + /** Returns the XTableRows interface for a range of rows. */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XTableRows > + getRows( sal_Int32 nFirstRow, sal_Int32 nLastRow ) const; + + /** Returns the XDrawPage interface of the draw page of the current sheet. */ + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > + getDrawPage() const; + + /** Returns the absolute cell position in 1/100 mm. */ + ::com::sun::star::awt::Point getCellPosition( sal_Int32 nCol, sal_Int32 nRow ) const; + /** Returns the cell size in 1/100 mm. */ + ::com::sun::star::awt::Size getCellSize( sal_Int32 nCol, sal_Int32 nRow ) const; + /** Returns the size of the entire drawing page in 1/100 mm. */ + ::com::sun::star::awt::Size getDrawPageSize() const; + + /** Returns the worksheet settings object. */ + WorksheetSettings& getWorksheetSettings() const; + /** Returns the buffer containing all shared formulas in this sheet. */ + SharedFormulaBuffer& getSharedFormulas() const; + /** Returns the conditional formattings in this sheet. */ + CondFormatBuffer& getCondFormats() const; + /** Returns the buffer for all cell comments in this sheet. */ + CommentsBuffer& getComments() const; + /** Returns the page/print settings for this sheet. */ + PageSettings& getPageSettings() const; + /** Returns the view settings for this sheet. */ + SheetViewSettings& getSheetViewSettings() const; + /** Returns the VML drawing page for this sheet. */ + VmlDrawing& getVmlDrawing() const; + + /** Sets the passed string to the cell. */ + void setStringCell( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >& rxCell, + const ::rtl::OUString& rText ) const; + /** Sets the shared string with the passed identifier to the cell. */ + void setSharedStringCell( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >& rxCell, + sal_Int32 nStringId, + sal_Int32 nXfId ) const; + /** Sets the passed date/time value to the cell and adjusts number format. */ + void setDateTimeCell( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >& rxCell, + const ::com::sun::star::util::DateTime& rDateTime ) const; + /** Sets the passed boolean value to the cell and adjusts number format. */ + void setBooleanCell( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >& rxCell, + bool bValue ) const; + /** Sets the passed BIFF error code to the cell (by converting it to a formula). */ + void setErrorCell( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >& rxCell, + const ::rtl::OUString& rErrorCode ) const; + /** Sets the passed BIFF error code to the cell (by converting it to a formula). */ + void setErrorCell( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >& rxCell, + sal_uInt8 nErrorCode ) const; + /** Sets cell contents to the cell specified in the passed cell model. */ + void setCell( CellModel& orModel ) const; + + /** Sets a standard number format (constant from com.sun.star.util.NumberFormat) to the passed cell. */ + void setStandardNumFmt( + const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >& rxCell, + sal_Int16 nStdNumFmt ) const; + + /** Changes the current sheet type. */ + void setSheetType( WorksheetType eSheetType ); + /** Sets the dimension (used area) of the sheet. */ + void setDimension( const ::com::sun::star::table::CellRangeAddress& rRange ); + /** Stores the cell formatting data of the current cell. */ + void setCellFormat( const CellModel& rModel ); + /** Merges the cells in the passed cell range. */ + void setMergedRange( const ::com::sun::star::table::CellRangeAddress& rRange ); + /** Sets a column or row page break described in the passed struct. */ + void setPageBreak( const PageBreakModel& rModel, bool bRowBreak ); + /** Inserts the hyperlink URL into the spreadsheet. */ + void setHyperlink( const HyperlinkModel& rModel ); + /** Inserts the data validation settings into the spreadsheet. */ + void setValidation( const ValidationModel& rModel ); + /** Sets a multiple table operation to the passed range. */ + void setTableOperation( + const ::com::sun::star::table::CellRangeAddress& rRange, + const DataTableModel& rModel ) const; + /** Sets the passed label ranges to the current sheet. */ + void setLabelRanges( + const ApiCellRangeList& rColRanges, + const ApiCellRangeList& rRowRanges ); + /** Sets the path to the DrawingML fragment of this sheet. */ + void setDrawingPath( const ::rtl::OUString& rDrawingPath ); + /** Sets the path to the legacy VML drawing fragment of this sheet. */ + void setVmlDrawingPath( const ::rtl::OUString& rVmlDrawingPath ); + + /** Sets base width for all columns (without padding pixels). This value + is only used, if width has not been set with setDefaultColumnWidth(). */ + void setBaseColumnWidth( sal_Int32 nWidth ); + /** Sets default width for all columns. This function overrides the base + width set with the setBaseColumnWidth() function. */ + void setDefaultColumnWidth( double fWidth ); + /** Converts default cell formatting for a range of columns. */ + void setDefaultColumnFormat( sal_Int32 nFirstCol, sal_Int32 nLastCol, sal_Int32 nXfId ); + /** Sets column settings for a specific range of columns. + @descr Column default formatting is converted directly, other settings + are cached and converted in the finalizeWorksheetImport() call. */ + void setColumnModel( const ColumnModel& rModel ); + + /** Sets default height and hidden state for all unused rows in the sheet. */ + void setDefaultRowSettings( + double fHeight, bool bCustomHeight, + bool bHidden, bool bThickTop, bool bThickBottom ); + /** Sets row settings for a specific range of rows. + @descr Row default formatting is converted directly, other settings + are cached and converted in the finalizeWorksheetImport() call. */ + void setRowModel( const RowModel& rModel ); + + /** Initial conversion before importing the worksheet. */ + void initializeWorksheetImport(); + /** Final conversion after importing the worksheet. */ + void finalizeWorksheetImport(); + +private: + WorksheetData& mrSheetData; +}; + +// ============================================================================ + +namespace prv { + +typedef ::boost::shared_ptr< WorksheetData > WorksheetDataRef; + +struct WorksheetDataOwner +{ + explicit WorksheetDataOwner( WorksheetDataRef xSheetData ); + virtual ~WorksheetDataOwner(); + WorksheetDataRef mxSheetData; +}; + +} // namespace prv + +// ---------------------------------------------------------------------------- + +class WorksheetHelperRoot : private prv::WorksheetDataOwner, public WorksheetHelper +{ +public: + /** Returns true, if this helper refers to an existing Calc sheet. */ + bool isValidSheet() const; + +protected: + /** Constructs from the passed data, creates and owns a new data object. */ + explicit WorksheetHelperRoot( + const WorkbookHelper& rHelper, + ISegmentProgressBarRef xProgressBar, + WorksheetType eSheetType, + sal_Int16 nSheet ); + + /** Constructs from another sheet helper, does not create a data object. */ + explicit WorksheetHelperRoot( + const WorksheetHelper& rHelper ); + + /** Constructs from another sheet helper, shares ownership of the passed helper. */ + explicit WorksheetHelperRoot( + const WorksheetHelperRoot& rHelper ); + +private: + WorksheetHelperRoot& operator=( const WorksheetHelperRoot& ); +}; + +// ============================================================================ +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + diff --git a/oox/inc/oox/xls/worksheetsettings.hxx b/oox/inc/oox/xls/worksheetsettings.hxx new file mode 100644 index 000000000000..c96f12605911 --- /dev/null +++ b/oox/inc/oox/xls/worksheetsettings.hxx @@ -0,0 +1,141 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef OOX_XLS_WORKSHEETSETTINGS_HXX +#define OOX_XLS_WORKSHEETSETTINGS_HXX + +#include "oox/xls/worksheethelper.hxx" +#include "oox/xls/richstring.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +/** Sheet and outline settings. */ +struct SheetSettingsModel +{ + ::rtl::OUString maCodeName; /// VBA module codename. + Color maTabColor; /// Sheet tab color. + bool mbFilterMode; /// True = sheet contains active filter. + bool mbApplyStyles; /// True = automatic styles when creating outlines. + bool mbSummaryBelow; /// True = row outline symbols below group. + bool mbSummaryRight; /// True = column outline symbols right of group. + + explicit SheetSettingsModel(); +}; + +// ============================================================================ + +/** Sheet protection settings. */ +struct SheetProtectionModel +{ + sal_uInt16 mnPasswordHash; /// Hash value from sheet protection password. + bool mbSheet; /// True = sheet protection enabled, locked cells are protcted. + bool mbObjects; /// True = objects locked. + bool mbScenarios; /// True = scenarios locked. + bool mbFormatCells; /// True = format cells locked. + bool mbFormatColumns; /// True = format columns locked. + bool mbFormatRows; /// True = format rows locked. + bool mbInsertColumns; /// True = insert columns locked. + bool mbInsertRows; /// True = insert rows locked. + bool mbInsertHyperlinks; /// True = insert hyperlinks locked. + bool mbDeleteColumns; /// True = delete columns locked. + bool mbDeleteRows; /// True = delete rows locked. + bool mbSelectLocked; /// True = select locked cells locked. + bool mbSort; /// True = sorting locked. + bool mbAutoFilter; /// True = autofilters locked. + bool mbPivotTables; /// True = pivot tables locked. + bool mbSelectUnlocked; /// True = select unlocked cells locked. + + explicit SheetProtectionModel(); +}; + +// ============================================================================ + +class WorksheetSettings : public WorksheetHelper +{ +public: + explicit WorksheetSettings( const WorksheetHelper& rHelper ); + + /** Imports sheet settings from the sheetPr element. */ + void importSheetPr( const AttributeList& rAttribs ); + /** Imports chart sheet settings from the sheetPr element. */ + void importChartSheetPr( const AttributeList& rAttribs ); + /** Imports the sheet tab color from the tabColor element. */ + void importTabColor( const AttributeList& rAttribs ); + /** Imports outline settings from the outlinePr element. */ + void importOutlinePr( const AttributeList& rAttribs ); + /** Imports protection settings from the sheetProtection element. */ + void importSheetProtection( const AttributeList& rAttribs ); + /** Imports protection settings from the sheetProtection element of a chart sheet. */ + void importChartProtection( const AttributeList& rAttribs ); + /** Imports phonetic settings from the phoneticPr element. */ + void importPhoneticPr( const AttributeList& rAttribs ); + + /** Imports sheet properties from the SHEETPR record. */ + void importSheetPr( RecordInputStream& rStrm ); + /** Imports sheet properties from the CHARTSHEETPR record. */ + void importChartSheetPr( RecordInputStream& rStrm ); + /** Imports sheet protection settings from the SHEETPROTECTION record. */ + void importSheetProtection( RecordInputStream& rStrm ); + /** Imports chart sheet protection settings from the CHARTPROTECTION record. */ + void importChartProtection( RecordInputStream& rStrm ); + /** Imports phonetic settings from the PHONETICPR record. */ + void importPhoneticPr( RecordInputStream& rStrm ); + + /** Imports sheet properties from a SHEETPR record. */ + void importSheetPr( BiffInputStream& rStrm ); + /** Imports protection status from the PROTECT record. */ + void importProtect( BiffInputStream& rStrm ); + /** Imports object protection status from the OBJECTPROTECT record. */ + void importObjectProtect( BiffInputStream& rStrm ); + /** Imports scenario protection status from the SCENPROTECT record. */ + void importScenProtect( BiffInputStream& rStrm ); + /** Imports sheet password hash from the PASSWORD record. */ + void importPassword( BiffInputStream& rStrm ); + /** Imports protection settings from the SHEETPROTECTION record. */ + void importSheetProtection( BiffInputStream& rStrm ); + /** Imports phonetic settings from the PHONETICPR record. */ + void importPhoneticPr( BiffInputStream& rStrm ); + + /** Converts the imported worksheet settings. */ + void finalizeImport(); + +private: + PhoneticSettings maPhoneticSett; + SheetSettingsModel maSheetSettings; + SheetProtectionModel maSheetProt; +}; + +// ============================================================================ + +} // namespace xls +} // namespace oox + +#endif + |