Tag: cws_src680_reportdesign01 User: oj Date: 2007-10-09 12:54:02+0000 Modified: dba/reportdesign/source/ui/inc/GeometryHandler.hxx dba/reportdesign/source/ui/inspection/GeometryHandler.cxx
Log: #i77604# impl add function File Changes: Directory: /dba/reportdesign/source/ui/inc/ =========================================== File [changed]: GeometryHandler.hxx Url: http://dba.openoffice.org/source/browse/dba/reportdesign/source/ui/inc/GeometryHandler.hxx?r1=1.3.20.2&r2=1.3.20.3 Delta lines: +27 -5 -------------------- --- GeometryHandler.hxx 2007-10-09 08:27:18+0000 1.3.20.2 +++ GeometryHandler.hxx 2007-10-09 12:53:59+0000 1.3.20.3 @@ -4,9 +4,9 @@ * * $RCSfile: GeometryHandler.hxx,v $ * - * $Revision: 1.3.20.2 $ + * $Revision: 1.3.20.3 $ * - * last change: $Author: oj $ $Date: 2007/10/09 08:27:18 $ + * last change: $Author: oj $ $Date: 2007/10/09 12:53:59 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -42,8 +42,8 @@ #ifndef _COM_SUN_STAR_UNO_XCOMPONENTCONTEXT_HPP_ #include "com/sun/star/uno/XComponentContext.hpp" #endif -#ifndef _CPPUHELPER_COMPBASE2_HXX_ -#include "cppuhelper/compbase2.hxx" +#ifndef _CPPUHELPER_COMPBASE3_HXX_ +#include "cppuhelper/compbase3.hxx" #endif #ifndef _CPPUHELPER_BASEMUTEX_HXX_ #include "cppuhelper/basemutex.hxx" @@ -62,6 +62,7 @@ #endif #include "com/sun/star/report/XReportComponent.hpp" #include "com/sun/star/report/XFunction.hpp" +#include <com/sun/star/beans/XPropertyChangeListener.hpp> #ifndef _COM_SUN_STAR_SDBC_XROWSET_HPP_ #include <com/sun/star/sdbc/XRowSet.hpp> #endif @@ -93,7 +94,8 @@ typedef ::comphelper::OSimpleListenerContainer < ::com::sun::star::beans::XPropertyChangeListener , ::com::sun::star::beans::PropertyChangeEvent > PropertyChangeListeners; - typedef ::cppu::WeakComponentImplHelper2< ::com::sun::star::inspection::XPropertyHandler + typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::inspection::XPropertyHandler + , ::com::sun::star::beans::XPropertyChangeListener , ::com::sun::star::lang::XServiceInfo> GeometryHandler_Base; class GeometryHandler: @@ -110,6 +112,12 @@ */ bool impl_dialogFilter_nothrow( ::rtl::OUString& _out_rSelectedClause, ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const; + /** returns the data field type depending on the data field of the report control + * + * \return the data field type + */ + sal_uInt32 impl_getDataFieldType_throw() const; + ::com::sun::star::uno::Any getConstantValue(sal_Bool bToControlValue,sal_uInt16 nResId,const ::com::sun::star::uno::Any& _aValue,const ::rtl::OUString& _sConstantName,const ::rtl::OUString & PropertyName ); ::com::sun::star::beans::Property getProperty(const ::rtl::OUString & PropertyName); void implCreateListLikeControl( @@ -209,6 +217,19 @@ void removeFunction(); + class OBlocker + { + bool& m_bIn; + public: + OBlocker(bool& _bIn) : m_bIn(_bIn){ m_bIn = true; } + ~OBlocker() { m_bIn = false; } + }; + + + // XEventListener + virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException ); + // XPropertyChangeListener + virtual void SAL_CALL propertyChange(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw(::com::sun::star::uno::RuntimeException); public: // XServiceInfo - static versions static ::rtl::OUString getImplementationName_Static( ) throw(::com::sun::star::uno::RuntimeException); @@ -277,6 +298,7 @@ mutable ::rtl::OUString m_sScope; sal_uInt32 m_nDataFieldType; mutable bool m_bNewFunction; + bool m_bIn; }; //........................................................................ } // namespace rptui Directory: /dba/reportdesign/source/ui/inspection/ ================================================== File [changed]: GeometryHandler.cxx Url: http://dba.openoffice.org/source/browse/dba/reportdesign/source/ui/inspection/GeometryHandler.cxx?r1=1.4.20.4&r2=1.4.20.5 Delta lines: +89 -23 --------------------- --- GeometryHandler.cxx 2007-10-09 09:19:29+0000 1.4.20.4 +++ GeometryHandler.cxx 2007-10-09 12:53:59+0000 1.4.20.5 @@ -4,9 +4,9 @@ * * $RCSfile: GeometryHandler.cxx,v $ * - * $Revision: 1.4.20.4 $ + * $Revision: 1.4.20.5 $ * - * last change: $Author: lla $ $Date: 2007/10/09 09:19:29 $ + * last change: $Author: oj $ $Date: 2007/10/09 12:53:59 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -218,6 +218,7 @@ #define FUNCTION 1 #define COUNTER 2 #define USER_DEF_FUNCTION 3 +#define UNDEF_DATA 4 //........................................................................ namespace rptui @@ -333,6 +334,7 @@ ,m_aPropertyListeners( m_aMutex ) ,m_pInfoService(new OPropertyInfoService()) ,m_nDataFieldType(0) + ,m_bIn(false) { DBG_CTOR(rpt_GeometryHandler,NULL); try @@ -398,6 +400,8 @@ { ::comphelper::disposeComponent(m_xFormComponentHandler); ::comphelper::disposeComponent(m_xTypeConverter); + if ( m_xReportComponent.is() && m_xReportComponent->getPropertySetInfo()->hasPropertyByName(PROPERTY_DATAFIELD) ) + m_xReportComponent->removePropertyChangeListener(PROPERTY_DATAFIELD,static_cast< beans::XPropertyChangeListener* >( this )); m_xReportComponent.clear(); m_xRowSet.clear(); m_aPropertyListeners.clear(); @@ -428,6 +432,8 @@ m_aFunctionNames.clear(); try { + if ( m_xReportComponent.is() && m_xReportComponent->getPropertySetInfo()->hasPropertyByName(PROPERTY_DATAFIELD) ) + m_xReportComponent->removePropertyChangeListener(PROPERTY_DATAFIELD,static_cast< beans::XPropertyChangeListener* >( this )); uno::Reference< container::XNameContainer > xObjectAsContainer( _rxInspectee, uno::UNO_QUERY ); m_xReportComponent.set( xObjectAsContainer->getByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ReportComponent" ) ) ), uno::UNO_QUERY ); @@ -442,6 +448,8 @@ m_aParamNames = getParameterNames( m_xRowSet ); impl_initFieldList_nothrow(m_aFieldNames); + if ( m_xReportComponent->getPropertySetInfo()->hasPropertyByName(PROPERTY_DATAFIELD) ) + m_xReportComponent->addPropertyChangeListener(PROPERTY_DATAFIELD,static_cast< beans::XPropertyChangeListener* >( this )); } uno::Reference< report::XReportComponent> xReportComponent( m_xReportComponent, uno::UNO_QUERY ); uno::Reference< report::XSection> xSection( m_xReportComponent, uno::UNO_QUERY ); @@ -492,26 +500,10 @@ break; case PROPERTY_ID_TYPE: { - uno::Any aDataField = m_xReportComponent->getPropertyValue( PROPERTY_DATAFIELD ); - lcl_convertFormulaTo(aDataField,aDataField); - ::rtl::OUString sDataField; - aDataField >>= sDataField; - if ( sDataField.getLength() ) - { - if ( impl_isDataField(sDataField) ) - m_nDataFieldType = DATA_OR_FORMULA; - else if ( isDefaultFunction(sDataField,sDataField) ) - m_nDataFieldType = FUNCTION; - else if ( m_aFunctionNames.find(sDataField) != m_aFunctionNames.end() ) - { - m_nDataFieldType = USER_DEF_FUNCTION; - ::rtl::OUString sScope; - if ( impl_isCounterFunction_throw(sDataField,sScope) ) - m_nDataFieldType = COUNTER; - } - else - m_nDataFieldType = DATA_OR_FORMULA; - } + sal_uInt32 nOldDataFieldType = m_nDataFieldType; + m_nDataFieldType = impl_getDataFieldType_throw(); + if ( UNDEF_DATA == m_nDataFieldType ) + m_nDataFieldType = nOldDataFieldType; aPropertyValue <<= m_nDataFieldType; } break; @@ -570,6 +562,7 @@ break; case PROPERTY_ID_DATAFIELD: { + OBlocker aBlocker(m_bIn); m_xReportComponent->setPropertyValue(PropertyName, aNewValue); bHandled = true; const ::rtl::OUString sOldFunctionName = m_sDefaultFunction; @@ -601,7 +594,7 @@ const ::rtl::OUString sOldFunctionName = m_sDefaultFunction; const ::rtl::OUString sOldScope = m_sScope; - m_sDefaultFunction = m_sScope = m_sDefaultFunction = ::rtl::OUString(); + m_sDefaultFunction = m_sScope = ::rtl::OUString(); if ( m_nDataFieldType == COUNTER ) { @@ -619,6 +612,7 @@ impl_createFunction(sDataField,::rtl::OUString(),m_aCounterFunction); sDataField = lcl_getQuotedFunctionName(sDataField); } + OBlocker aBlocker(m_bIn); m_xReportComponent->setPropertyValue(PROPERTY_DATAFIELD,uno::makeAny(impl_convertToFormula( uno::makeAny(sDataField)))); } else @@ -626,6 +620,7 @@ if ( m_bNewFunction ) removeFunction(); m_xFunction.clear(); + OBlocker aBlocker(m_bIn); m_xReportComponent->setPropertyValue(PROPERTY_DATAFIELD,uno::makeAny(::rtl::OUString())); } resetOwnProperties(aGuard,sOldFunctionName,sOldScope,m_nDataFieldType); @@ -654,12 +649,14 @@ } else if ( m_nDataFieldType == USER_DEF_FUNCTION ) { + OBlocker aBlocker(m_bIn); m_xReportComponent->setPropertyValue(PROPERTY_DATAFIELD,uno::makeAny(::rtl::OUString())); } } else if ( m_nDataFieldType == USER_DEF_FUNCTION ) { ::rtl::OUString sDataField; + OBlocker aBlocker(m_bIn); if ( isDefaultFunction(sFunction,sDataField) ) { const ::rtl::OUString sOldFunctionName = m_sDefaultFunction; @@ -1892,6 +1889,7 @@ else impl_createFunction(sFunctionName,_sDataField,*aIter); + OBlocker aBlocker(m_bIn); m_xReportComponent->setPropertyValue(PROPERTY_DATAFIELD,uno::makeAny( impl_convertToFormula( uno::makeAny(sQuotedFunctionName) ))); aEvent.NewValue <<= m_sScope; _aGuard.clear(); @@ -2064,6 +2062,74 @@ m_aFunctionNames.insert(TFunctions::value_type(sQuotedFunctionName,TFunctionPair(m_xFunction,xFunctionsSupplier))); m_bNewFunction = true; } +// ----------------------------------------------------------------------------- +sal_uInt32 GeometryHandler::impl_getDataFieldType_throw() const +{ + sal_uInt32 nDataFieldType = UNDEF_DATA; + uno::Any aDataField = m_xReportComponent->getPropertyValue( PROPERTY_DATAFIELD ); + lcl_convertFormulaTo(aDataField,aDataField); + ::rtl::OUString sDataField; + aDataField >>= sDataField; + if ( sDataField.getLength() ) + { + if ( impl_isDataField(sDataField) ) + nDataFieldType = DATA_OR_FORMULA; + else if ( isDefaultFunction(sDataField,sDataField) ) + nDataFieldType = FUNCTION; + else if ( m_aFunctionNames.find(sDataField) != m_aFunctionNames.end() ) + { + nDataFieldType = USER_DEF_FUNCTION; + ::rtl::OUString sScope; + if ( impl_isCounterFunction_throw(sDataField,sScope) ) + nDataFieldType = COUNTER; + } + else + nDataFieldType = DATA_OR_FORMULA; + } + return nDataFieldType; +} +// ----------------------------------------------------------------------------- +// XEventListener +void SAL_CALL GeometryHandler::disposing(const lang::EventObject& ) throw( uno::RuntimeException ) +{ +} +// XPropertyChangeListener +void SAL_CALL GeometryHandler::propertyChange(const beans::PropertyChangeEvent& /*evt*/) throw(uno::RuntimeException) +{ + ::osl::ResettableMutexGuard aGuard( m_aMutex ); + if ( !m_bIn ) + { + const sal_uInt32 nOldDataFieldType = m_nDataFieldType; + const ::rtl::OUString sOldFunctionName = m_sDefaultFunction; + const ::rtl::OUString sOldScope = m_sScope; + m_sDefaultFunction = m_sScope = ::rtl::OUString(); + m_nDataFieldType = impl_getDataFieldType_throw(); + if ( UNDEF_DATA == m_nDataFieldType ) + m_nDataFieldType = nOldDataFieldType; + //else + { + uno::Any aDataField = m_xReportComponent->getPropertyValue( PROPERTY_DATAFIELD ); + lcl_convertFormulaTo(aDataField,aDataField); + ::rtl::OUString sDataField; + aDataField >>= sDataField; + switch(m_nDataFieldType) + { + case DATA_OR_FORMULA: + break; + case FUNCTION: + isDefaultFunction(sDataField,sDataField,true); + break; + case USER_DEF_FUNCTION: + break; + case COUNTER: + impl_isCounterFunction_throw(sDataField,m_sScope); + break; + } + } + resetOwnProperties(aGuard,sOldFunctionName,sOldScope,nOldDataFieldType); + } +} + //........................................................................ } // namespace rptui //........................................................................ --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
