1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_chart2.hxx"
26*b1cdbd2cSJim Jagielski #include "TitleWrapper.hxx"
27*b1cdbd2cSJim Jagielski #include "macros.hxx"
28*b1cdbd2cSJim Jagielski #include "ContainerHelper.hxx"
29*b1cdbd2cSJim Jagielski #include "ControllerLockGuard.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <comphelper/InlineContainer.hxx>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/RelativePosition.hpp>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include "CharacterProperties.hxx"
36*b1cdbd2cSJim Jagielski #include "LineProperties.hxx"
37*b1cdbd2cSJim Jagielski #include "FillProperties.hxx"
38*b1cdbd2cSJim Jagielski #include "UserDefinedProperties.hxx"
39*b1cdbd2cSJim Jagielski #include "WrappedCharacterHeightProperty.hxx"
40*b1cdbd2cSJim Jagielski #include "WrappedTextRotationProperty.hxx"
41*b1cdbd2cSJim Jagielski #include "WrappedAutomaticPositionProperties.hxx"
42*b1cdbd2cSJim Jagielski #include "WrappedScaleTextProperties.hxx"
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <algorithm>
45*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
48*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::Property;
49*b1cdbd2cSJim Jagielski using ::osl::MutexGuard;
50*b1cdbd2cSJim Jagielski using ::rtl::OUString;
51*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any;
52*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
53*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski namespace chart
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski class WrappedTitleStringProperty : public WrappedProperty
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski public:
61*b1cdbd2cSJim Jagielski     WrappedTitleStringProperty( const Reference< uno::XComponentContext >& xContext );
62*b1cdbd2cSJim Jagielski     virtual ~WrappedTitleStringProperty();
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski     virtual void setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& xInnerPropertySet ) const
65*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException);
66*b1cdbd2cSJim Jagielski     virtual Any getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const
67*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
68*b1cdbd2cSJim Jagielski     virtual Any getPropertyDefault( const Reference< beans::XPropertyState >& xInnerPropertyState ) const
69*b1cdbd2cSJim Jagielski                         throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski protected:
72*b1cdbd2cSJim Jagielski     Reference< uno::XComponentContext > m_xContext;
73*b1cdbd2cSJim Jagielski };
74*b1cdbd2cSJim Jagielski 
WrappedTitleStringProperty(const Reference<uno::XComponentContext> & xContext)75*b1cdbd2cSJim Jagielski WrappedTitleStringProperty::WrappedTitleStringProperty( const Reference< uno::XComponentContext >& xContext )
76*b1cdbd2cSJim Jagielski     : ::chart::WrappedProperty( C2U( "String" ), OUString() )
77*b1cdbd2cSJim Jagielski     , m_xContext( xContext )
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski }
~WrappedTitleStringProperty()80*b1cdbd2cSJim Jagielski WrappedTitleStringProperty::~WrappedTitleStringProperty()
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski 
setPropertyValue(const Any & rOuterValue,const Reference<beans::XPropertySet> & xInnerPropertySet) const84*b1cdbd2cSJim Jagielski void WrappedTitleStringProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& xInnerPropertySet ) const
85*b1cdbd2cSJim Jagielski                 throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski     Reference< chart2::XTitle > xTitle(xInnerPropertySet,uno::UNO_QUERY);
88*b1cdbd2cSJim Jagielski     if(xTitle.is())
89*b1cdbd2cSJim Jagielski     {
90*b1cdbd2cSJim Jagielski         OUString aString;
91*b1cdbd2cSJim Jagielski         rOuterValue >>= aString;
92*b1cdbd2cSJim Jagielski         TitleHelper::setCompleteString( aString, xTitle, m_xContext );
93*b1cdbd2cSJim Jagielski     }
94*b1cdbd2cSJim Jagielski }
getPropertyValue(const Reference<beans::XPropertySet> & xInnerPropertySet) const95*b1cdbd2cSJim Jagielski Any WrappedTitleStringProperty::getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const
96*b1cdbd2cSJim Jagielski                         throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski     Any aRet( getPropertyDefault( Reference< beans::XPropertyState >( xInnerPropertySet, uno::UNO_QUERY ) ) );
99*b1cdbd2cSJim Jagielski     Reference< chart2::XTitle > xTitle(xInnerPropertySet,uno::UNO_QUERY);
100*b1cdbd2cSJim Jagielski     if(xTitle.is())
101*b1cdbd2cSJim Jagielski     {
102*b1cdbd2cSJim Jagielski         Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText());
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski         ::rtl::OUStringBuffer aBuf;
105*b1cdbd2cSJim Jagielski         for( sal_Int32 i = 0; i < aStrings.getLength(); ++i )
106*b1cdbd2cSJim Jagielski         {
107*b1cdbd2cSJim Jagielski             aBuf.append( aStrings[ i ]->getString());
108*b1cdbd2cSJim Jagielski         }
109*b1cdbd2cSJim Jagielski         aRet <<= aBuf.makeStringAndClear();
110*b1cdbd2cSJim Jagielski     }
111*b1cdbd2cSJim Jagielski     return aRet;
112*b1cdbd2cSJim Jagielski }
getPropertyDefault(const Reference<beans::XPropertyState> &) const113*b1cdbd2cSJim Jagielski Any WrappedTitleStringProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
114*b1cdbd2cSJim Jagielski                         throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski     return uno::makeAny( rtl::OUString() );//default title is a empty String
117*b1cdbd2cSJim Jagielski }
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
120*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski class WrappedStackedTextProperty : public WrappedProperty
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski public:
125*b1cdbd2cSJim Jagielski     WrappedStackedTextProperty();
126*b1cdbd2cSJim Jagielski     virtual ~WrappedStackedTextProperty();
127*b1cdbd2cSJim Jagielski };
128*b1cdbd2cSJim Jagielski 
WrappedStackedTextProperty()129*b1cdbd2cSJim Jagielski WrappedStackedTextProperty::WrappedStackedTextProperty()
130*b1cdbd2cSJim Jagielski     : ::chart::WrappedProperty( C2U( "StackedText" ), C2U( "StackCharacters" ) )
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski }
~WrappedStackedTextProperty()133*b1cdbd2cSJim Jagielski WrappedStackedTextProperty::~WrappedStackedTextProperty()
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski }// end namespace chart
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
141*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
142*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
143*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski namespace
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski static const OUString lcl_aServiceName(
148*b1cdbd2cSJim Jagielski     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart.Title" ));
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski enum
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski     PROP_TITLE_STRING,
153*b1cdbd2cSJim Jagielski     PROP_TITLE_TEXT_ROTATION,
154*b1cdbd2cSJim Jagielski     PROP_TITLE_TEXT_STACKED
155*b1cdbd2cSJim Jagielski };
156*b1cdbd2cSJim Jagielski 
lcl_AddPropertiesToVector(::std::vector<Property> & rOutProperties)157*b1cdbd2cSJim Jagielski void lcl_AddPropertiesToVector(
158*b1cdbd2cSJim Jagielski     ::std::vector< Property > & rOutProperties )
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski     rOutProperties.push_back(
161*b1cdbd2cSJim Jagielski         Property( C2U( "String" ),
162*b1cdbd2cSJim Jagielski                   PROP_TITLE_STRING,
163*b1cdbd2cSJim Jagielski                   ::getCppuType( reinterpret_cast< const ::rtl::OUString * >(0)),
164*b1cdbd2cSJim Jagielski                   beans::PropertyAttribute::BOUND
165*b1cdbd2cSJim Jagielski                   | beans::PropertyAttribute::MAYBEVOID ));
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     rOutProperties.push_back(
168*b1cdbd2cSJim Jagielski         Property( C2U( "TextRotation" ),
169*b1cdbd2cSJim Jagielski                   PROP_TITLE_TEXT_ROTATION,
170*b1cdbd2cSJim Jagielski                   ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)),
171*b1cdbd2cSJim Jagielski                   beans::PropertyAttribute::BOUND
172*b1cdbd2cSJim Jagielski                   | beans::PropertyAttribute::MAYBEDEFAULT ));
173*b1cdbd2cSJim Jagielski     rOutProperties.push_back(
174*b1cdbd2cSJim Jagielski         Property( C2U( "StackedText" ),
175*b1cdbd2cSJim Jagielski                   PROP_TITLE_TEXT_STACKED,
176*b1cdbd2cSJim Jagielski                   ::getBooleanCppuType(),
177*b1cdbd2cSJim Jagielski                   beans::PropertyAttribute::BOUND
178*b1cdbd2cSJim Jagielski                   | beans::PropertyAttribute::MAYBEDEFAULT ));
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski struct StaticTitleWrapperPropertyArray_Initializer
182*b1cdbd2cSJim Jagielski {
operator ()__anonbf4187050111::StaticTitleWrapperPropertyArray_Initializer183*b1cdbd2cSJim Jagielski     Sequence< Property >* operator()()
184*b1cdbd2cSJim Jagielski     {
185*b1cdbd2cSJim Jagielski         static Sequence< Property > aPropSeq( lcl_GetPropertySequence() );
186*b1cdbd2cSJim Jagielski         return &aPropSeq;
187*b1cdbd2cSJim Jagielski     }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski private:
lcl_GetPropertySequence__anonbf4187050111::StaticTitleWrapperPropertyArray_Initializer190*b1cdbd2cSJim Jagielski     Sequence< Property > lcl_GetPropertySequence()
191*b1cdbd2cSJim Jagielski     {
192*b1cdbd2cSJim Jagielski         ::std::vector< beans::Property > aProperties;
193*b1cdbd2cSJim Jagielski         lcl_AddPropertiesToVector( aProperties );
194*b1cdbd2cSJim Jagielski         ::chart::CharacterProperties::AddPropertiesToVector( aProperties );
195*b1cdbd2cSJim Jagielski         ::chart::LineProperties::AddPropertiesToVector( aProperties );
196*b1cdbd2cSJim Jagielski         ::chart::FillProperties::AddPropertiesToVector( aProperties );
197*b1cdbd2cSJim Jagielski         //::chart::NamedProperties::AddPropertiesToVector( aProperties );
198*b1cdbd2cSJim Jagielski         ::chart::UserDefinedProperties::AddPropertiesToVector( aProperties );
199*b1cdbd2cSJim Jagielski         ::chart::wrapper::WrappedAutomaticPositionProperties::addProperties( aProperties );
200*b1cdbd2cSJim Jagielski         ::chart::wrapper::WrappedScaleTextProperties::addProperties( aProperties );
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski         ::std::sort( aProperties.begin(), aProperties.end(),
203*b1cdbd2cSJim Jagielski                      ::chart::PropertyNameLess() );
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski         return ::chart::ContainerHelper::ContainerToSequence( aProperties );
206*b1cdbd2cSJim Jagielski     }
207*b1cdbd2cSJim Jagielski };
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski struct StaticTitleWrapperPropertyArray : public rtl::StaticAggregate< Sequence< Property >, StaticTitleWrapperPropertyArray_Initializer >
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski };
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski } // anonymous namespace
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------------------
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski namespace chart
218*b1cdbd2cSJim Jagielski {
219*b1cdbd2cSJim Jagielski namespace wrapper
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski 
TitleWrapper(::chart::TitleHelper::eTitleType eTitleType,::boost::shared_ptr<Chart2ModelContact> spChart2ModelContact)222*b1cdbd2cSJim Jagielski TitleWrapper::TitleWrapper( ::chart::TitleHelper::eTitleType eTitleType,
223*b1cdbd2cSJim Jagielski     ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) :
224*b1cdbd2cSJim Jagielski         m_spChart2ModelContact( spChart2ModelContact ),
225*b1cdbd2cSJim Jagielski         m_aEventListenerContainer( m_aMutex ),
226*b1cdbd2cSJim Jagielski         m_eTitleType(eTitleType)
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski     ControllerLockGuard aCtrlLockGuard( Reference< frame::XModel >( m_spChart2ModelContact->getChart2Document(), uno::UNO_QUERY ));
229*b1cdbd2cSJim Jagielski     if( !getTitleObject().is() ) //#i83831# create an empty title at the model, thus references to properties can be mapped mapped correctly
230*b1cdbd2cSJim Jagielski         TitleHelper::createTitle( m_eTitleType, OUString(), m_spChart2ModelContact->getChartModel(), m_spChart2ModelContact->m_xContext );
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
~TitleWrapper()233*b1cdbd2cSJim Jagielski TitleWrapper::~TitleWrapper()
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski }
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski // ____ XShape ____
getPosition()238*b1cdbd2cSJim Jagielski awt::Point SAL_CALL TitleWrapper::getPosition()
239*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski     return m_spChart2ModelContact->GetTitlePosition( this->getTitleObject() );
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski 
setPosition(const awt::Point & aPosition)244*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::setPosition( const awt::Point& aPosition )
245*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
246*b1cdbd2cSJim Jagielski {
247*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xPropertySet( this->getInnerPropertySet() );
248*b1cdbd2cSJim Jagielski     if(xPropertySet.is())
249*b1cdbd2cSJim Jagielski     {
250*b1cdbd2cSJim Jagielski         awt::Size aPageSize( m_spChart2ModelContact->GetPageSize() );
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski         chart2::RelativePosition aRelativePosition;
253*b1cdbd2cSJim Jagielski         aRelativePosition.Anchor = drawing::Alignment_TOP_LEFT;
254*b1cdbd2cSJim Jagielski         aRelativePosition.Primary = double(aPosition.X)/double(aPageSize.Width);
255*b1cdbd2cSJim Jagielski         aRelativePosition.Secondary = double(aPosition.Y)/double(aPageSize.Height);
256*b1cdbd2cSJim Jagielski         xPropertySet->setPropertyValue( C2U( "RelativePosition" ), uno::makeAny(aRelativePosition) );
257*b1cdbd2cSJim Jagielski     }
258*b1cdbd2cSJim Jagielski }
259*b1cdbd2cSJim Jagielski 
getSize()260*b1cdbd2cSJim Jagielski awt::Size SAL_CALL TitleWrapper::getSize()
261*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
262*b1cdbd2cSJim Jagielski {
263*b1cdbd2cSJim Jagielski     return m_spChart2ModelContact->GetTitleSize( this->getTitleObject() );
264*b1cdbd2cSJim Jagielski }
265*b1cdbd2cSJim Jagielski 
setSize(const awt::Size &)266*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::setSize( const awt::Size& /*aSize*/ )
267*b1cdbd2cSJim Jagielski     throw (beans::PropertyVetoException,
268*b1cdbd2cSJim Jagielski            uno::RuntimeException)
269*b1cdbd2cSJim Jagielski {
270*b1cdbd2cSJim Jagielski     OSL_ENSURE( false, "trying to set size of title" );
271*b1cdbd2cSJim Jagielski }
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski // ____ XShapeDescriptor (base of XShape) ____
getShapeType()274*b1cdbd2cSJim Jagielski OUString SAL_CALL TitleWrapper::getShapeType()
275*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski     return C2U( "com.sun.star.chart.ChartTitle" );
278*b1cdbd2cSJim Jagielski }
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski // ____ XComponent ____
dispose()281*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::dispose()
282*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski     Reference< uno::XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
285*b1cdbd2cSJim Jagielski     m_aEventListenerContainer.disposeAndClear( lang::EventObject( xSource ) );
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski     // /--
288*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetMutex());
289*b1cdbd2cSJim Jagielski     clearWrappedPropertySet();
290*b1cdbd2cSJim Jagielski     // \--
291*b1cdbd2cSJim Jagielski }
292*b1cdbd2cSJim Jagielski 
addEventListener(const Reference<lang::XEventListener> & xListener)293*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::addEventListener(
294*b1cdbd2cSJim Jagielski     const Reference< lang::XEventListener >& xListener )
295*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski 	m_aEventListenerContainer.addInterface( xListener );
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski 
removeEventListener(const Reference<lang::XEventListener> & aListener)300*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::removeEventListener(
301*b1cdbd2cSJim Jagielski     const Reference< lang::XEventListener >& aListener )
302*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
303*b1cdbd2cSJim Jagielski {
304*b1cdbd2cSJim Jagielski 	m_aEventListenerContainer.removeInterface( aListener );
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski // ================================================================================
308*b1cdbd2cSJim Jagielski 
getFirstCharacterPropertySet()309*b1cdbd2cSJim Jagielski Reference< beans::XPropertySet > TitleWrapper::getFirstCharacterPropertySet()
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xProp;
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     Reference< chart2::XTitle > xTitle( this->getTitleObject() );
314*b1cdbd2cSJim Jagielski     if( xTitle.is())
315*b1cdbd2cSJim Jagielski     {
316*b1cdbd2cSJim Jagielski         Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText());
317*b1cdbd2cSJim Jagielski         if( aStrings.getLength() > 0 )
318*b1cdbd2cSJim Jagielski             xProp.set( aStrings[0], uno::UNO_QUERY );
319*b1cdbd2cSJim Jagielski     }
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski     return xProp;
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski 
getFastCharacterPropertyValue(sal_Int32 nHandle,Any & rValue)324*b1cdbd2cSJim Jagielski void TitleWrapper::getFastCharacterPropertyValue( sal_Int32 nHandle, Any& rValue )
325*b1cdbd2cSJim Jagielski {
326*b1cdbd2cSJim Jagielski     OSL_ASSERT( FAST_PROPERTY_ID_START_CHAR_PROP <= nHandle &&
327*b1cdbd2cSJim Jagielski                 nHandle < CharacterProperties::FAST_PROPERTY_ID_END_CHAR_PROP );
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xProp( getFirstCharacterPropertySet(), uno::UNO_QUERY );
330*b1cdbd2cSJim Jagielski     Reference< beans::XFastPropertySet > xFastProp( xProp, uno::UNO_QUERY );
331*b1cdbd2cSJim Jagielski     if(xProp.is())
332*b1cdbd2cSJim Jagielski     {
333*b1cdbd2cSJim Jagielski         const WrappedProperty* pWrappedProperty = getWrappedProperty( nHandle );
334*b1cdbd2cSJim Jagielski         if( pWrappedProperty )
335*b1cdbd2cSJim Jagielski         {
336*b1cdbd2cSJim Jagielski             rValue = pWrappedProperty->getPropertyValue( xProp );
337*b1cdbd2cSJim Jagielski         }
338*b1cdbd2cSJim Jagielski         else if( xFastProp.is() )
339*b1cdbd2cSJim Jagielski         {
340*b1cdbd2cSJim Jagielski             rValue = xFastProp->getFastPropertyValue( nHandle );
341*b1cdbd2cSJim Jagielski         }
342*b1cdbd2cSJim Jagielski     }
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski }
345*b1cdbd2cSJim Jagielski 
setFastCharacterPropertyValue(sal_Int32 nHandle,const Any & rValue)346*b1cdbd2cSJim Jagielski void TitleWrapper::setFastCharacterPropertyValue(
347*b1cdbd2cSJim Jagielski     sal_Int32 nHandle, const Any& rValue ) throw (uno::Exception)
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski     OSL_ASSERT( FAST_PROPERTY_ID_START_CHAR_PROP <= nHandle &&
350*b1cdbd2cSJim Jagielski                 nHandle < CharacterProperties::FAST_PROPERTY_ID_END_CHAR_PROP );
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski     Reference< chart2::XTitle > xTitle( this->getTitleObject() );
353*b1cdbd2cSJim Jagielski     if( xTitle.is())
354*b1cdbd2cSJim Jagielski     {
355*b1cdbd2cSJim Jagielski         Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText());
356*b1cdbd2cSJim Jagielski         const WrappedProperty* pWrappedProperty = getWrappedProperty( nHandle );
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski         for( sal_Int32 i = 0; i < aStrings.getLength(); ++i )
359*b1cdbd2cSJim Jagielski         {
360*b1cdbd2cSJim Jagielski             Reference< beans::XFastPropertySet > xFastPropertySet( aStrings[ i ], uno::UNO_QUERY );
361*b1cdbd2cSJim Jagielski             Reference< beans::XPropertySet > xPropSet( xFastPropertySet, uno::UNO_QUERY );
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski             if( pWrappedProperty )
364*b1cdbd2cSJim Jagielski                 pWrappedProperty->setPropertyValue( rValue, xPropSet );
365*b1cdbd2cSJim Jagielski             else if( xFastPropertySet.is() )
366*b1cdbd2cSJim Jagielski                 xFastPropertySet->setFastPropertyValue( nHandle, rValue );
367*b1cdbd2cSJim Jagielski         }
368*b1cdbd2cSJim Jagielski     }
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski // ================================================================================
372*b1cdbd2cSJim Jagielski // WrappedPropertySet
373*b1cdbd2cSJim Jagielski 
setPropertyValue(const OUString & rPropertyName,const Any & rValue)374*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::setPropertyValue( const OUString& rPropertyName, const Any& rValue )
375*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
376*b1cdbd2cSJim Jagielski {
377*b1cdbd2cSJim Jagielski     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
378*b1cdbd2cSJim Jagielski     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
379*b1cdbd2cSJim Jagielski     {
380*b1cdbd2cSJim Jagielski         setFastCharacterPropertyValue( nHandle, rValue );
381*b1cdbd2cSJim Jagielski     }
382*b1cdbd2cSJim Jagielski     else
383*b1cdbd2cSJim Jagielski         WrappedPropertySet::setPropertyValue( rPropertyName, rValue );
384*b1cdbd2cSJim Jagielski }
385*b1cdbd2cSJim Jagielski 
getPropertyValue(const OUString & rPropertyName)386*b1cdbd2cSJim Jagielski Any SAL_CALL TitleWrapper::getPropertyValue( const OUString& rPropertyName )
387*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
388*b1cdbd2cSJim Jagielski {
389*b1cdbd2cSJim Jagielski     Any aRet;
390*b1cdbd2cSJim Jagielski     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
391*b1cdbd2cSJim Jagielski     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
392*b1cdbd2cSJim Jagielski         getFastCharacterPropertyValue( nHandle, aRet );
393*b1cdbd2cSJim Jagielski     else
394*b1cdbd2cSJim Jagielski         aRet = WrappedPropertySet::getPropertyValue( rPropertyName );
395*b1cdbd2cSJim Jagielski     return aRet;
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski 
getPropertyState(const OUString & rPropertyName)398*b1cdbd2cSJim Jagielski beans::PropertyState SAL_CALL TitleWrapper::getPropertyState( const OUString& rPropertyName )
399*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, uno::RuntimeException)
400*b1cdbd2cSJim Jagielski {
401*b1cdbd2cSJim Jagielski     beans::PropertyState aState( beans::PropertyState_DIRECT_VALUE );
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
404*b1cdbd2cSJim Jagielski     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
405*b1cdbd2cSJim Jagielski     {
406*b1cdbd2cSJim Jagielski         Reference< beans::XPropertyState > xPropState( getFirstCharacterPropertySet(), uno::UNO_QUERY );
407*b1cdbd2cSJim Jagielski         if( xPropState.is() )
408*b1cdbd2cSJim Jagielski         {
409*b1cdbd2cSJim Jagielski             const WrappedProperty* pWrappedProperty = getWrappedProperty( rPropertyName );
410*b1cdbd2cSJim Jagielski             if( pWrappedProperty )
411*b1cdbd2cSJim Jagielski                 aState = pWrappedProperty->getPropertyState( xPropState );
412*b1cdbd2cSJim Jagielski             else
413*b1cdbd2cSJim Jagielski                 aState = xPropState->getPropertyState( rPropertyName );
414*b1cdbd2cSJim Jagielski         }
415*b1cdbd2cSJim Jagielski     }
416*b1cdbd2cSJim Jagielski     else
417*b1cdbd2cSJim Jagielski         aState = WrappedPropertySet::getPropertyState( rPropertyName );
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski     return aState;
420*b1cdbd2cSJim Jagielski }
setPropertyToDefault(const OUString & rPropertyName)421*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::setPropertyToDefault( const OUString& rPropertyName )
422*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, uno::RuntimeException)
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
425*b1cdbd2cSJim Jagielski     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
426*b1cdbd2cSJim Jagielski     {
427*b1cdbd2cSJim Jagielski         Any aDefault = getPropertyDefault( rPropertyName );
428*b1cdbd2cSJim Jagielski         setFastCharacterPropertyValue( nHandle, aDefault );
429*b1cdbd2cSJim Jagielski     }
430*b1cdbd2cSJim Jagielski     else
431*b1cdbd2cSJim Jagielski         WrappedPropertySet::setPropertyToDefault( rPropertyName );
432*b1cdbd2cSJim Jagielski }
getPropertyDefault(const OUString & rPropertyName)433*b1cdbd2cSJim Jagielski Any SAL_CALL TitleWrapper::getPropertyDefault( const OUString& rPropertyName )
434*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
435*b1cdbd2cSJim Jagielski {
436*b1cdbd2cSJim Jagielski     Any aRet;
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
439*b1cdbd2cSJim Jagielski     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
440*b1cdbd2cSJim Jagielski     {
441*b1cdbd2cSJim Jagielski         Reference< beans::XPropertyState > xPropState( getFirstCharacterPropertySet(), uno::UNO_QUERY );
442*b1cdbd2cSJim Jagielski         if( xPropState.is() )
443*b1cdbd2cSJim Jagielski         {
444*b1cdbd2cSJim Jagielski             const WrappedProperty* pWrappedProperty = getWrappedProperty( rPropertyName );
445*b1cdbd2cSJim Jagielski             if( pWrappedProperty )
446*b1cdbd2cSJim Jagielski                 aRet = pWrappedProperty->getPropertyDefault(xPropState);
447*b1cdbd2cSJim Jagielski             else
448*b1cdbd2cSJim Jagielski                 aRet = xPropState->getPropertyDefault( rPropertyName );
449*b1cdbd2cSJim Jagielski         }
450*b1cdbd2cSJim Jagielski     }
451*b1cdbd2cSJim Jagielski     else
452*b1cdbd2cSJim Jagielski         aRet = WrappedPropertySet::getPropertyDefault( rPropertyName );
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski     return aRet;
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski 
addPropertyChangeListener(const OUString & rPropertyName,const Reference<beans::XPropertyChangeListener> & xListener)457*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::addPropertyChangeListener( const OUString& rPropertyName, const Reference< beans::XPropertyChangeListener >& xListener )
458*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
461*b1cdbd2cSJim Jagielski     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
462*b1cdbd2cSJim Jagielski     {
463*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xPropSet( getFirstCharacterPropertySet(), uno::UNO_QUERY );
464*b1cdbd2cSJim Jagielski         if( xPropSet.is() )
465*b1cdbd2cSJim Jagielski             xPropSet->addPropertyChangeListener( rPropertyName, xListener );
466*b1cdbd2cSJim Jagielski     }
467*b1cdbd2cSJim Jagielski     else
468*b1cdbd2cSJim Jagielski         WrappedPropertySet::addPropertyChangeListener( rPropertyName, xListener );
469*b1cdbd2cSJim Jagielski }
removePropertyChangeListener(const OUString & rPropertyName,const Reference<beans::XPropertyChangeListener> & xListener)470*b1cdbd2cSJim Jagielski void SAL_CALL TitleWrapper::removePropertyChangeListener( const OUString& rPropertyName, const Reference< beans::XPropertyChangeListener >& xListener )
471*b1cdbd2cSJim Jagielski                                     throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski     sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName );
474*b1cdbd2cSJim Jagielski     if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) )
475*b1cdbd2cSJim Jagielski     {
476*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xPropSet( getFirstCharacterPropertySet(), uno::UNO_QUERY );
477*b1cdbd2cSJim Jagielski         if( xPropSet.is() )
478*b1cdbd2cSJim Jagielski             xPropSet->removePropertyChangeListener( rPropertyName, xListener );
479*b1cdbd2cSJim Jagielski     }
480*b1cdbd2cSJim Jagielski     else
481*b1cdbd2cSJim Jagielski         WrappedPropertySet::removePropertyChangeListener( rPropertyName, xListener );
482*b1cdbd2cSJim Jagielski }
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski // ================================================================================
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski //ReferenceSizePropertyProvider
updateReferenceSize()487*b1cdbd2cSJim Jagielski void TitleWrapper::updateReferenceSize()
488*b1cdbd2cSJim Jagielski {
489*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xProp( this->getTitleObject(), uno::UNO_QUERY );
490*b1cdbd2cSJim Jagielski     if( xProp.is() )
491*b1cdbd2cSJim Jagielski     {
492*b1cdbd2cSJim Jagielski         if( xProp->getPropertyValue( C2U("ReferencePageSize") ).hasValue() )
493*b1cdbd2cSJim Jagielski             xProp->setPropertyValue( C2U("ReferencePageSize"), uno::makeAny(
494*b1cdbd2cSJim Jagielski                             m_spChart2ModelContact->GetPageSize() ));
495*b1cdbd2cSJim Jagielski     }
496*b1cdbd2cSJim Jagielski }
getReferenceSize()497*b1cdbd2cSJim Jagielski Any TitleWrapper::getReferenceSize()
498*b1cdbd2cSJim Jagielski {
499*b1cdbd2cSJim Jagielski     Any aRet;
500*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xProp( this->getTitleObject(), uno::UNO_QUERY );
501*b1cdbd2cSJim Jagielski     if( xProp.is() )
502*b1cdbd2cSJim Jagielski         aRet = xProp->getPropertyValue( C2U("ReferencePageSize") );
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski     return aRet;
505*b1cdbd2cSJim Jagielski }
getCurrentSizeForReference()506*b1cdbd2cSJim Jagielski awt::Size TitleWrapper::getCurrentSizeForReference()
507*b1cdbd2cSJim Jagielski {
508*b1cdbd2cSJim Jagielski     return m_spChart2ModelContact->GetPageSize();
509*b1cdbd2cSJim Jagielski }
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski // ================================================================================
512*b1cdbd2cSJim Jagielski 
getTitleObject()513*b1cdbd2cSJim Jagielski Reference< chart2::XTitle > TitleWrapper::getTitleObject()
514*b1cdbd2cSJim Jagielski {
515*b1cdbd2cSJim Jagielski     return TitleHelper::getTitle( m_eTitleType, m_spChart2ModelContact->getChartModel() );
516*b1cdbd2cSJim Jagielski }
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski // WrappedPropertySet
519*b1cdbd2cSJim Jagielski 
getInnerPropertySet()520*b1cdbd2cSJim Jagielski Reference< beans::XPropertySet > TitleWrapper::getInnerPropertySet()
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski     return Reference< beans::XPropertySet >( this->getTitleObject(), uno::UNO_QUERY );
523*b1cdbd2cSJim Jagielski }
524*b1cdbd2cSJim Jagielski 
getPropertySequence()525*b1cdbd2cSJim Jagielski const Sequence< beans::Property >& TitleWrapper::getPropertySequence()
526*b1cdbd2cSJim Jagielski {
527*b1cdbd2cSJim Jagielski     return *StaticTitleWrapperPropertyArray::get();
528*b1cdbd2cSJim Jagielski }
529*b1cdbd2cSJim Jagielski 
createWrappedProperties()530*b1cdbd2cSJim Jagielski const std::vector< WrappedProperty* > TitleWrapper::createWrappedProperties()
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski     ::std::vector< ::chart::WrappedProperty* > aWrappedProperties;
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski     aWrappedProperties.push_back( new WrappedTitleStringProperty( m_spChart2ModelContact->m_xContext ) );
535*b1cdbd2cSJim Jagielski     aWrappedProperties.push_back( new WrappedTextRotationProperty( m_eTitleType==TitleHelper::Y_AXIS_TITLE || m_eTitleType==TitleHelper::X_AXIS_TITLE ) );
536*b1cdbd2cSJim Jagielski     aWrappedProperties.push_back( new WrappedStackedTextProperty() );
537*b1cdbd2cSJim Jagielski     WrappedCharacterHeightProperty::addWrappedProperties( aWrappedProperties, this );
538*b1cdbd2cSJim Jagielski     WrappedAutomaticPositionProperties::addWrappedProperties( aWrappedProperties );
539*b1cdbd2cSJim Jagielski     WrappedScaleTextProperties::addWrappedProperties( aWrappedProperties, m_spChart2ModelContact );
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski     return aWrappedProperties;
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski // ================================================================================
545*b1cdbd2cSJim Jagielski 
getSupportedServiceNames_Static()546*b1cdbd2cSJim Jagielski Sequence< OUString > TitleWrapper::getSupportedServiceNames_Static()
547*b1cdbd2cSJim Jagielski {
548*b1cdbd2cSJim Jagielski     Sequence< OUString > aServices( 4 );
549*b1cdbd2cSJim Jagielski     aServices[ 0 ] = C2U( "com.sun.star.chart.ChartTitle" );
550*b1cdbd2cSJim Jagielski     aServices[ 1 ] = C2U( "com.sun.star.drawing.Shape" );
551*b1cdbd2cSJim Jagielski     aServices[ 2 ] = C2U( "com.sun.star.xml.UserDefinedAttributeSupplier" );
552*b1cdbd2cSJim Jagielski     aServices[ 3 ] = C2U( "com.sun.star.style.CharacterProperties" );
553*b1cdbd2cSJim Jagielski //     aServices[ 4 ] = C2U( "com.sun.star.beans.PropertySet" );
554*b1cdbd2cSJim Jagielski //     aServices[ 5 ] = C2U( "com.sun.star.drawing.FillProperties" );
555*b1cdbd2cSJim Jagielski //     aServices[ 6 ] = C2U( "com.sun.star.drawing.LineProperties" );
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski     return aServices;
558*b1cdbd2cSJim Jagielski }
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
561*b1cdbd2cSJim Jagielski APPHELPER_XSERVICEINFO_IMPL( TitleWrapper, lcl_aServiceName );
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski } //  namespace wrapper
564*b1cdbd2cSJim Jagielski } //  namespace chart
565