summaryrefslogtreecommitdiff
path: root/reportdesign/source/core/sdr/PropertyForward.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'reportdesign/source/core/sdr/PropertyForward.cxx')
-rw-r--r--reportdesign/source/core/sdr/PropertyForward.cxx205
1 files changed, 205 insertions, 0 deletions
diff --git a/reportdesign/source/core/sdr/PropertyForward.cxx b/reportdesign/source/core/sdr/PropertyForward.cxx
new file mode 100644
index 000000000000..dbd6d4da65a2
--- /dev/null
+++ b/reportdesign/source/core/sdr/PropertyForward.cxx
@@ -0,0 +1,205 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include "PropertyForward.hxx"
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <comphelper/property.hxx>
+#include <com/sun/star/sdbcx/XAppend.hpp>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+#include "corestrings.hrc"
+
+//........................................................................
+namespace rptui
+{
+//........................................................................
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::beans;
+ using namespace reportdesign;
+
+DBG_NAME( rpt_OPropertyMediator )
+OPropertyMediator::OPropertyMediator(const Reference< XPropertySet>& _xSource
+ ,const Reference< XPropertySet>& _xDest
+ ,const TPropertyNamePair& _aNameMap
+ ,sal_Bool _bReverse)
+ : OPropertyForward_Base(m_aMutex)
+ ,m_aNameMap(_aNameMap)
+ ,m_xSource(_xSource)
+ ,m_xDest(_xDest)
+ ,m_bInChange(sal_False)
+{
+ DBG_CTOR( rpt_OPropertyMediator,NULL);
+ osl_incrementInterlockedCount(&m_refCount);
+ OSL_ENSURE(m_xDest.is(),"Dest is NULL!");
+ OSL_ENSURE(m_xSource.is(),"Source is NULL!");
+ if ( m_xDest.is() && m_xSource.is() )
+ {
+ try
+ {
+ m_xDestInfo = m_xDest->getPropertySetInfo();
+ m_xSourceInfo = m_xSource->getPropertySetInfo();
+ if ( _bReverse )
+ {
+ ::comphelper::copyProperties(m_xDest,m_xSource);
+ TPropertyNamePair::iterator aIter = m_aNameMap.begin();
+ TPropertyNamePair::iterator aEnd = m_aNameMap.end();
+ for (; aIter != aEnd; ++aIter)
+ {
+ Property aProp = m_xSourceInfo->getPropertyByName(aIter->first);
+ if (0 == (aProp.Attributes & PropertyAttribute::READONLY))
+ {
+ Any aValue = _xDest->getPropertyValue(aIter->second.first);
+ if ( 0 != (aProp.Attributes & PropertyAttribute::MAYBEVOID) || aValue.hasValue() )
+ _xSource->setPropertyValue(aIter->first,aIter->second.second->operator()(aIter->second.first,aValue));
+ }
+ }
+ }
+ else
+ {
+ ::comphelper::copyProperties(m_xSource,m_xDest);
+ TPropertyNamePair::iterator aIter = m_aNameMap.begin();
+ TPropertyNamePair::iterator aEnd = m_aNameMap.end();
+ for (; aIter != aEnd; ++aIter)
+ _xDest->setPropertyValue(aIter->second.first,aIter->second.second->operator()(aIter->second.first,_xSource->getPropertyValue(aIter->first)));
+ }
+ startListening();
+ }
+ catch(Exception& e)
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ (void)e;
+ }
+ } // if ( m_xDest.is() && m_xSource.is() )
+ osl_decrementInterlockedCount(&m_refCount);
+}
+// -----------------------------------------------------------------------------
+OPropertyMediator::~OPropertyMediator()
+{
+ DBG_DTOR( rpt_OPropertyMediator,NULL);
+}
+// -----------------------------------------------------------------------------
+void SAL_CALL OPropertyMediator::propertyChange( const PropertyChangeEvent& evt ) throw(RuntimeException)
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ if ( !m_bInChange )
+ {
+ m_bInChange = sal_True;
+ try
+ {
+ sal_Bool bDest = (evt.Source == m_xDest);
+ Reference<XPropertySet> xProp = bDest ? m_xSource : m_xDest;
+ Reference<XPropertySetInfo> xPropInfo = bDest ? m_xSourceInfo : m_xDestInfo;
+ if ( xProp.is() )
+ {
+ if ( xPropInfo.is() )
+ {
+ if ( xPropInfo->hasPropertyByName(evt.PropertyName) )
+ xProp->setPropertyValue(evt.PropertyName,evt.NewValue);
+ else
+ {
+ TPropertyNamePair::iterator aFind = m_aNameMap.find(evt.PropertyName);
+ ::rtl::OUString sPropName;
+ if ( aFind != m_aNameMap.end() )
+ sPropName = aFind->second.first;
+ else
+ {
+ aFind = ::std::find_if(
+ m_aNameMap.begin(),
+ m_aNameMap.end(),
+ ::std::compose1(
+ ::std::bind2nd(::std::equal_to< ::rtl::OUString >(), evt.PropertyName),
+ ::std::compose1(::std::select1st<TPropertyConverter>(),::std::select2nd<TPropertyNamePair::value_type>())
+ )
+ );
+ if ( aFind != m_aNameMap.end() )
+ sPropName = aFind->first;
+ }
+ if ( sPropName.getLength() && xPropInfo->hasPropertyByName(sPropName) )
+ xProp->setPropertyValue(sPropName,aFind->second.second->operator()(sPropName,evt.NewValue));
+ else if ( evt.PropertyName == PROPERTY_CHARFONTNAME
+ || evt.PropertyName == PROPERTY_CHARFONTSTYLENAME
+ || evt.PropertyName == PROPERTY_CHARSTRIKEOUT
+ || evt.PropertyName == PROPERTY_CHARWORDMODE
+ || evt.PropertyName == PROPERTY_CHARROTATION
+ || evt.PropertyName == PROPERTY_CHARSCALEWIDTH
+ || evt.PropertyName == PROPERTY_CHARFONTFAMILY
+ || evt.PropertyName == PROPERTY_CHARFONTCHARSET
+ || evt.PropertyName == PROPERTY_CHARFONTPITCH
+ || evt.PropertyName == PROPERTY_CHARHEIGHT
+ || evt.PropertyName == PROPERTY_CHARUNDERLINE
+ || evt.PropertyName == PROPERTY_CHARWEIGHT
+ || evt.PropertyName == PROPERTY_CHARPOSTURE)
+ {
+ xProp->setPropertyValue(PROPERTY_FONTDESCRIPTOR,m_xSource->getPropertyValue(PROPERTY_FONTDESCRIPTOR));
+ }
+ }
+ }
+ }
+ }
+ catch(Exception&)
+ {
+ OSL_ENSURE(0,"Exception catched!");
+ }
+ m_bInChange = sal_False;
+ }
+}
+// -----------------------------------------------------------------------------
+void SAL_CALL OPropertyMediator::disposing( const ::com::sun::star::lang::EventObject& /*_rSource*/ ) throw (RuntimeException)
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ disposing();
+}
+// -----------------------------------------------------------------------------
+void SAL_CALL OPropertyMediator::disposing()
+{
+ stopListening();
+ m_xSource.clear();
+ m_xSourceInfo.clear();
+ m_xDest.clear();
+ m_xDestInfo.clear();
+}
+// -----------------------------------------------------------------------------
+void OPropertyMediator::stopListening()
+{
+ if ( m_xSource.is() )
+ m_xSource->removePropertyChangeListener(::rtl::OUString(), this);
+ if ( m_xDest.is() )
+ m_xDest->removePropertyChangeListener(::rtl::OUString(), this);
+}
+// -----------------------------------------------------------------------------
+void OPropertyMediator::startListening()
+{
+ if ( m_xSource.is() )
+ m_xSource->addPropertyChangeListener(::rtl::OUString(), this);
+ if ( m_xDest.is() )
+ m_xDest->addPropertyChangeListener(::rtl::OUString(), this);
+}
+// -----------------------------------------------------------------------------
+//........................................................................
+} // namespace dbaccess
+//........................................................................
+