diff options
Diffstat (limited to 'xmloff/source/chart/MultiPropertySetHandler.hxx')
-rw-r--r-- | xmloff/source/chart/MultiPropertySetHandler.hxx | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/xmloff/source/chart/MultiPropertySetHandler.hxx b/xmloff/source/chart/MultiPropertySetHandler.hxx new file mode 100644 index 000000000000..a0ccf8a1c92b --- /dev/null +++ b/xmloff/source/chart/MultiPropertySetHandler.hxx @@ -0,0 +1,294 @@ +/************************************************************************* + * + * 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 _MULTI_PROPERTY_SET_HANDLER_HXX +#define _MULTI_PROPERTY_SET_HANDLER_HXX + +#include <rtl/ustring.hxx> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XMultiPropertySet.hpp> + + +/** @descr MultiPropertySetHandler handles the two slightly different + interfaces XPropertySet and XMultiPorpertySet for accessing + properties of an object. + + It uses the classes PropertyWrapperBase and the template + PropertyWrapper for a type safe access to single properties. + + The function class OUStringComparison is used by a STL map to + sort the properties by names. +*/ + +/** @descr Base class for the templated property wrappers. + Having a common base class allows to set a variable to the + property's value without explicit knowledge of its type. +*/ +class PropertyWrapperBase +{ +public: + /** @descr Create a class instance and store the given name. + @param rName The name of the property. + */ + PropertyWrapperBase (const ::rtl::OUString & rName) + : msName (rName) + {} + virtual ~PropertyWrapperBase() + {} + + /** @descr Abstract interface of a method for setting a variables + value to that of the property. + */ + virtual void SetValue (const ::com::sun::star::uno::Any & rValue) = 0; + + const ::rtl::OUString msName; +}; + + + + +/** @descr For every property type there will be one instantiation of this + template class with its own and type specific version of SetValue. +*/ +template<class T> class PropertyWrapper : public PropertyWrapperBase +{ +public: + /** @descr Create a wrapper for a property of type T. + */ + PropertyWrapper (const ::rtl::OUString & rName, T & rValue) + : PropertyWrapperBase (rName), + mrValue (rValue) + {} + + /** descr Set the given value inside an Any to the variable referenced + by the data member. + */ + virtual void SetValue (const ::com::sun::star::uno::Any & rValue) + { + rValue >>= mrValue; + } + +private: + /// Reference to a variable. Its value can be modified by a call to SetValue. + T & mrValue; +}; + + + + +/** @descr Function object for comparing two OUStrings. +*/ +class OUStringComparison +{ +public: + /// Compare two strings. Returns true if the first is before the second. + inline bool operator() (const ::rtl::OUString & a, const ::rtl::OUString & b) const + { + return (a.compareTo (b) < 0); + } +}; + + + + +/** @descr This class lets you get the values from an object that either + supports the interface XPropertySet or XMultiPropertySet. If it + supports both interfaces then XMultiPropertySet is preferred. + + Using it works in three steps. + 1. Create an instance and pass a reference to the object from which to + get the property values. + 2. Make all properties whose values you want to get known to the object + by using the Add method. This creates instances of a template class + that stores the properties name and a reference to the variable in + which to store its value. + 3. Finally call GetProperties to store the properties values into the + variables specified in step 2. This uses either the XPropertySet or + (preferred) the XMultiPropertySet interface. +*/ +class MultiPropertySetHandler +{ +public: + /** @descr Create a handler of the property set of the given + object. + @param xObject A reference to any of the object's interfaces. + not neccessarily XPropertySet or XMultiPropertySet. It + is casted later to one of the two of them. + */ + MultiPropertySetHandler (::com::sun::star::uno::Reference< + ::com::sun::star::uno::XInterface> xObject); + ~MultiPropertySetHandler (void); + /** @descr Add a property to handle. The type given implicitely by the + reference to a variable is used to create an instance of + the PropertyWrapper template class. + @param sName Name of the property. + @param rValue Reference to a variable whose value is set by the + call to GetProperties to the property's value. + */ + template<class T> void Add (const ::rtl::OUString & sName, T& rValue) + { + aPropertyList[sName] = new PropertyWrapper<T> (sName, rValue); + } + + /** @descr Try to get the values for all properties added with the Add + method. If possible it uses the XMultiPropertySet. If that fails + (i.e. for an UnknownPropertyExcption) or if the interface is not + supported it uses the XPropertySet interface. + @return If none of the two interfaces is supported or using them both + fails then FALSE is returned. Else True is returned. + */ + inline BOOL GetProperties (void); + +private: + /** @descr Try to use the XMultiPropertySet interface to get the property + values. + @param rNameList A precomputed and sorted sequence of OUStrings + containing the properties names. + @return True if values could be derived. + */ + inline BOOL MultiGet (const ::com::sun::star::uno::Sequence< + ::rtl::OUString> & rNameList); + + /** @descr Try to use the XPropertySet interface to get the property + values. + @param rNameList A precomputed and sorted sequence of OUStrings + containing the properties names. + @return True if values could be derived. + */ + inline BOOL SingleGet (const ::com::sun::star::uno::Sequence< + ::rtl::OUString> & rNameList); + + /** @descr STL map that maps from property names to polymorphic instances of + PropertyWrapper. It uses OUStringComparison for sorting + the property names. + */ + ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison> aPropertyList; + + /// The object from which to get the property values. + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> mxObject; +}; + + + +//===== Inline implementation of the methods declared above ========================== + +MultiPropertySetHandler::MultiPropertySetHandler (::com::sun::star::uno::Reference< + ::com::sun::star::uno::XInterface> xObject) + : mxObject (xObject) +{ +} + + + + +MultiPropertySetHandler::~MultiPropertySetHandler (void) +{ + ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison>::iterator I; + for (I=aPropertyList.begin(); I!=aPropertyList.end(); I++) + delete I->second; +} + + +/* +template<class T> void MultiPropertySetHandler::Add (const ::rtl::OUString & sName, T& pValue) +{ + aPropertyList[sName] = new PropertyWrapper<T> (sName, pValue); +} +*/ + + + +BOOL MultiPropertySetHandler::GetProperties (void) +{ + ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison>::iterator I; + ::com::sun::star::uno::Sequence< ::rtl::OUString> aNameList (aPropertyList.size()); + int i; + for (I=aPropertyList.begin(),i=0; I!=aPropertyList.end(); I++) + aNameList[i++] = I->second->msName; + if ( ! MultiGet(aNameList)) + if ( ! SingleGet(aNameList)) + return FALSE; + return TRUE; +} + + + + +BOOL MultiPropertySetHandler::MultiGet (const ::com::sun::star::uno::Sequence< + ::rtl::OUString> & rNameList) +{ + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet> xMultiSet ( + mxObject, ::com::sun::star::uno::UNO_QUERY); + if (xMultiSet.is()) + try + { + ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison>::iterator I; + int i; + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any> aValueList = + xMultiSet->getPropertyValues (rNameList); + for (I=aPropertyList.begin(),i=0; I!=aPropertyList.end(); I++) + I->second->SetValue (aValueList[i++]); + } + catch (::com::sun::star::beans::UnknownPropertyException e) + { + return FALSE; + } + else + return FALSE; + + return TRUE; +} + + + + +BOOL MultiPropertySetHandler::SingleGet (const ::com::sun::star::uno::Sequence< + ::rtl::OUString> & rNameList) +{ + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> xSingleSet ( + mxObject, ::com::sun::star::uno::UNO_QUERY); + if (xSingleSet.is()) + try + { + ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison>::iterator I; + int i; + for (I=aPropertyList.begin(),i=0; I!=aPropertyList.end(); I++) + I->second->SetValue (xSingleSet->getPropertyValue (rNameList[i++])); + } + catch (::com::sun::star::beans::UnknownPropertyException e) + { + return FALSE; + } + else + return FALSE; + + return TRUE; +} + + +#endif + |