/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_chart2.hxx" #include "TitleWrapper.hxx" #include "macros.hxx" #include "ContainerHelper.hxx" #include "ControllerLockGuard.hxx" #include #include #include #include "CharacterProperties.hxx" #include "LineProperties.hxx" #include "FillProperties.hxx" #include "UserDefinedProperties.hxx" #include "WrappedCharacterHeightProperty.hxx" #include "WrappedTextRotationProperty.hxx" #include "WrappedAutomaticPositionProperties.hxx" #include "WrappedScaleTextProperties.hxx" #include #include using namespace ::com::sun::star; using ::com::sun::star::beans::Property; using ::osl::MutexGuard; using ::rtl::OUString; using ::com::sun::star::uno::Any; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Sequence; namespace chart { class WrappedTitleStringProperty : public WrappedProperty { public: WrappedTitleStringProperty( const Reference< uno::XComponentContext >& xContext ); virtual ~WrappedTitleStringProperty(); virtual void setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& xInnerPropertySet ) const throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException); virtual Any getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException); virtual Any getPropertyDefault( const Reference< beans::XPropertyState >& xInnerPropertyState ) const throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException); protected: Reference< uno::XComponentContext > m_xContext; }; WrappedTitleStringProperty::WrappedTitleStringProperty( const Reference< uno::XComponentContext >& xContext ) : ::chart::WrappedProperty( C2U( "String" ), OUString() ) , m_xContext( xContext ) { } WrappedTitleStringProperty::~WrappedTitleStringProperty() { } void WrappedTitleStringProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& xInnerPropertySet ) const throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) { Reference< chart2::XTitle > xTitle(xInnerPropertySet,uno::UNO_QUERY); if(xTitle.is()) { OUString aString; rOuterValue >>= aString; TitleHelper::setCompleteString( aString, xTitle, m_xContext ); } } Any WrappedTitleStringProperty::getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { Any aRet( getPropertyDefault( Reference< beans::XPropertyState >( xInnerPropertySet, uno::UNO_QUERY ) ) ); Reference< chart2::XTitle > xTitle(xInnerPropertySet,uno::UNO_QUERY); if(xTitle.is()) { Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText()); ::rtl::OUStringBuffer aBuf; for( sal_Int32 i = 0; i < aStrings.getLength(); ++i ) { aBuf.append( aStrings[ i ]->getString()); } aRet <<= aBuf.makeStringAndClear(); } return aRet; } Any WrappedTitleStringProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { return uno::makeAny( rtl::OUString() );//default title is a empty String } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- class WrappedStackedTextProperty : public WrappedProperty { public: WrappedStackedTextProperty(); virtual ~WrappedStackedTextProperty(); }; WrappedStackedTextProperty::WrappedStackedTextProperty() : ::chart::WrappedProperty( C2U( "StackedText" ), C2U( "StackCharacters" ) ) { } WrappedStackedTextProperty::~WrappedStackedTextProperty() { } }// end namespace chart //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- namespace { static const OUString lcl_aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart.Title" )); enum { PROP_TITLE_STRING, PROP_TITLE_TEXT_ROTATION, PROP_TITLE_TEXT_STACKED }; void lcl_AddPropertiesToVector( ::std::vector< Property > & rOutProperties ) { rOutProperties.push_back( Property( C2U( "String" ), PROP_TITLE_STRING, ::getCppuType( reinterpret_cast< const ::rtl::OUString * >(0)), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEVOID )); rOutProperties.push_back( Property( C2U( "TextRotation" ), PROP_TITLE_TEXT_ROTATION, ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEDEFAULT )); rOutProperties.push_back( Property( C2U( "StackedText" ), PROP_TITLE_TEXT_STACKED, ::getBooleanCppuType(), beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEDEFAULT )); } struct StaticTitleWrapperPropertyArray_Initializer { Sequence< Property >* operator()() { static Sequence< Property > aPropSeq( lcl_GetPropertySequence() ); return &aPropSeq; } private: Sequence< Property > lcl_GetPropertySequence() { ::std::vector< beans::Property > aProperties; lcl_AddPropertiesToVector( aProperties ); ::chart::CharacterProperties::AddPropertiesToVector( aProperties ); ::chart::LineProperties::AddPropertiesToVector( aProperties ); ::chart::FillProperties::AddPropertiesToVector( aProperties ); //::chart::NamedProperties::AddPropertiesToVector( aProperties ); ::chart::UserDefinedProperties::AddPropertiesToVector( aProperties ); ::chart::wrapper::WrappedAutomaticPositionProperties::addProperties( aProperties ); ::chart::wrapper::WrappedScaleTextProperties::addProperties( aProperties ); ::std::sort( aProperties.begin(), aProperties.end(), ::chart::PropertyNameLess() ); return ::chart::ContainerHelper::ContainerToSequence( aProperties ); } }; struct StaticTitleWrapperPropertyArray : public rtl::StaticAggregate< Sequence< Property >, StaticTitleWrapperPropertyArray_Initializer > { }; } // anonymous namespace // -------------------------------------------------------------------------------- namespace chart { namespace wrapper { TitleWrapper::TitleWrapper( ::chart::TitleHelper::eTitleType eTitleType, ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) : m_spChart2ModelContact( spChart2ModelContact ), m_aEventListenerContainer( m_aMutex ), m_eTitleType(eTitleType) { ControllerLockGuard aCtrlLockGuard( Reference< frame::XModel >( m_spChart2ModelContact->getChart2Document(), uno::UNO_QUERY )); if( !getTitleObject().is() ) //#i83831# create an empty title at the model, thus references to properties can be mapped mapped correctly TitleHelper::createTitle( m_eTitleType, OUString(), m_spChart2ModelContact->getChartModel(), m_spChart2ModelContact->m_xContext ); } TitleWrapper::~TitleWrapper() { } // ____ XShape ____ awt::Point SAL_CALL TitleWrapper::getPosition() throw (uno::RuntimeException) { return m_spChart2ModelContact->GetTitlePosition( this->getTitleObject() ); } void SAL_CALL TitleWrapper::setPosition( const awt::Point& aPosition ) throw (uno::RuntimeException) { Reference< beans::XPropertySet > xPropertySet( this->getInnerPropertySet() ); if(xPropertySet.is()) { awt::Size aPageSize( m_spChart2ModelContact->GetPageSize() ); chart2::RelativePosition aRelativePosition; aRelativePosition.Anchor = drawing::Alignment_TOP_LEFT; aRelativePosition.Primary = double(aPosition.X)/double(aPageSize.Width); aRelativePosition.Secondary = double(aPosition.Y)/double(aPageSize.Height); xPropertySet->setPropertyValue( C2U( "RelativePosition" ), uno::makeAny(aRelativePosition) ); } } awt::Size SAL_CALL TitleWrapper::getSize() throw (uno::RuntimeException) { return m_spChart2ModelContact->GetTitleSize( this->getTitleObject() ); } void SAL_CALL TitleWrapper::setSize( const awt::Size& /*aSize*/ ) throw (beans::PropertyVetoException, uno::RuntimeException) { OSL_ENSURE( false, "trying to set size of title" ); } // ____ XShapeDescriptor (base of XShape) ____ OUString SAL_CALL TitleWrapper::getShapeType() throw (uno::RuntimeException) { return C2U( "com.sun.star.chart.ChartTitle" ); } // ____ XComponent ____ void SAL_CALL TitleWrapper::dispose() throw (uno::RuntimeException) { Reference< uno::XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) ); m_aEventListenerContainer.disposeAndClear( lang::EventObject( xSource ) ); // /-- MutexGuard aGuard( GetMutex()); clearWrappedPropertySet(); // \-- } void SAL_CALL TitleWrapper::addEventListener( const Reference< lang::XEventListener >& xListener ) throw (uno::RuntimeException) { m_aEventListenerContainer.addInterface( xListener ); } void SAL_CALL TitleWrapper::removeEventListener( const Reference< lang::XEventListener >& aListener ) throw (uno::RuntimeException) { m_aEventListenerContainer.removeInterface( aListener ); } // ================================================================================ Reference< beans::XPropertySet > TitleWrapper::getFirstCharacterPropertySet() { Reference< beans::XPropertySet > xProp; Reference< chart2::XTitle > xTitle( this->getTitleObject() ); if( xTitle.is()) { Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText()); if( aStrings.getLength() > 0 ) xProp.set( aStrings[0], uno::UNO_QUERY ); } return xProp; } void TitleWrapper::getFastCharacterPropertyValue( sal_Int32 nHandle, Any& rValue ) { OSL_ASSERT( FAST_PROPERTY_ID_START_CHAR_PROP <= nHandle && nHandle < CharacterProperties::FAST_PROPERTY_ID_END_CHAR_PROP ); Reference< beans::XPropertySet > xProp( getFirstCharacterPropertySet(), uno::UNO_QUERY ); Reference< beans::XFastPropertySet > xFastProp( xProp, uno::UNO_QUERY ); if(xProp.is()) { const WrappedProperty* pWrappedProperty = getWrappedProperty( nHandle ); if( pWrappedProperty ) { rValue = pWrappedProperty->getPropertyValue( xProp ); } else if( xFastProp.is() ) { rValue = xFastProp->getFastPropertyValue( nHandle ); } } } void TitleWrapper::setFastCharacterPropertyValue( sal_Int32 nHandle, const Any& rValue ) throw (uno::Exception) { OSL_ASSERT( FAST_PROPERTY_ID_START_CHAR_PROP <= nHandle && nHandle < CharacterProperties::FAST_PROPERTY_ID_END_CHAR_PROP ); Reference< chart2::XTitle > xTitle( this->getTitleObject() ); if( xTitle.is()) { Sequence< Reference< chart2::XFormattedString > > aStrings( xTitle->getText()); const WrappedProperty* pWrappedProperty = getWrappedProperty( nHandle ); for( sal_Int32 i = 0; i < aStrings.getLength(); ++i ) { Reference< beans::XFastPropertySet > xFastPropertySet( aStrings[ i ], uno::UNO_QUERY ); Reference< beans::XPropertySet > xPropSet( xFastPropertySet, uno::UNO_QUERY ); if( pWrappedProperty ) pWrappedProperty->setPropertyValue( rValue, xPropSet ); else if( xFastPropertySet.is() ) xFastPropertySet->setFastPropertyValue( nHandle, rValue ); } } } // ================================================================================ // WrappedPropertySet void SAL_CALL TitleWrapper::setPropertyValue( const OUString& rPropertyName, const Any& rValue ) throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) { sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName ); if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) ) { setFastCharacterPropertyValue( nHandle, rValue ); } else WrappedPropertySet::setPropertyValue( rPropertyName, rValue ); } Any SAL_CALL TitleWrapper::getPropertyValue( const OUString& rPropertyName ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { Any aRet; sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName ); if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) ) getFastCharacterPropertyValue( nHandle, aRet ); else aRet = WrappedPropertySet::getPropertyValue( rPropertyName ); return aRet; } beans::PropertyState SAL_CALL TitleWrapper::getPropertyState( const OUString& rPropertyName ) throw (beans::UnknownPropertyException, uno::RuntimeException) { beans::PropertyState aState( beans::PropertyState_DIRECT_VALUE ); sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName ); if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) ) { Reference< beans::XPropertyState > xPropState( getFirstCharacterPropertySet(), uno::UNO_QUERY ); if( xPropState.is() ) { const WrappedProperty* pWrappedProperty = getWrappedProperty( rPropertyName ); if( pWrappedProperty ) aState = pWrappedProperty->getPropertyState( xPropState ); else aState = xPropState->getPropertyState( rPropertyName ); } } else aState = WrappedPropertySet::getPropertyState( rPropertyName ); return aState; } void SAL_CALL TitleWrapper::setPropertyToDefault( const OUString& rPropertyName ) throw (beans::UnknownPropertyException, uno::RuntimeException) { sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName ); if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) ) { Any aDefault = getPropertyDefault( rPropertyName ); setFastCharacterPropertyValue( nHandle, aDefault ); } else WrappedPropertySet::setPropertyToDefault( rPropertyName ); } Any SAL_CALL TitleWrapper::getPropertyDefault( const OUString& rPropertyName ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { Any aRet; sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName ); if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) ) { Reference< beans::XPropertyState > xPropState( getFirstCharacterPropertySet(), uno::UNO_QUERY ); if( xPropState.is() ) { const WrappedProperty* pWrappedProperty = getWrappedProperty( rPropertyName ); if( pWrappedProperty ) aRet = pWrappedProperty->getPropertyDefault(xPropState); else aRet = xPropState->getPropertyDefault( rPropertyName ); } } else aRet = WrappedPropertySet::getPropertyDefault( rPropertyName ); return aRet; } void SAL_CALL TitleWrapper::addPropertyChangeListener( const OUString& rPropertyName, const Reference< beans::XPropertyChangeListener >& xListener ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName ); if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) ) { Reference< beans::XPropertySet > xPropSet( getFirstCharacterPropertySet(), uno::UNO_QUERY ); if( xPropSet.is() ) xPropSet->addPropertyChangeListener( rPropertyName, xListener ); } else WrappedPropertySet::addPropertyChangeListener( rPropertyName, xListener ); } void SAL_CALL TitleWrapper::removePropertyChangeListener( const OUString& rPropertyName, const Reference< beans::XPropertyChangeListener >& xListener ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { sal_Int32 nHandle = getInfoHelper().getHandleByName( rPropertyName ); if( CharacterProperties::IsCharacterPropertyHandle( nHandle ) ) { Reference< beans::XPropertySet > xPropSet( getFirstCharacterPropertySet(), uno::UNO_QUERY ); if( xPropSet.is() ) xPropSet->removePropertyChangeListener( rPropertyName, xListener ); } else WrappedPropertySet::removePropertyChangeListener( rPropertyName, xListener ); } // ================================================================================ //ReferenceSizePropertyProvider void TitleWrapper::updateReferenceSize() { Reference< beans::XPropertySet > xProp( this->getTitleObject(), uno::UNO_QUERY ); if( xProp.is() ) { if( xProp->getPropertyValue( C2U("ReferencePageSize") ).hasValue() ) xProp->setPropertyValue( C2U("ReferencePageSize"), uno::makeAny( m_spChart2ModelContact->GetPageSize() )); } } Any TitleWrapper::getReferenceSize() { Any aRet; Reference< beans::XPropertySet > xProp( this->getTitleObject(), uno::UNO_QUERY ); if( xProp.is() ) aRet = xProp->getPropertyValue( C2U("ReferencePageSize") ); return aRet; } awt::Size TitleWrapper::getCurrentSizeForReference() { return m_spChart2ModelContact->GetPageSize(); } // ================================================================================ Reference< chart2::XTitle > TitleWrapper::getTitleObject() { return TitleHelper::getTitle( m_eTitleType, m_spChart2ModelContact->getChartModel() ); } // WrappedPropertySet Reference< beans::XPropertySet > TitleWrapper::getInnerPropertySet() { return Reference< beans::XPropertySet >( this->getTitleObject(), uno::UNO_QUERY ); } const Sequence< beans::Property >& TitleWrapper::getPropertySequence() { return *StaticTitleWrapperPropertyArray::get(); } const std::vector< WrappedProperty* > TitleWrapper::createWrappedProperties() { ::std::vector< ::chart::WrappedProperty* > aWrappedProperties; aWrappedProperties.push_back( new WrappedTitleStringProperty( m_spChart2ModelContact->m_xContext ) ); aWrappedProperties.push_back( new WrappedTextRotationProperty( m_eTitleType==TitleHelper::Y_AXIS_TITLE || m_eTitleType==TitleHelper::X_AXIS_TITLE ) ); aWrappedProperties.push_back( new WrappedStackedTextProperty() ); WrappedCharacterHeightProperty::addWrappedProperties( aWrappedProperties, this ); WrappedAutomaticPositionProperties::addWrappedProperties( aWrappedProperties ); WrappedScaleTextProperties::addWrappedProperties( aWrappedProperties, m_spChart2ModelContact ); return aWrappedProperties; } // ================================================================================ Sequence< OUString > TitleWrapper::getSupportedServiceNames_Static() { Sequence< OUString > aServices( 4 ); aServices[ 0 ] = C2U( "com.sun.star.chart.ChartTitle" ); aServices[ 1 ] = C2U( "com.sun.star.drawing.Shape" ); aServices[ 2 ] = C2U( "com.sun.star.xml.UserDefinedAttributeSupplier" ); aServices[ 3 ] = C2U( "com.sun.star.style.CharacterProperties" ); // aServices[ 4 ] = C2U( "com.sun.star.beans.PropertySet" ); // aServices[ 5 ] = C2U( "com.sun.star.drawing.FillProperties" ); // aServices[ 6 ] = C2U( "com.sun.star.drawing.LineProperties" ); return aServices; } // implement XServiceInfo methods basing upon getSupportedServiceNames_Static APPHELPER_XSERVICEINFO_IMPL( TitleWrapper, lcl_aServiceName ); } // namespace wrapper } // namespace chart