1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23 #ifndef CHART_WRAPPED_SERIES_OR_DIAGRAM_PROPERTY_HXX
24 #define CHART_WRAPPED_SERIES_OR_DIAGRAM_PROPERTY_HXX
25
26 #include "WrappedProperty.hxx"
27 #include "Chart2ModelContact.hxx"
28 #include "macros.hxx"
29 #include "DiagramHelper.hxx"
30 #include <com/sun/star/chart2/XDataSeries.hpp>
31
32 #include <boost/shared_ptr.hpp>
33 #include <vector>
34
35 // this operator is not defined by default
operator !=(const::com::sun::star::awt::Size & rSize1,const::com::sun::star::awt::Size & rSize2)36 inline bool operator!=( const ::com::sun::star::awt::Size& rSize1, const ::com::sun::star::awt::Size& rSize2 )
37 {
38 return (rSize1.Width != rSize2.Width) || (rSize1.Height != rSize2.Height);
39 }
40
41 //.............................................................................
42
43 namespace chart
44 {
45 namespace wrapper
46 {
47
48 enum tSeriesOrDiagramPropertyType
49 {
50 DATA_SERIES,
51 DIAGRAM
52 };
53
54 //PROPERTYTYPE is the type of the outer property
55
56 template< typename PROPERTYTYPE >
57 class WrappedSeriesOrDiagramProperty : public WrappedProperty
58 {
59 public:
60 virtual PROPERTYTYPE getValueFromSeries( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xSeriesPropertySet ) const =0;
61 virtual void setValueToSeries( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xSeriesPropertySet, PROPERTYTYPE aNewValue ) const =0;
62
WrappedSeriesOrDiagramProperty(const::rtl::OUString & rName,const::com::sun::star::uno::Any & rDefaulValue,::boost::shared_ptr<Chart2ModelContact> spChart2ModelContact,tSeriesOrDiagramPropertyType ePropertyType)63 explicit WrappedSeriesOrDiagramProperty( const ::rtl::OUString& rName, const ::com::sun::star::uno::Any& rDefaulValue
64 , ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact
65 , tSeriesOrDiagramPropertyType ePropertyType )
66 : WrappedProperty(rName,::rtl::OUString())
67 , m_spChart2ModelContact(spChart2ModelContact)
68 , m_aOuterValue(rDefaulValue)
69 , m_aDefaultValue(rDefaulValue)
70 , m_ePropertyType( ePropertyType )
71 {
72 }
~WrappedSeriesOrDiagramProperty()73 virtual ~WrappedSeriesOrDiagramProperty() {};
74
detectInnerValue(PROPERTYTYPE & rValue,bool & rHasAmbiguousValue) const75 bool detectInnerValue( PROPERTYTYPE& rValue, bool& rHasAmbiguousValue ) const
76 {
77 bool bHasDetectableInnerValue = false;
78 rHasAmbiguousValue = false;
79 if( m_ePropertyType == DIAGRAM &&
80 m_spChart2ModelContact.get() )
81 {
82 ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > > aSeriesVector(
83 ::chart::DiagramHelper::getDataSeriesFromDiagram( m_spChart2ModelContact->getChart2Diagram() ) );
84 ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > >::const_iterator aIter =
85 aSeriesVector.begin();
86 for( ; aIter != aSeriesVector.end(); aIter++ )
87 {
88 PROPERTYTYPE aCurValue = getValueFromSeries( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >::query( *aIter ) );
89 if( !bHasDetectableInnerValue )
90 rValue = aCurValue;
91 else
92 {
93 if( rValue != aCurValue )
94 {
95 rHasAmbiguousValue = true;
96 break;
97 }
98 else
99 rValue = aCurValue;
100 }
101 bHasDetectableInnerValue = true;
102 }
103 }
104 return bHasDetectableInnerValue;
105 }
setInnerValue(PROPERTYTYPE aNewValue) const106 void setInnerValue( PROPERTYTYPE aNewValue ) const
107 {
108 if( m_ePropertyType == DIAGRAM &&
109 m_spChart2ModelContact.get() )
110 {
111 ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > > aSeriesVector(
112 ::chart::DiagramHelper::getDataSeriesFromDiagram( m_spChart2ModelContact->getChart2Diagram() ) );
113 ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > >::const_iterator aIter =
114 aSeriesVector.begin();
115 for( ; aIter != aSeriesVector.end(); aIter++ )
116 {
117 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xSeriesPropertySet( *aIter, ::com::sun::star::uno::UNO_QUERY );
118 if( xSeriesPropertySet.is() )
119 {
120 setValueToSeries( xSeriesPropertySet, aNewValue );
121 }
122 }
123 }
124 }
setPropertyValue(const::com::sun::star::uno::Any & rOuterValue,const::com::sun::star::uno::Reference<::com::sun::star::beans::XPropertySet> & xInnerPropertySet) const125 virtual void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
126 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
127 {
128 PROPERTYTYPE aNewValue = PROPERTYTYPE();
129 if( ! (rOuterValue >>= aNewValue) )
130 throw ::com::sun::star::lang::IllegalArgumentException( C2U("statistic property requires different type"), 0, 0 );
131
132 if( m_ePropertyType == DIAGRAM )
133 {
134 m_aOuterValue = rOuterValue;
135
136 bool bHasAmbiguousValue = false;
137 PROPERTYTYPE aOldValue = PROPERTYTYPE();
138 if( detectInnerValue( aOldValue, bHasAmbiguousValue ) )
139 {
140 if( bHasAmbiguousValue || aNewValue != aOldValue )
141 setInnerValue( aNewValue );
142 }
143 }
144 else
145 {
146 setValueToSeries( xInnerPropertySet, aNewValue );
147 }
148 }
149
getPropertyValue(const::com::sun::star::uno::Reference<::com::sun::star::beans::XPropertySet> & xInnerPropertySet) const150 virtual ::com::sun::star::uno::Any getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const
151 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
152 {
153 if( m_ePropertyType == DIAGRAM )
154 {
155 bool bHasAmbiguousValue = false;
156 PROPERTYTYPE aValue;
157 if( detectInnerValue( aValue, bHasAmbiguousValue ) )
158 {
159 if(bHasAmbiguousValue)
160 m_aOuterValue <<= m_aDefaultValue;
161 else
162 m_aOuterValue <<= aValue;
163 }
164 return m_aOuterValue;
165 }
166 else
167 {
168 ::com::sun::star::uno::Any aRet( m_aDefaultValue );
169 aRet <<= getValueFromSeries( xInnerPropertySet );
170 return aRet;
171 }
172 }
173
getPropertyDefault(const::com::sun::star::uno::Reference<::com::sun::star::beans::XPropertyState> &) const174 virtual ::com::sun::star::uno::Any getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& /* xInnerPropertyState */ ) const
175 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
176 {
177 return m_aDefaultValue;
178 }
179
180 protected:
181 ::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
182 mutable ::com::sun::star::uno::Any m_aOuterValue;
183 ::com::sun::star::uno::Any m_aDefaultValue;
184 tSeriesOrDiagramPropertyType m_ePropertyType;
185 };
186
187 } //namespace wrapper
188 } //namespace chart
189 //.............................................................................
190
191 // CHART_WRAPPED_SERIES_OR_DIAGRAM_PROPERTY_HXX
192 #endif
193