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 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_chart2.hxx"
26 
27 #include "RegressionEquation.hxx"
28 #include "LineProperties.hxx"
29 #include "FillProperties.hxx"
30 #include "UserDefinedProperties.hxx"
31 #include "CharacterProperties.hxx"
32 #include "PropertyHelper.hxx"
33 #include "macros.hxx"
34 #include "ContainerHelper.hxx"
35 
36 #include <com/sun/star/uno/Sequence.hxx>
37 #include <com/sun/star/drawing/FillStyle.hpp>
38 #include <com/sun/star/drawing/LineStyle.hpp>
39 #include <com/sun/star/beans/PropertyAttribute.hpp>
40 #include <com/sun/star/chart2/RelativePosition.hpp>
41 #include <com/sun/star/awt/Size.hpp>
42 
43 #include <algorithm>
44 
45 using namespace ::com::sun::star;
46 
47 using ::com::sun::star::uno::Reference;
48 using ::com::sun::star::beans::Property;
49 using ::osl::MutexGuard;
50 
51 // ____________________________________________________________
52 
53 namespace
54 {
55 
56 static const ::rtl::OUString lcl_aImplementationName(
57     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.RegressionEquation" ));
58 static const ::rtl::OUString lcl_aServiceName(
59     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.RegressionEquation" ));
60 
61 enum
62 {
63     PROP_EQUATION_SHOW,
64     PROP_EQUATION_SHOW_CORRELATION_COEFF,
65 //     PROP_EQUATION_SEPARATOR,
66     PROP_EQUATION_REF_PAGE_SIZE,
67     PROP_EQUATION_REL_POS,
68     PROP_EQUATION_NUMBER_FORMAT
69 };
70 
lcl_AddPropertiesToVector(::std::vector<Property> & rOutProperties)71 void lcl_AddPropertiesToVector(
72     ::std::vector< Property > & rOutProperties )
73 {
74     rOutProperties.push_back(
75         Property( C2U( "ShowEquation" ),
76                   PROP_EQUATION_SHOW,
77                   ::getBooleanCppuType(),
78                   beans::PropertyAttribute::BOUND
79                   | beans::PropertyAttribute::MAYBEDEFAULT ));
80 
81     rOutProperties.push_back(
82         Property( C2U( "ShowCorrelationCoefficient" ),
83                   PROP_EQUATION_SHOW_CORRELATION_COEFF,
84                   ::getBooleanCppuType(),
85                   beans::PropertyAttribute::BOUND
86                   | beans::PropertyAttribute::MAYBEDEFAULT ));
87 
88 //     rOutProperties.push_back(
89 //         Property( C2U( "Separator" ),
90 //                   PROP_EQUATION_SEPARATOR,
91 //                   ::getCppuType( reinterpret_cast< ::rtl::OUString * >(0)),
92 //                   beans::PropertyAttribute::BOUND
93 //                   | beans::PropertyAttribute::MAYBEDEFAULT ));
94 
95     rOutProperties.push_back(
96         Property( C2U( "ReferencePageSize" ),
97                   PROP_EQUATION_REF_PAGE_SIZE,
98                   ::getCppuType( reinterpret_cast< const awt::Size * >(0)),
99                   beans::PropertyAttribute::BOUND
100                   | beans::PropertyAttribute::MAYBEVOID ));
101 
102     rOutProperties.push_back(
103         Property( C2U( "RelativePosition" ),
104                   PROP_EQUATION_REL_POS,
105                   ::getCppuType( reinterpret_cast< const chart2::RelativePosition * >(0)),
106                   beans::PropertyAttribute::BOUND
107                   | beans::PropertyAttribute::MAYBEVOID ));
108 
109     rOutProperties.push_back(
110         Property( C2U( "NumberFormat" ),
111                   PROP_EQUATION_NUMBER_FORMAT,
112                   ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)),
113                   beans::PropertyAttribute::BOUND
114                   | beans::PropertyAttribute::MAYBEVOID ));
115 }
116 
117 struct StaticRegressionEquationDefaults_Initializer
118 {
operator ()__anon055f49120111::StaticRegressionEquationDefaults_Initializer119     ::chart::tPropertyValueMap* operator()()
120     {
121         static ::chart::tPropertyValueMap aStaticDefaults;
122         lcl_AddDefaultsToMap( aStaticDefaults );
123         return &aStaticDefaults;
124     }
125 private:
lcl_AddDefaultsToMap__anon055f49120111::StaticRegressionEquationDefaults_Initializer126     void lcl_AddDefaultsToMap( ::chart::tPropertyValueMap & rOutMap )
127     {
128         ::chart::LineProperties::AddDefaultsToMap( rOutMap );
129         ::chart::FillProperties::AddDefaultsToMap( rOutMap );
130         ::chart::CharacterProperties::AddDefaultsToMap( rOutMap );
131 
132         ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_EQUATION_SHOW, false );
133         ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_EQUATION_SHOW_CORRELATION_COEFF, false );
134         //::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_EQUATION_SEPARATOR, ::rtl::OUString( sal_Unicode( '\n' )));
135 
136         // override other defaults
137         ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::FillProperties::PROP_FILL_STYLE, drawing::FillStyle_NONE );
138         ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::LineProperties::PROP_LINE_STYLE, drawing::LineStyle_NONE );
139 
140         float fDefaultCharHeight = 10.0;
141         ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::CharacterProperties::PROP_CHAR_CHAR_HEIGHT, fDefaultCharHeight );
142         ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::CharacterProperties::PROP_CHAR_ASIAN_CHAR_HEIGHT, fDefaultCharHeight );
143         ::chart::PropertyHelper::setPropertyValue( rOutMap, ::chart::CharacterProperties::PROP_CHAR_COMPLEX_CHAR_HEIGHT, fDefaultCharHeight );
144     }
145 };
146 
147 struct StaticRegressionEquationDefaults : public rtl::StaticAggregate< ::chart::tPropertyValueMap, StaticRegressionEquationDefaults_Initializer >
148 {
149 };
150 
151 struct StaticRegressionEquationInfoHelper_Initializer
152 {
operator ()__anon055f49120111::StaticRegressionEquationInfoHelper_Initializer153     ::cppu::OPropertyArrayHelper* operator()()
154     {
155         static ::cppu::OPropertyArrayHelper aPropHelper( lcl_GetPropertySequence() );
156         return &aPropHelper;
157     }
158 
159 private:
lcl_GetPropertySequence__anon055f49120111::StaticRegressionEquationInfoHelper_Initializer160     uno::Sequence< Property > lcl_GetPropertySequence()
161     {
162         ::std::vector< ::com::sun::star::beans::Property > aProperties;
163         lcl_AddPropertiesToVector( aProperties );
164         ::chart::LineProperties::AddPropertiesToVector( aProperties );
165         ::chart::FillProperties::AddPropertiesToVector( aProperties );
166         ::chart::CharacterProperties::AddPropertiesToVector( aProperties );
167         ::chart::UserDefinedProperties::AddPropertiesToVector( aProperties );
168 
169         ::std::sort( aProperties.begin(), aProperties.end(),
170                      ::chart::PropertyNameLess() );
171 
172         return ::chart::ContainerHelper::ContainerToSequence( aProperties );
173     }
174 
175 };
176 
177 struct StaticRegressionEquationInfoHelper : public rtl::StaticAggregate< ::cppu::OPropertyArrayHelper, StaticRegressionEquationInfoHelper_Initializer >
178 {
179 };
180 
181 struct StaticRegressionEquationInfo_Initializer
182 {
operator ()__anon055f49120111::StaticRegressionEquationInfo_Initializer183     uno::Reference< beans::XPropertySetInfo >* operator()()
184     {
185         static uno::Reference< beans::XPropertySetInfo > xPropertySetInfo(
186             ::cppu::OPropertySetHelper::createPropertySetInfo(*StaticRegressionEquationInfoHelper::get() ) );
187         return &xPropertySetInfo;
188     }
189 };
190 
191 struct StaticRegressionEquationInfo : public rtl::StaticAggregate< uno::Reference< beans::XPropertySetInfo >, StaticRegressionEquationInfo_Initializer >
192 {
193 };
194 
195 } // anonymous namespace
196 
197 // ____________________________________________________________
198 
199 namespace chart
200 {
201 
RegressionEquation(const Reference<uno::XComponentContext> & xContext)202 RegressionEquation::RegressionEquation( const Reference< uno::XComponentContext > & xContext ) :
203         ::property::OPropertySet( m_aMutex ),
204         m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()),
205         m_xContext( xContext )
206 {}
207 
RegressionEquation(const RegressionEquation & rOther)208 RegressionEquation::RegressionEquation( const RegressionEquation & rOther ) :
209         MutexContainer(),
210         impl::RegressionEquation_Base(),
211         ::property::OPropertySet( rOther, m_aMutex ),
212     m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder())
213 {}
214 
~RegressionEquation()215 RegressionEquation::~RegressionEquation()
216 {}
217 
218 
219 // ____ XCloneable ____
createClone()220 uno::Reference< util::XCloneable > SAL_CALL RegressionEquation::createClone()
221     throw (uno::RuntimeException)
222 {
223     return uno::Reference< util::XCloneable >( new RegressionEquation( *this ));
224 }
225 
226 // ____ OPropertySet ____
GetDefaultValue(sal_Int32 nHandle) const227 uno::Any RegressionEquation::GetDefaultValue( sal_Int32 nHandle ) const
228     throw(beans::UnknownPropertyException)
229 {
230     const tPropertyValueMap& rStaticDefaults = *StaticRegressionEquationDefaults::get();
231     tPropertyValueMap::const_iterator aFound( rStaticDefaults.find( nHandle ) );
232     if( aFound == rStaticDefaults.end() )
233         return uno::Any();
234     return (*aFound).second;
235 }
236 
getInfoHelper()237 ::cppu::IPropertyArrayHelper & SAL_CALL RegressionEquation::getInfoHelper()
238 {
239     return *StaticRegressionEquationInfoHelper::get();
240 }
241 
242 // ____ XPropertySet ____
getPropertySetInfo()243 Reference< beans::XPropertySetInfo > SAL_CALL RegressionEquation::getPropertySetInfo()
244     throw (uno::RuntimeException)
245 {
246     return *StaticRegressionEquationInfo::get();
247 }
248 
249 // ____ XModifyBroadcaster ____
addModifyListener(const uno::Reference<util::XModifyListener> & aListener)250 void SAL_CALL RegressionEquation::addModifyListener( const uno::Reference< util::XModifyListener >& aListener )
251     throw (uno::RuntimeException)
252 {
253     try
254     {
255         uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW );
256         xBroadcaster->addModifyListener( aListener );
257     }
258     catch( const uno::Exception & ex )
259     {
260         ASSERT_EXCEPTION( ex );
261     }
262 }
263 
removeModifyListener(const uno::Reference<util::XModifyListener> & aListener)264 void SAL_CALL RegressionEquation::removeModifyListener( const uno::Reference< util::XModifyListener >& aListener )
265     throw (uno::RuntimeException)
266 {
267     try
268     {
269         uno::Reference< util::XModifyBroadcaster > xBroadcaster( m_xModifyEventForwarder, uno::UNO_QUERY_THROW );
270         xBroadcaster->removeModifyListener( aListener );
271     }
272     catch( const uno::Exception & ex )
273     {
274         ASSERT_EXCEPTION( ex );
275     }
276 }
277 
278 // ____ XModifyListener ____
modified(const lang::EventObject & aEvent)279 void SAL_CALL RegressionEquation::modified( const lang::EventObject& aEvent )
280     throw (uno::RuntimeException)
281 {
282     m_xModifyEventForwarder->modified( aEvent );
283 }
284 
285 // ____ XEventListener (base of XModifyListener) ____
disposing(const lang::EventObject &)286 void SAL_CALL RegressionEquation::disposing( const lang::EventObject& /* Source */ )
287     throw (uno::RuntimeException)
288 {
289     // nothing
290 }
291 
292 // ____ OPropertySet ____
firePropertyChangeEvent()293 void RegressionEquation::firePropertyChangeEvent()
294 {
295     fireModifyEvent();
296 }
297 
fireModifyEvent()298 void RegressionEquation::fireModifyEvent()
299 {
300     m_xModifyEventForwarder->modified( lang::EventObject( static_cast< uno::XWeak* >( this )));
301 }
302 
303 // --------------------------------------------------------------------------------
304 
305 // ____ XTitle ____
getText()306 uno::Sequence< uno::Reference< chart2::XFormattedString > > SAL_CALL RegressionEquation::getText()
307     throw (uno::RuntimeException)
308 {
309     // /--
310     MutexGuard aGuard( GetMutex() );
311     return m_aStrings;
312     // \--
313 }
314 
setText(const uno::Sequence<uno::Reference<chart2::XFormattedString>> & Strings)315 void SAL_CALL RegressionEquation::setText( const uno::Sequence< uno::Reference< chart2::XFormattedString > >& Strings )
316     throw (uno::RuntimeException)
317 {
318     // /--
319     MutexGuard aGuard( GetMutex() );
320     ModifyListenerHelper::removeListenerFromAllElements(
321         ContainerHelper::SequenceToVector( m_aStrings ), m_xModifyEventForwarder );
322     m_aStrings = Strings;
323     ModifyListenerHelper::addListenerToAllElements(
324         ContainerHelper::SequenceToVector( m_aStrings ), m_xModifyEventForwarder );
325     fireModifyEvent();
326     // \--
327 }
328 
329 // ================================================================================
330 
getSupportedServiceNames_Static()331 uno::Sequence< ::rtl::OUString > RegressionEquation::getSupportedServiceNames_Static()
332 {
333     const sal_Int32 nNumServices( 5 );
334     sal_Int32 nI = 0;
335     uno::Sequence< ::rtl::OUString > aServices( nNumServices );
336     aServices[ nI++ ] = lcl_aServiceName;
337     aServices[ nI++ ] = C2U( "com.sun.star.beans.PropertySet" );
338     aServices[ nI++ ] = C2U( "com.sun.star.drawing.FillProperties" );
339     aServices[ nI++ ] = C2U( "com.sun.star.drawing.LineProperties" );
340     aServices[ nI++ ] = C2U( "com.sun.star.style.CharacterProperties" );
341     OSL_ASSERT( nNumServices == nI );
342     return aServices;
343 }
344 
345 // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
346 APPHELPER_XSERVICEINFO_IMPL( RegressionEquation, lcl_aImplementationName );
347 
348 using impl::RegressionEquation_Base;
349 
350 IMPLEMENT_FORWARD_XINTERFACE2( RegressionEquation, RegressionEquation_Base, ::property::OPropertySet )
351 
352 } //  namespace chart
353