summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Milcke <bm@openoffice.org>2001-08-06 15:32:11 +0000
committerBjörn Milcke <bm@openoffice.org>2001-08-06 15:32:11 +0000
commit76e569f8fbe514469bd7f4f7924e121885289016 (patch)
treed37b65978eb2a4fd949b946571020a5c284d0be9
parent63fb8aa17f3bb6611d20a8546a7f343926acdffc (diff)
#89727# By using the new class MultiPropertySetHandler method SchXMLExport::exportPlotArea
takes advantage of the support of XMultiPropertySet interface by class ChXDiagram.
-rw-r--r--xmloff/source/chart/MultiPropertySetHandler.hxx331
-rw-r--r--xmloff/source/chart/SchXMLExport.cxx71
2 files changed, 400 insertions, 2 deletions
diff --git a/xmloff/source/chart/MultiPropertySetHandler.hxx b/xmloff/source/chart/MultiPropertySetHandler.hxx
new file mode 100644
index 000000000000..d31eb30aca98
--- /dev/null
+++ b/xmloff/source/chart/MultiPropertySetHandler.hxx
@@ -0,0 +1,331 @@
+/*************************************************************************
+ *
+ * $RCSfile: MultiPropertySetHandler.hxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: bm $ $Date: 2001-08-06 16:31:02 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _MULTI_PROPERTY_SET_HANDLER_HXX
+#define _MULTI_PROPERTY_SET_HANDLER_HXX
+
+#include <rtl/ustring.hxx>
+
+#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
+#include <com/sun/star/beans/XPropertySet.hpp>
+#endif
+#ifndef _COM_SUN_STAR_BEANS_XMULTIPROPERTYSET_HPP_
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#endif
+
+
+/** @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)
+ {}
+
+ /** @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)
+ {
+ 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 (mxObject.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 (mxObject.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
+
diff --git a/xmloff/source/chart/SchXMLExport.cxx b/xmloff/source/chart/SchXMLExport.cxx
index 5fc15719f279..9a924d71964e 100644
--- a/xmloff/source/chart/SchXMLExport.cxx
+++ b/xmloff/source/chart/SchXMLExport.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: SchXMLExport.cxx,v $
*
- * $Revision: 1.51 $
+ * $Revision: 1.52 $
*
- * last change: $Author: dvo $ $Date: 2001-06-29 21:07:11 $
+ * last change: $Author: bm $ $Date: 2001-08-06 16:32:11 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -159,9 +159,12 @@
#include <com/sun/star/drawing/HomogenMatrix.hpp>
#endif
+#include "MultiPropertySetHandler.hxx"
+
using namespace rtl;
using namespace com::sun::star;
using namespace ::xmloff::token;
+using namespace com::sun::star::uno;
// ========================================
@@ -1258,6 +1261,7 @@ void SchXMLExportHelper::exportAxes( uno::Reference< chart::XDiagram > xDiagram,
bHasZAxisMajorGrid = sal_False,
bHasZAxisMinorGrid = sal_False;
+#if 0
uno::Reference< beans::XPropertySet > xProp( xDiagram, uno::UNO_QUERY );
if( xProp.is())
{
@@ -1349,6 +1353,69 @@ void SchXMLExportHelper::exportAxes( uno::Reference< chart::XDiagram > xDiagram,
DBG_WARNING( "Required property not found in ChartDocument" );
}
}
+#else
+ MultiPropertySetHandler aDiagramProperties (xDiagram);
+
+ // Check for supported services and then the properties provided by this service.
+ Reference<lang::XServiceInfo> xServiceInfo (xDiagram, UNO_QUERY);
+ if (xServiceInfo.is())
+ {
+ if (xServiceInfo->supportsService(
+ rtl::OUString::createFromAscii ("com.sun.star.chart.ChartAxisXSupplier")))
+ {
+ aDiagramProperties.Add (
+ OUString(RTL_CONSTASCII_USTRINGPARAM("HasXAxis")), bHasXAxis);
+ }
+ if (xServiceInfo->supportsService(
+ rtl::OUString::createFromAscii ("com.sun.star.chart.ChartAxisYSupplier")))
+ {
+ aDiagramProperties.Add (
+ OUString(RTL_CONSTASCII_USTRINGPARAM("HasYAxis")), bHasXAxis);
+ }
+ if (xServiceInfo->supportsService(
+ rtl::OUString::createFromAscii ("com.sun.star.chart.ChartAxisZSupplier")))
+ {
+ aDiagramProperties.Add (
+ OUString(RTL_CONSTASCII_USTRINGPARAM("HasZAxis")), bHasXAxis);
+ }
+ if (xServiceInfo->supportsService(
+ rtl::OUString::createFromAscii ("com.sun.star.chart.ChartTwoAxisSupplier")))
+ {
+ aDiagramProperties.Add (
+ OUString(RTL_CONSTASCII_USTRINGPARAM("HasSecondaryXAxis")), bHasSecondaryXAxis);
+ }
+ if (xServiceInfo->supportsService(
+ rtl::OUString::createFromAscii ("com.sun.star.chart.ChartTwoAxisYSupplier")))
+ {
+ aDiagramProperties.Add (
+ OUString(RTL_CONSTASCII_USTRINGPARAM("HasSecondaryYAxis")), bHasSecondaryYAxis);
+ }
+ }
+
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasXAxisTitle")), bHasXAxisTitle);
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasYAxisTitle")), bHasYAxisTitle);
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasZAxisTitle")), bHasZAxisTitle);
+
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasXAxisGrid")), bHasXAxisMajorGrid);
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasYAxisGrid")), bHasYAxisMajorGrid);
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasZAxisGrid")), bHasZAxisMajorGrid);
+
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasXAxisHelpGrid")), bHasXAxisMinorGrid);
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasYAxisHelpGrid")), bHasYAxisMinorGrid);
+ aDiagramProperties.Add (
+ OUString (RTL_CONSTASCII_USTRINGPARAM ("HasZAxisHelpGrid")), bHasZAxisMinorGrid);
+
+ if ( ! aDiagramProperties.GetProperties ())
+ DBG_WARNING ("Required properties not found in Chart diagram");
+#endif
SvXMLElementExport* pAxis = NULL;