summaryrefslogtreecommitdiff
path: root/sc/source/filter/inc/fapihelper.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/inc/fapihelper.hxx')
-rw-r--r--sc/source/filter/inc/fapihelper.hxx352
1 files changed, 352 insertions, 0 deletions
diff --git a/sc/source/filter/inc/fapihelper.hxx b/sc/source/filter/inc/fapihelper.hxx
new file mode 100644
index 000000000000..8c204f1cef35
--- /dev/null
+++ b/sc/source/filter/inc/fapihelper.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 SC_FAPIHELPER_HXX
+#define SC_FAPIHELPER_HXX
+
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <tools/color.hxx>
+#include <comphelper/types.hxx>
+#include "ftools.hxx"
+#include "scdllapi.h"
+
+namespace com { namespace sun { namespace star {
+ namespace lang { class XMultiServiceFactory; }
+} } }
+
+namespace comphelper { class IDocPasswordVerifier; }
+
+// Static helper functions ====================================================
+
+class SfxMedium;
+class SfxObjectShell;
+
+/** Static API helper functions. */
+class ScfApiHelper
+{
+public:
+ typedef ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > XInterfaceRef;
+ typedef ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > XServiceFactoryRef;
+ typedef ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > UnoAnySequence;
+
+public:
+ /** Converts a tools color to a UNO color value. */
+ inline static sal_Int32 ConvertToApiColor( const Color& rColor )
+ { return static_cast< sal_Int32 >( rColor.GetColor() ); }
+ /** Converts a UNO color value to a tools color. */
+ inline static Color ConvertFromApiColor( sal_Int32 nApiColor )
+ { return Color( static_cast< ColorData >( nApiColor ) ); }
+
+ /** Converts a non-empty vector into a UNO sequence containing elements of the same type. */
+ template< typename Type >
+ static ::com::sun::star::uno::Sequence< Type >
+ VectorToSequence( const ::std::vector< Type >& rVector );
+
+ /** Returns the service name provided via the XServiceName interface, or an empty string on error. */
+ static ::rtl::OUString GetServiceName( XInterfaceRef xInt );
+
+ /** Returns the multi service factory from a document shell. */
+ static XServiceFactoryRef GetServiceFactory( SfxObjectShell* pShell );
+
+ /** Creates an instance from the passed service name, using the passed service factory. */
+ static XInterfaceRef CreateInstance(
+ XServiceFactoryRef xFactory,
+ const ::rtl::OUString& rServiceName );
+
+ /** Creates an instance from the passed service name, using the service factory of the passed object. */
+ static XInterfaceRef CreateInstance(
+ SfxObjectShell* pShell,
+ const ::rtl::OUString& rServiceName );
+
+ /** Creates an instance from the passed service name, using the process service factory. */
+ static XInterfaceRef CreateInstance( const ::rtl::OUString& rServiceName );
+
+ /** Creates an instance from the passed service name, using the passed service factory. */
+ static XInterfaceRef CreateInstanceWithArgs(
+ XServiceFactoryRef xFactory,
+ const ::rtl::OUString& rServiceName,
+ const UnoAnySequence& rArgs );
+
+//UNUSED2008-05 /** Creates an instance from the passed service name, using the service factory of the passed object. */
+//UNUSED2008-05 static XInterfaceRef CreateInstanceWithArgs(
+//UNUSED2008-05 SfxObjectShell* pShell,
+//UNUSED2008-05 const ::rtl::OUString& rServiceName,
+//UNUSED2008-05 const UnoAnySequence& rArgs );
+
+ /** Creates an instance from the passed service name, using the process service factory. */
+ static XInterfaceRef CreateInstanceWithArgs(
+ const ::rtl::OUString& rServiceName,
+ const UnoAnySequence& rArgs );
+
+ /** Opens a password dialog and returns the entered password.
+ @return The entered password or an empty string on 'Cancel' or any error. */
+ static String QueryPasswordForMedium( SfxMedium& rMedium,
+ ::comphelper::IDocPasswordVerifier& rVerifier,
+ const ::std::vector< ::rtl::OUString >* pDefaultPasswords = 0 );
+};
+
+template< typename Type >
+::com::sun::star::uno::Sequence< Type > ScfApiHelper::VectorToSequence( const ::std::vector< Type >& rVector )
+{
+ DBG_ASSERT( !rVector.empty(), "ScfApiHelper::VectorToSequence - vector is empty" );
+ return ::com::sun::star::uno::Sequence< Type >( &rVector.front(), static_cast< sal_Int32 >( rVector.size() ) );
+}
+
+// Property sets ==============================================================
+
+/** 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 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 XMultiPropertySet interface. If the
+ implementation does not support the XMultiPropertySet interface, all
+ properties are handled separately in a loop.
+ */
+class ScfPropertySet
+{
+public:
+ typedef ::com::sun::star::uno::Reference<
+ ::com::sun::star::beans::XPropertySet > XPropertySetRef;
+ typedef ::com::sun::star::uno::Reference<
+ ::com::sun::star::beans::XMultiPropertySet > XMultiPropSetRef;
+ typedef ::com::sun::star::uno::Any UnoAny;
+ typedef ::com::sun::star::uno::Sequence< UnoAny > UnoAnySequence;
+ typedef ::com::sun::star::uno::Sequence< ::rtl::OUString > OUStringSequence;
+
+public:
+ inline explicit ScfPropertySet() {}
+ /** Constructs a property set wrapper with the passed UNO property set. */
+ inline explicit ScfPropertySet( XPropertySetRef xPropSet ) { Set( xPropSet ); }
+ /** Constructs a property set wrapper after querying the XPropertySet interface. */
+ template< typename InterfaceType >
+ inline explicit ScfPropertySet( ::com::sun::star::uno::Reference< InterfaceType > xInterface ) { Set( xInterface ); }
+
+ /** Sets the passed UNO property set and releases the old UNO property set. */
+ void Set( XPropertySetRef xPropSet );
+ /** Queries the passed interface for an XPropertySet and releases the old UNO property set. */
+ template< typename InterfaceType >
+ inline void Set( ::com::sun::star::uno::Reference< InterfaceType > xInterface )
+ { Set( XPropertySetRef( xInterface, ::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 XPropertySetRef GetApiPropertySet() const { return mxPropSet; }
+
+ /** Returns the service name provided via the XServiceName interface, or an empty string on error. */
+ ::rtl::OUString GetServiceName() const;
+
+ // Get properties ---------------------------------------------------------
+
+ /** Returns true, if the property set contains the specified property. */
+ bool HasProperty( const ::rtl::OUString& rPropName ) const;
+
+ /** Gets the specified property from the property set.
+ @return true, if the Any could be filled with the property value. */
+ bool GetAnyProperty( UnoAny& rValue, const ::rtl::OUString& rPropName ) 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& rValue, const ::rtl::OUString& rPropName ) const
+ { UnoAny aAny; return GetAnyProperty( aAny, rPropName ) && (aAny >>= rValue); }
+
+ /** Gets the specified Boolean property from the property set.
+ @return true = property contains true; false = property contains false or error occured. */
+ bool GetBoolProperty( const ::rtl::OUString& rPropName ) const;
+
+ /** Gets the specified Boolean property from the property set.
+ @return true, if the passed Boolean variable could be filled with the property value. */
+ bool GetStringProperty( String& rValue, const ::rtl::OUString& rPropName ) const;
+
+ /** Gets the specified color property from the property set.
+ @return true, if the passed color variable could be filled with the property value. */
+ bool GetColorProperty( Color& rColor, const ::rtl::OUString& rPropName ) const;
+
+ /** Gets the specified properties from 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 GetProperties( UnoAnySequence& rValues, const OUStringSequence& rPropNames ) const;
+
+ // Set properties ---------------------------------------------------------
+
+ /** Puts the passed Any into the property set. */
+ void SetAnyProperty( const ::rtl::OUString& rPropName, const UnoAny& rValue );
+
+ /** Puts the passed value into the property set. */
+ template< typename Type >
+ inline void SetProperty( const ::rtl::OUString& rPropName, const Type& rValue )
+ { SetAnyProperty( rPropName, ::com::sun::star::uno::makeAny( rValue ) ); }
+
+ /** Puts the passed Boolean value into the property set. */
+ inline void SetBoolProperty( const ::rtl::OUString& rPropName, bool bValue )
+ { SetAnyProperty( rPropName, ::comphelper::makeBoolAny( bValue ) ); }
+
+ /** Puts the passed string into the property set. */
+ inline void SetStringProperty( const ::rtl::OUString& rPropName, const String& rValue )
+ { SetProperty( rPropName, ::rtl::OUString( rValue ) ); }
+
+ /** Puts the passed color into the property set. */
+ inline void SetColorProperty( const ::rtl::OUString& rPropName, const Color& rColor )
+ { SetProperty( rPropName, ScfApiHelper::ConvertToApiColor( rColor ) ); }
+
+ /** 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 OUStringSequence& rPropNames, const UnoAnySequence& rValues );
+
+ // ------------------------------------------------------------------------
+private:
+ XPropertySetRef mxPropSet; /// The mandatory property set interface.
+ XMultiPropSetRef mxMultiPropSet; /// The optional multi property set interface.
+};
+
+// ----------------------------------------------------------------------------
+
+/** Generic helper class for reading from and writing to property sets.
+
+ Usage:
+ 1) Call the constructor with a null-terminated array of ASCII strings.
+ 2a) Read properties from a property set: Call the ReadFromPropertySet()
+ function, then get the properties with the ReadValue() functions or the
+ operator>> stream operator. The properties are returned in order of the
+ array of property names passed in the constructor.
+ 2b) Write properties to a property set: Call InitializeWrite() to start a
+ new cycle. Set the values with the WriteValue() functions or the
+ operator<< stream operator. The order of the properties is equal to the
+ array of property names passed in the constructor. Finally, call the
+ WriteToPropertySet() function.
+ */
+class ScfPropSetHelper
+{
+public:
+ typedef ::com::sun::star::uno::Any UnoAny;
+
+public:
+ /** @param ppPropNames A null-terminated array of ASCII property names. */
+ explicit ScfPropSetHelper( const sal_Char* const* ppcPropNames );
+
+ // read properties --------------------------------------------------------
+
+ /** Reads all values from the passed property set. */
+ void ReadFromPropertySet( const ScfPropertySet& rPropSet );
+
+ /** Reads the next value from the value sequence. */
+ template< typename Type >
+ bool ReadValue( Type& rValue );
+ /** Reads an Any from the value sequence. */
+ bool ReadValue( UnoAny& rAny );
+ /** Reads a tools string from the value sequence. */
+ bool ReadValue( String& rString );
+ /** Reads a color value from the value sequence. */
+ bool ReadValue( Color& rColor );
+ /** Reads a C++ boolean value from the value sequence. */
+ bool ReadValue( bool& rbValue );
+
+ // write properties -------------------------------------------------------
+
+ /** Must be called before reading or storing property values in the helper. */
+ void InitializeWrite( bool bClearAllAnys = false );
+
+ /** Writes the next value to the value sequence. */
+ template< typename Type >
+ void WriteValue( const Type& rValue );
+ /** Writes an Any to the value sequence. */
+ void WriteValue( const UnoAny& rAny );
+ /** Writes a tools string to the value sequence. */
+ inline void WriteValue( const String& rString )
+ { WriteValue( ::rtl::OUString( rString ) ); }
+ /** Writes a color value to the value sequence. */
+ inline void WriteValue( const Color& rColor )
+ { WriteValue( ScfApiHelper::ConvertToApiColor( rColor ) ); }
+ /** Writes a C++ boolean value to the value sequence. */
+ void WriteValue( const bool& rbValue );
+
+ /** Writes all values to the passed property set. */
+ void WriteToPropertySet( ScfPropertySet& rPropSet ) const;
+
+ // ------------------------------------------------------------------------
+private:
+ /** Returns a pointer to the next Any to be written to. */
+ UnoAny* GetNextAny();
+
+private:
+ typedef ::com::sun::star::uno::Sequence< ::rtl::OUString > OUStringSequence;
+ typedef ::com::sun::star::uno::Sequence< UnoAny > UnoAnySequence;
+
+ OUStringSequence maNameSeq; /// Sequence of property names.
+ UnoAnySequence maValueSeq; /// Sequence of property values.
+ ScfInt32Vec maNameOrder; /// Maps initial order to alphabetical order.
+ size_t mnNextIdx; /// Counter for next Any to be processed.
+};
+
+// ----------------------------------------------------------------------------
+
+template< typename Type >
+bool ScfPropSetHelper::ReadValue( Type& rValue )
+{
+ UnoAny* pAny = GetNextAny();
+ return pAny && (*pAny >>= rValue);
+}
+
+template< typename Type >
+void ScfPropSetHelper::WriteValue( const Type& rValue )
+{
+ if( UnoAny* pAny = GetNextAny() )
+ *pAny <<= rValue;
+}
+
+template< typename Type >
+ScfPropSetHelper& operator>>( ScfPropSetHelper& rPropSetHelper, Type& rValue )
+{
+ rPropSetHelper.ReadValue( rValue );
+ return rPropSetHelper;
+}
+
+template< typename Type >
+ScfPropSetHelper& operator<<( ScfPropSetHelper& rPropSetHelper, const Type& rValue )
+{
+ rPropSetHelper.WriteValue( rValue );
+ return rPropSetHelper;
+}
+
+// ============================================================================
+
+#endif
+