[Libreoffice-commits] core.git: framework/inc framework/Library_fwi.mk framework/source

Stephan Bergmann sbergman at redhat.com
Thu Apr 7 15:33:56 UTC 2016


 framework/Library_fwi.mk                           |    1 
 framework/inc/classes/propertysethelper.hxx        |  193 ---------
 framework/source/fwi/classes/propertysethelper.cxx |  338 -----------------
 framework/source/services/frame.cxx                |  413 ++++++++++++++++++++-
 4 files changed, 400 insertions(+), 545 deletions(-)

New commits:
commit e2ef26991681d6e24c32f08660382af4ca48475c
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu Apr 7 17:33:26 2016 +0200

    Fold PropertySetHelper into its only use, Frame
    
    Change-Id: I148e15c2c91a985cd110f5589adbf26c102b1cfb

diff --git a/framework/Library_fwi.mk b/framework/Library_fwi.mk
index f48ef2d..5e82963 100644
--- a/framework/Library_fwi.mk
+++ b/framework/Library_fwi.mk
@@ -52,7 +52,6 @@ $(eval $(call gb_Library_use_libraries,fwi,\
 
 $(eval $(call gb_Library_add_exception_objects,fwi,\
     framework/source/fwi/classes/converter \
-    framework/source/fwi/classes/propertysethelper \
     framework/source/fwi/classes/protocolhandlercache \
     framework/source/fwi/helper/mischelper \
     framework/source/fwi/helper/networkdomain \
diff --git a/framework/inc/classes/propertysethelper.hxx b/framework/inc/classes/propertysethelper.hxx
deleted file mode 100644
index e09c071..0000000
--- a/framework/inc/classes/propertysethelper.hxx
+++ /dev/null
@@ -1,193 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   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 .
- */
-
-#ifndef INCLUDED_FRAMEWORK_INC_CLASSES_PROPERTYSETHELPER_HXX
-#define INCLUDED_FRAMEWORK_INC_CLASSES_PROPERTYSETHELPER_HXX
-
-#include <threadhelp/transactionbase.hxx>
-#include <general.h>
-#include <stdtypes.h>
-
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/beans/XPropertySetInfo.hpp>
-#include <com/sun/star/beans/PropertyExistException.hpp>
-#include <com/sun/star/beans/UnknownPropertyException.hpp>
-
-#include <cppuhelper/weakref.hxx>
-#include <fwidllapi.h>
-
-namespace framework{
-
-/** supports the API XPropertySet and XPropertySetInfo.
- *
- *  It must be used as baseclass. The internal list of supported
- *  properties can be changed every time so dynamic property set's
- *  can be implemented.
- *
- *  Further the derived and this base class share the same lock.
- *  So it's possible to be threadsafe if it's needed.
-*/
-class FWI_DLLPUBLIC PropertySetHelper : public css::beans::XPropertySet
-                        , public css::beans::XPropertySetInfo
-{
-
-    /* types */
-    protected:
-
-        typedef BaseHash< css::beans::Property > TPropInfoHash;
-
-    /* member */
-    protected:
-
-        PropertySetHelper::TPropInfoHash m_lProps;
-
-        ListenerHash m_lSimpleChangeListener;
-        ListenerHash m_lVetoChangeListener;
-
-        // hold it weak ... otherwise this helper has to be "killed" explicitly .-)
-        css::uno::WeakReference< css::uno::XInterface > m_xBroadcaster;
-
-        TransactionManager& m_rTransactionManager;
-
-    /* native interface */
-    public:
-
-        /** initialize new instance of this helper.
-         *
-         *  @param  pExternalTransactionManager
-         *          this helper must be used as a baseclass ...
-         *          but then it should synchronize its own calls
-         *          with the same transaction manager then it's superclass.
-         */
-        PropertySetHelper(      osl::Mutex & mutex,
-                                TransactionManager*                                     pExternalTransactionManager);
-
-        /** free all needed memory.
-         */
-        virtual ~PropertySetHelper();
-
-        /** set a new owner for this helper.
-         *
-         *  This owner is used as source for all broadcasted events.
-         *  Further we hold it weak, because we don't wish to be disposed() .-)
-         */
-        void impl_setPropertyChangeBroadcaster(const css::uno::Reference< css::uno::XInterface >& xBroadcaster);
-
-        /** add a new property info to the set of supported ones.
-         *
-         *  @param  aProperty
-         *          describes the new property.
-         *
-         *  @throw  [css::beans::PropertyExistException]
-         *          if a property with the same name already exists.
-         *
-         *  Note:   The consistence of the whole set of properties is not checked here.
-         *          Means e.g. ... a handle which exists more than once is not detected.
-         *          The owner of this class has to be sure, that every new property does
-         *          not clash with any existing one.
-         */
-        void SAL_CALL impl_addPropertyInfo(const css::beans::Property& aProperty)
-            throw(css::beans::PropertyExistException,
-                  css::uno::Exception               );
-
-        /** mark the object as "useable for working" or "dead".
-         *
-         *  This correspond to the lifetime handling implemented by the base class TransactionBase.
-         *  There is no chance to reactive a "dead" object by calling impl_enablePropertySet()
-         *  again!
-         */
-        void SAL_CALL impl_disablePropertySet();
-
-        /**
-         */
-        virtual void SAL_CALL impl_setPropertyValue(const OUString& sProperty,
-                                                          sal_Int32        nHandle  ,
-                                                    const css::uno::Any&   aValue   ) = 0;
-
-        virtual css::uno::Any SAL_CALL impl_getPropertyValue(const OUString& sProperty,
-                                                                   sal_Int32        nHandle  ) = 0;
-
-    /* uno interface */
-    public:
-
-        // XPropertySet
-        virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo()
-            throw(css::uno::RuntimeException, std::exception) override;
-
-        virtual void SAL_CALL setPropertyValue(const OUString& sProperty,
-                                               const css::uno::Any&   aValue   )
-            throw(css::beans::UnknownPropertyException,
-                  css::beans::PropertyVetoException   ,
-                  css::lang::IllegalArgumentException ,
-                  css::lang::WrappedTargetException   ,
-                  css::uno::RuntimeException, std::exception          ) override;
-
-        virtual css::uno::Any SAL_CALL getPropertyValue(const OUString& sProperty)
-            throw(css::beans::UnknownPropertyException,
-                  css::lang::WrappedTargetException   ,
-                  css::uno::RuntimeException, std::exception          ) override;
-
-        virtual void SAL_CALL addPropertyChangeListener(const OUString&                                            sProperty,
-                                                        const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener)
-            throw(css::beans::UnknownPropertyException,
-                  css::lang::WrappedTargetException   ,
-                  css::uno::RuntimeException, std::exception          ) override;
-
-        virtual void SAL_CALL removePropertyChangeListener(const OUString&                                            sProperty,
-                                                           const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener)
-            throw(css::beans::UnknownPropertyException,
-                  css::lang::WrappedTargetException   ,
-                  css::uno::RuntimeException, std::exception          ) override;
-
-        virtual void SAL_CALL addVetoableChangeListener(const OUString&                                            sProperty,
-                                                        const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener)
-            throw(css::beans::UnknownPropertyException,
-                  css::lang::WrappedTargetException   ,
-                  css::uno::RuntimeException, std::exception          ) override;
-
-        virtual void SAL_CALL removeVetoableChangeListener(const OUString&                                            sProperty,
-                                                           const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener)
-            throw(css::beans::UnknownPropertyException,
-                  css::lang::WrappedTargetException   ,
-                  css::uno::RuntimeException, std::exception          ) override;
-
-        // XPropertySetInfo
-        virtual css::uno::Sequence< css::beans::Property > SAL_CALL getProperties()
-            throw(css::uno::RuntimeException, std::exception) override;
-
-        virtual css::beans::Property SAL_CALL getPropertyByName(const OUString& sName)
-            throw(css::beans::UnknownPropertyException,
-                  css::uno::RuntimeException, std::exception          ) override;
-
-        virtual sal_Bool SAL_CALL hasPropertyByName(const OUString& sName)
-            throw(css::uno::RuntimeException, std::exception) override;
-
-    /* internal helper */
-    private:
-
-        bool impl_existsVeto(const css::beans::PropertyChangeEvent& aEvent);
-
-        void impl_notifyChangeListener(const css::beans::PropertyChangeEvent& aEvent);
-};
-
-} // namespace framework
-
-#endif // INCLUDED_FRAMEWORK_INC_CLASSES_PROPERTYSETHELPER_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/fwi/classes/propertysethelper.cxx b/framework/source/fwi/classes/propertysethelper.cxx
deleted file mode 100644
index 6a42b67..0000000
--- a/framework/source/fwi/classes/propertysethelper.cxx
+++ /dev/null
@@ -1,338 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   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 .
- */
-
-#include <sal/config.h>
-
-#include <vcl/svapp.hxx>
-
-#include <classes/propertysethelper.hxx>
-#include <threadhelp/transactionguard.hxx>
-
-namespace framework{
-
-PropertySetHelper::PropertySetHelper(      osl::Mutex & mutex,
-                                           TransactionManager*                                     pExternalTransactionManager )
-    : m_lSimpleChangeListener(mutex)
-    , m_lVetoChangeListener  (mutex)
-    , m_rTransactionManager  (*pExternalTransactionManager         )
-{
-}
-
-PropertySetHelper::~PropertySetHelper()
-{
-}
-
-void PropertySetHelper::impl_setPropertyChangeBroadcaster(const css::uno::Reference< css::uno::XInterface >& xBroadcaster)
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_SOFTEXCEPTIONS);
-
-    SolarMutexGuard g;
-    m_xBroadcaster = xBroadcaster;
-}
-
-void SAL_CALL PropertySetHelper::impl_addPropertyInfo(const css::beans::Property& aProperty)
-    throw(css::beans::PropertyExistException,
-          css::uno::Exception               )
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_SOFTEXCEPTIONS);
-
-    SolarMutexGuard g;
-
-    PropertySetHelper::TPropInfoHash::const_iterator pIt = m_lProps.find(aProperty.Name);
-    if (pIt != m_lProps.end())
-        throw css::beans::PropertyExistException();
-
-    m_lProps[aProperty.Name] = aProperty;
-}
-
-void SAL_CALL PropertySetHelper::impl_disablePropertySet()
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_SOFTEXCEPTIONS);
-
-    SolarMutexGuard g;
-
-    css::uno::Reference< css::uno::XInterface > xThis(static_cast< css::beans::XPropertySet* >(this), css::uno::UNO_QUERY);
-    css::lang::EventObject aEvent(xThis);
-
-    m_lSimpleChangeListener.disposeAndClear(aEvent);
-    m_lVetoChangeListener.disposeAndClear(aEvent);
-    m_lProps.free();
-}
-
-bool PropertySetHelper::impl_existsVeto(const css::beans::PropertyChangeEvent& aEvent)
-{
-    /*  Don't use the lock here!
-        The used helper is threadsafe and it lives for the whole lifetime of
-        our own object.
-    */
-    ::cppu::OInterfaceContainerHelper* pVetoListener = m_lVetoChangeListener.getContainer(aEvent.PropertyName);
-    if (! pVetoListener)
-        return false;
-
-    ::cppu::OInterfaceIteratorHelper pListener(*pVetoListener);
-    while (pListener.hasMoreElements())
-    {
-        try
-        {
-            css::uno::Reference< css::beans::XVetoableChangeListener > xListener(
-                static_cast<css::beans::XVetoableChangeListener*>(pListener.next()),
-                css::uno::UNO_QUERY_THROW);
-            xListener->vetoableChange(aEvent);
-        }
-        catch(const css::uno::RuntimeException&)
-            { pListener.remove(); }
-        catch(const css::beans::PropertyVetoException&)
-            { return true; }
-    }
-
-    return false;
-}
-
-void PropertySetHelper::impl_notifyChangeListener(const css::beans::PropertyChangeEvent& aEvent)
-{
-    /*  Don't use the lock here!
-        The used helper is threadsafe and it lives for the whole lifetime of
-        our own object.
-    */
-    ::cppu::OInterfaceContainerHelper* pSimpleListener = m_lSimpleChangeListener.getContainer(aEvent.PropertyName);
-    if (! pSimpleListener)
-        return;
-
-    ::cppu::OInterfaceIteratorHelper pListener(*pSimpleListener);
-    while (pListener.hasMoreElements())
-    {
-        try
-        {
-            css::uno::Reference< css::beans::XPropertyChangeListener > xListener(
-                static_cast<css::beans::XVetoableChangeListener*>(pListener.next()),
-                css::uno::UNO_QUERY_THROW);
-            xListener->propertyChange(aEvent);
-        }
-        catch(const css::uno::RuntimeException&)
-            { pListener.remove(); }
-    }
-}
-
-css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL PropertySetHelper::getPropertySetInfo()
-    throw(css::uno::RuntimeException, std::exception)
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_HARDEXCEPTIONS);
-
-    css::uno::Reference< css::beans::XPropertySetInfo > xInfo(static_cast< css::beans::XPropertySetInfo* >(this), css::uno::UNO_QUERY_THROW);
-    return xInfo;
-}
-
-void SAL_CALL PropertySetHelper::setPropertyValue(const OUString& sProperty,
-                                                  const css::uno::Any&   aValue   )
-    throw(css::beans::UnknownPropertyException,
-          css::beans::PropertyVetoException   ,
-          css::lang::IllegalArgumentException ,
-          css::lang::WrappedTargetException   ,
-          css::uno::RuntimeException, std::exception          )
-{
-    // TODO look for e.g. readonly props and reject setProp() call!
-
-    TransactionGuard aTransaction(m_rTransactionManager, E_HARDEXCEPTIONS);
-
-    // SAFE ->
-    SolarMutexGuard g;
-
-    PropertySetHelper::TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
-    if (pIt == m_lProps.end())
-        throw css::beans::UnknownPropertyException();
-
-    css::beans::Property aPropInfo = pIt->second;
-
-    css::uno::Any aCurrentValue = impl_getPropertyValue(aPropInfo.Name, aPropInfo.Handle);
-
-    bool bWillBeChanged = (aCurrentValue != aValue);
-    if (! bWillBeChanged)
-        return;
-
-    css::beans::PropertyChangeEvent aEvent;
-    aEvent.PropertyName   = aPropInfo.Name;
-    aEvent.Further        = sal_False;
-    aEvent.PropertyHandle = aPropInfo.Handle;
-    aEvent.OldValue       = aCurrentValue;
-    aEvent.NewValue       = aValue;
-    aEvent.Source.set(m_xBroadcaster.get(), css::uno::UNO_QUERY);
-
-    if (impl_existsVeto(aEvent))
-        throw css::beans::PropertyVetoException();
-
-    impl_setPropertyValue(aPropInfo.Name, aPropInfo.Handle, aValue);
-
-    impl_notifyChangeListener(aEvent);
-}
-
-css::uno::Any SAL_CALL PropertySetHelper::getPropertyValue(const OUString& sProperty)
-    throw(css::beans::UnknownPropertyException,
-          css::lang::WrappedTargetException   ,
-          css::uno::RuntimeException, std::exception          )
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_HARDEXCEPTIONS);
-
-    // SAFE ->
-    SolarMutexClearableGuard aReadLock;
-
-    PropertySetHelper::TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
-    if (pIt == m_lProps.end())
-        throw css::beans::UnknownPropertyException();
-
-    css::beans::Property aPropInfo = pIt->second;
-
-    return impl_getPropertyValue(aPropInfo.Name, aPropInfo.Handle);
-}
-
-void SAL_CALL PropertySetHelper::addPropertyChangeListener(const OUString&                                            sProperty,
-                                                           const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener)
-    throw(css::beans::UnknownPropertyException,
-          css::lang::WrappedTargetException   ,
-          css::uno::RuntimeException, std::exception          )
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_HARDEXCEPTIONS);
-
-    // SAFE ->
-    SolarMutexClearableGuard aReadLock;
-
-    PropertySetHelper::TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
-    if (pIt == m_lProps.end())
-        throw css::beans::UnknownPropertyException();
-
-    aReadLock.clear();
-    // <- SAFE
-
-    m_lSimpleChangeListener.addInterface(sProperty, xListener);
-}
-
-void SAL_CALL PropertySetHelper::removePropertyChangeListener(const OUString&                                            sProperty,
-                                                              const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener)
-    throw(css::beans::UnknownPropertyException,
-          css::lang::WrappedTargetException   ,
-          css::uno::RuntimeException, std::exception          )
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_SOFTEXCEPTIONS);
-
-    // SAFE ->
-    SolarMutexClearableGuard aReadLock;
-
-    PropertySetHelper::TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
-    if (pIt == m_lProps.end())
-        throw css::beans::UnknownPropertyException();
-
-    aReadLock.clear();
-    // <- SAFE
-
-    m_lSimpleChangeListener.removeInterface(sProperty, xListener);
-}
-
-void SAL_CALL PropertySetHelper::addVetoableChangeListener(const OUString&                                            sProperty,
-                                                           const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener)
-    throw(css::beans::UnknownPropertyException,
-          css::lang::WrappedTargetException   ,
-          css::uno::RuntimeException, std::exception          )
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_HARDEXCEPTIONS);
-
-    // SAFE ->
-    SolarMutexClearableGuard aReadLock;
-
-    PropertySetHelper::TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
-    if (pIt == m_lProps.end())
-        throw css::beans::UnknownPropertyException();
-
-    aReadLock.clear();
-    // <- SAFE
-
-    m_lVetoChangeListener.addInterface(sProperty, xListener);
-}
-
-void SAL_CALL PropertySetHelper::removeVetoableChangeListener(const OUString&                                            sProperty,
-                                                              const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener)
-    throw(css::beans::UnknownPropertyException,
-          css::lang::WrappedTargetException   ,
-          css::uno::RuntimeException, std::exception          )
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_SOFTEXCEPTIONS);
-
-    // SAFE ->
-    SolarMutexClearableGuard aReadLock;
-
-    PropertySetHelper::TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
-    if (pIt == m_lProps.end())
-        throw css::beans::UnknownPropertyException();
-
-    aReadLock.clear();
-    // <- SAFE
-
-    m_lVetoChangeListener.removeInterface(sProperty, xListener);
-}
-
-css::uno::Sequence< css::beans::Property > SAL_CALL PropertySetHelper::getProperties()
-    throw(css::uno::RuntimeException, std::exception)
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_HARDEXCEPTIONS);
-
-    SolarMutexGuard g;
-
-    sal_Int32                                        c     = (sal_Int32)m_lProps.size();
-    css::uno::Sequence< css::beans::Property >       lProps(c);
-    PropertySetHelper::TPropInfoHash::const_iterator pIt;
-
-    for (  pIt  = m_lProps.begin();
-           pIt != m_lProps.end();
-         ++pIt                    )
-    {
-        lProps[--c] = pIt->second;
-    }
-
-    return lProps;
-}
-
-css::beans::Property SAL_CALL PropertySetHelper::getPropertyByName(const OUString& sName)
-    throw(css::beans::UnknownPropertyException,
-          css::uno::RuntimeException, std::exception          )
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_HARDEXCEPTIONS);
-
-    SolarMutexGuard g;
-
-    PropertySetHelper::TPropInfoHash::const_iterator pIt = m_lProps.find(sName);
-    if (pIt == m_lProps.end())
-        throw css::beans::UnknownPropertyException();
-
-    return pIt->second;
-}
-
-sal_Bool SAL_CALL PropertySetHelper::hasPropertyByName(const OUString& sName)
-    throw(css::uno::RuntimeException, std::exception)
-{
-    TransactionGuard aTransaction(m_rTransactionManager, E_HARDEXCEPTIONS);
-
-    SolarMutexGuard g;
-
-    PropertySetHelper::TPropInfoHash::iterator pIt    = m_lProps.find(sName);
-    bool                                   bExist = (pIt != m_lProps.end());
-
-    return bExist;
-}
-
-} // namespace framework
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/services/frame.cxx b/framework/source/services/frame.cxx
index 00b2a74..b24bf35 100644
--- a/framework/source/services/frame.cxx
+++ b/framework/source/services/frame.cxx
@@ -31,7 +31,6 @@
 #include <helper/dockingareadefaultacceptor.hxx>
 #include <dispatch/dispatchinformationprovider.hxx>
 #include <classes/framecontainer.hxx>
-#include <classes/propertysethelper.hxx>
 #include <threadhelp/transactionguard.hxx>
 #include <threadhelp/transactionbase.hxx>
 #include <general.h>
@@ -44,6 +43,7 @@
 #include <com/sun/star/awt/XTopWindow.hpp>
 #include <com/sun/star/awt/PosSize.hpp>
 #include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/PropertyExistException.hpp>
 #include <com/sun/star/beans/PropertyValue.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/container/XIndexAccess.hpp>
@@ -116,8 +116,6 @@ enum EActiveState
     @base       TransactionBase
                     help to implement unbreakable interface calls
     @base       OBroadcastHelper
-                OPropertySetHelper
-                    implements the property set
     @base       OWeakObject
                     provides the refcount and XInterface, XWeak
 
@@ -136,10 +134,11 @@ class Frame :   // interfaces
                 public  css::frame::XComponentLoader                ,
                 public  css::frame::XTitle                          ,
                 public  css::frame::XTitleChangeBroadcaster         ,
+                public css::beans::XPropertySet,
+                public css::beans::XPropertySetInfo,
                 // base classes
                 public  TransactionBase                             ,
                 private cppu::BaseMutex,
-                public  PropertySetHelper                           ,   // helper implements TransactionBase, XPropertySet, XPropertySetInfo
                 public  ::cppu::OWeakObject                             // helper implements XInterface, XWeak
 {
 public:
@@ -306,19 +305,104 @@ public:
     virtual css::uno::Reference<css::uno::XInterface> SAL_CALL getLayoutManager() throw (css::uno::RuntimeException, std::exception) override;
     virtual void SAL_CALL setLayoutManager(const css::uno::Reference<css::uno::XInterface>&) throw (css::uno::RuntimeException, std::exception) override;
 
-    //  PropertySetHelper => XPropertySet, XPropertySetInfo
+    // XPropertySet
+    virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo()
+        throw(css::uno::RuntimeException, std::exception) override;
+
+    virtual void SAL_CALL setPropertyValue(const OUString& sProperty,
+                                           const css::uno::Any&   aValue   )
+        throw(css::beans::UnknownPropertyException,
+              css::beans::PropertyVetoException   ,
+              css::lang::IllegalArgumentException ,
+              css::lang::WrappedTargetException   ,
+              css::uno::RuntimeException, std::exception          ) override;
+
+    virtual css::uno::Any SAL_CALL getPropertyValue(const OUString& sProperty)
+        throw(css::beans::UnknownPropertyException,
+              css::lang::WrappedTargetException   ,
+              css::uno::RuntimeException, std::exception          ) override;
+
+    virtual void SAL_CALL addPropertyChangeListener(const OUString&                                            sProperty,
+                                                    const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener)
+        throw(css::beans::UnknownPropertyException,
+              css::lang::WrappedTargetException   ,
+              css::uno::RuntimeException, std::exception          ) override;
+
+    virtual void SAL_CALL removePropertyChangeListener(const OUString&                                            sProperty,
+                                                       const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener)
+        throw(css::beans::UnknownPropertyException,
+              css::lang::WrappedTargetException   ,
+              css::uno::RuntimeException, std::exception          ) override;
+
+    virtual void SAL_CALL addVetoableChangeListener(const OUString&                                            sProperty,
+                                                    const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener)
+        throw(css::beans::UnknownPropertyException,
+              css::lang::WrappedTargetException   ,
+              css::uno::RuntimeException, std::exception          ) override;
+
+    virtual void SAL_CALL removeVetoableChangeListener(const OUString&                                            sProperty,
+                                                       const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener)
+        throw(css::beans::UnknownPropertyException,
+              css::lang::WrappedTargetException   ,
+              css::uno::RuntimeException, std::exception          ) override;
+
+    // XPropertySetInfo
+    virtual css::uno::Sequence< css::beans::Property > SAL_CALL getProperties()
+        throw(css::uno::RuntimeException, std::exception) override;
+
+    virtual css::beans::Property SAL_CALL getPropertyByName(const OUString& sName)
+        throw(css::beans::UnknownPropertyException,
+              css::uno::RuntimeException, std::exception          ) override;
+
+    virtual sal_Bool SAL_CALL hasPropertyByName(const OUString& sName)
+        throw(css::uno::RuntimeException, std::exception) override;
 
 private:
 
     void impl_initializePropInfo();
 
-    virtual void SAL_CALL impl_setPropertyValue(const OUString& sProperty,
+    void SAL_CALL impl_setPropertyValue(const OUString& sProperty,
                                                       sal_Int32        nHandle  ,
-                                                const css::uno::Any&   aValue   ) override;
+                                                const css::uno::Any&   aValue   );
+
+    css::uno::Any SAL_CALL impl_getPropertyValue(const OUString& sProperty,
+                                                               sal_Int32        nHandle  );
+
+    /** set a new owner for this helper.
+     *
+     *  This owner is used as source for all broadcasted events.
+     *  Further we hold it weak, because we don't wish to be disposed() .-)
+     */
+    void impl_setPropertyChangeBroadcaster(const css::uno::Reference< css::uno::XInterface >& xBroadcaster);
+
+    /** add a new property info to the set of supported ones.
+     *
+     *  @param  aProperty
+     *          describes the new property.
+     *
+     *  @throw  [css::beans::PropertyExistException]
+     *          if a property with the same name already exists.
+     *
+     *  Note:   The consistence of the whole set of properties is not checked here.
+     *          Means e.g. ... a handle which exists more than once is not detected.
+     *          The owner of this class has to be sure, that every new property does
+     *          not clash with any existing one.
+     */
+    void SAL_CALL impl_addPropertyInfo(const css::beans::Property& aProperty)
+        throw(css::beans::PropertyExistException,
+              css::uno::Exception               );
+
+    /** mark the object as "useable for working" or "dead".
+     *
+     *  This correspond to the lifetime handling implemented by the base class TransactionBase.
+     *  There is no chance to reactive a "dead" object by calling impl_enablePropertySet()
+     *  again!
+     */
+    void SAL_CALL impl_disablePropertySet();
 
-    virtual css::uno::Any SAL_CALL impl_getPropertyValue(const OUString& sProperty,
-                                                               sal_Int32        nHandle  ) override;
+    bool impl_existsVeto(const css::beans::PropertyChangeEvent& aEvent);
 
+    void impl_notifyChangeListener(const css::beans::PropertyChangeEvent& aEvent);
 
 private:
 
@@ -408,6 +492,15 @@ private:
 
     WindowCommandDispatch*                                                  m_pWindowCommandDispatch;
 
+    typedef BaseHash< css::beans::Property > TPropInfoHash;
+    TPropInfoHash m_lProps;
+
+    ListenerHash m_lSimpleChangeListener;
+    ListenerHash m_lVetoChangeListener;
+
+    // hold it weak ... otherwise this helper has to be "killed" explicitly .-)
+    css::uno::WeakReference< css::uno::XInterface > m_xBroadcaster;
+
 protected:
 
     FrameContainer                                                          m_aChildFrameContainer;   /// array of child frames
@@ -486,7 +579,6 @@ DEFINE_XTYPEPROVIDER_21             (   Frame
 *//*-*****************************************************************************************************/
 Frame::Frame( const css::uno::Reference< css::uno::XComponentContext >& xContext )
         :   TransactionBase             (                                                   )
-        ,   PropertySetHelper           ( m_aMutex, &m_aTransactionManager)
         //  init member
         ,   m_xContext                  ( xContext                                          )
         ,   m_aListenerContainer        ( m_aMutex )
@@ -503,6 +595,8 @@ Frame::Frame( const css::uno::Reference< css::uno::XComponentContext >& xContext
         ,   m_bIsHidden                 ( true                                          )
         ,   m_xTitleHelper              (                                                   )
         ,   m_pWindowCommandDispatch    ( nullptr                                                 )
+        , m_lSimpleChangeListener(m_aMutex)
+        , m_lVetoChangeListener  (m_aMutex)
         ,   m_aChildFrameContainer      (                                                   )
 {
 }
@@ -553,7 +647,7 @@ void Frame::initListeners()
     // Create layout manager and connect it to the newly created frame
     m_xLayoutManager = css::frame::LayoutManager::create(m_xContext);
 
-    // set information about all supported properties at the base class helper PropertySetHelper
+    // set information about all supported properties
     impl_initializePropInfo();
 }
 
@@ -1923,6 +2017,210 @@ void SAL_CALL Frame::setLayoutManager(const css::uno::Reference<css::uno::XInter
     m_xLayoutManager.set(p1, css::uno::UNO_QUERY);
 }
 
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL Frame::getPropertySetInfo()
+    throw(css::uno::RuntimeException, std::exception)
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_HARDEXCEPTIONS);
+
+    css::uno::Reference< css::beans::XPropertySetInfo > xInfo(static_cast< css::beans::XPropertySetInfo* >(this), css::uno::UNO_QUERY_THROW);
+    return xInfo;
+}
+
+void SAL_CALL Frame::setPropertyValue(const OUString& sProperty,
+                                                  const css::uno::Any&   aValue   )
+    throw(css::beans::UnknownPropertyException,
+          css::beans::PropertyVetoException   ,
+          css::lang::IllegalArgumentException ,
+          css::lang::WrappedTargetException   ,
+          css::uno::RuntimeException, std::exception          )
+{
+    // TODO look for e.g. readonly props and reject setProp() call!
+
+    TransactionGuard aTransaction(m_aTransactionManager, E_HARDEXCEPTIONS);
+
+    // SAFE ->
+    SolarMutexGuard g;
+
+    TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
+    if (pIt == m_lProps.end())
+        throw css::beans::UnknownPropertyException();
+
+    css::beans::Property aPropInfo = pIt->second;
+
+    css::uno::Any aCurrentValue = impl_getPropertyValue(aPropInfo.Name, aPropInfo.Handle);
+
+    bool bWillBeChanged = (aCurrentValue != aValue);
+    if (! bWillBeChanged)
+        return;
+
+    css::beans::PropertyChangeEvent aEvent;
+    aEvent.PropertyName   = aPropInfo.Name;
+    aEvent.Further        = sal_False;
+    aEvent.PropertyHandle = aPropInfo.Handle;
+    aEvent.OldValue       = aCurrentValue;
+    aEvent.NewValue       = aValue;
+    aEvent.Source.set(m_xBroadcaster.get(), css::uno::UNO_QUERY);
+
+    if (impl_existsVeto(aEvent))
+        throw css::beans::PropertyVetoException();
+
+    impl_setPropertyValue(aPropInfo.Name, aPropInfo.Handle, aValue);
+
+    impl_notifyChangeListener(aEvent);
+}
+
+css::uno::Any SAL_CALL Frame::getPropertyValue(const OUString& sProperty)
+    throw(css::beans::UnknownPropertyException,
+          css::lang::WrappedTargetException   ,
+          css::uno::RuntimeException, std::exception          )
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_HARDEXCEPTIONS);
+
+    // SAFE ->
+    SolarMutexClearableGuard aReadLock;
+
+    TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
+    if (pIt == m_lProps.end())
+        throw css::beans::UnknownPropertyException();
+
+    css::beans::Property aPropInfo = pIt->second;
+
+    return impl_getPropertyValue(aPropInfo.Name, aPropInfo.Handle);
+}
+
+void SAL_CALL Frame::addPropertyChangeListener(const OUString&                                            sProperty,
+                                                           const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener)
+    throw(css::beans::UnknownPropertyException,
+          css::lang::WrappedTargetException   ,
+          css::uno::RuntimeException, std::exception          )
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_HARDEXCEPTIONS);
+
+    // SAFE ->
+    SolarMutexClearableGuard aReadLock;
+
+    TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
+    if (pIt == m_lProps.end())
+        throw css::beans::UnknownPropertyException();
+
+    aReadLock.clear();
+    // <- SAFE
+
+    m_lSimpleChangeListener.addInterface(sProperty, xListener);
+}
+
+void SAL_CALL Frame::removePropertyChangeListener(const OUString&                                            sProperty,
+                                                              const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener)
+    throw(css::beans::UnknownPropertyException,
+          css::lang::WrappedTargetException   ,
+          css::uno::RuntimeException, std::exception          )
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_SOFTEXCEPTIONS);
+
+    // SAFE ->
+    SolarMutexClearableGuard aReadLock;
+
+    TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
+    if (pIt == m_lProps.end())
+        throw css::beans::UnknownPropertyException();
+
+    aReadLock.clear();
+    // <- SAFE
+
+    m_lSimpleChangeListener.removeInterface(sProperty, xListener);
+}
+
+void SAL_CALL Frame::addVetoableChangeListener(const OUString&                                            sProperty,
+                                                           const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener)
+    throw(css::beans::UnknownPropertyException,
+          css::lang::WrappedTargetException   ,
+          css::uno::RuntimeException, std::exception          )
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_HARDEXCEPTIONS);
+
+    // SAFE ->
+    SolarMutexClearableGuard aReadLock;
+
+    TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
+    if (pIt == m_lProps.end())
+        throw css::beans::UnknownPropertyException();
+
+    aReadLock.clear();
+    // <- SAFE
+
+    m_lVetoChangeListener.addInterface(sProperty, xListener);
+}
+
+void SAL_CALL Frame::removeVetoableChangeListener(const OUString&                                            sProperty,
+                                                              const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener)
+    throw(css::beans::UnknownPropertyException,
+          css::lang::WrappedTargetException   ,
+          css::uno::RuntimeException, std::exception          )
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_SOFTEXCEPTIONS);
+
+    // SAFE ->
+    SolarMutexClearableGuard aReadLock;
+
+    TPropInfoHash::const_iterator pIt = m_lProps.find(sProperty);
+    if (pIt == m_lProps.end())
+        throw css::beans::UnknownPropertyException();
+
+    aReadLock.clear();
+    // <- SAFE
+
+    m_lVetoChangeListener.removeInterface(sProperty, xListener);
+}
+
+css::uno::Sequence< css::beans::Property > SAL_CALL Frame::getProperties()
+    throw(css::uno::RuntimeException, std::exception)
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_HARDEXCEPTIONS);
+
+    SolarMutexGuard g;
+
+    sal_Int32                                        c     = (sal_Int32)m_lProps.size();
+    css::uno::Sequence< css::beans::Property >       lProps(c);
+    TPropInfoHash::const_iterator pIt;
+
+    for (  pIt  = m_lProps.begin();
+           pIt != m_lProps.end();
+         ++pIt                    )
+    {
+        lProps[--c] = pIt->second;
+    }
+
+    return lProps;
+}
+
+css::beans::Property SAL_CALL Frame::getPropertyByName(const OUString& sName)
+    throw(css::beans::UnknownPropertyException,
+          css::uno::RuntimeException, std::exception          )
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_HARDEXCEPTIONS);
+
+    SolarMutexGuard g;
+
+    TPropInfoHash::const_iterator pIt = m_lProps.find(sName);
+    if (pIt == m_lProps.end())
+        throw css::beans::UnknownPropertyException();
+
+    return pIt->second;
+}
+
+sal_Bool SAL_CALL Frame::hasPropertyByName(const OUString& sName)
+    throw(css::uno::RuntimeException, std::exception)
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_HARDEXCEPTIONS);
+
+    SolarMutexGuard g;
+
+    TPropInfoHash::iterator pIt    = m_lProps.find(sName);
+    bool                                   bExist = (pIt != m_lProps.end());
+
+    return bExist;
+}
+
 /*-****************************************************************************************************/
 void Frame::implts_forgetSubFrames()
 {
@@ -2680,7 +2978,6 @@ void SAL_CALL Frame::impl_setPropertyValue(const OUString& /*sProperty*/,
 {
     /* There is no need to lock any mutex here. Because we share the
        solar mutex with our base class. And we said to our base class: "don't release it on calling us" .-)
-       see ctor of PropertySetHelper for further information.
     */
 
     /* Attention: You can use nHandle only, if you are sure that all supported
@@ -2737,7 +3034,6 @@ css::uno::Any SAL_CALL Frame::impl_getPropertyValue(const OUString& /*sProperty*
 {
     /* There is no need to lock any mutex here. Because we share the
        solar mutex with our base class. And we said to our base class: "don't release it on calling us" .-)
-       see ctor of PropertySetHelper for further information.
     */
 
     /* Attention: You can use nHandle only, if you are sure that all supported
@@ -2778,6 +3074,97 @@ css::uno::Any SAL_CALL Frame::impl_getPropertyValue(const OUString& /*sProperty*
     return aValue;
 }
 
+void Frame::impl_setPropertyChangeBroadcaster(const css::uno::Reference< css::uno::XInterface >& xBroadcaster)
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_SOFTEXCEPTIONS);
+
+    SolarMutexGuard g;
+    m_xBroadcaster = xBroadcaster;
+}
+
+void SAL_CALL Frame::impl_addPropertyInfo(const css::beans::Property& aProperty)
+    throw(css::beans::PropertyExistException,
+          css::uno::Exception               )
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_SOFTEXCEPTIONS);
+
+    SolarMutexGuard g;
+
+    TPropInfoHash::const_iterator pIt = m_lProps.find(aProperty.Name);
+    if (pIt != m_lProps.end())
+        throw css::beans::PropertyExistException();
+
+    m_lProps[aProperty.Name] = aProperty;
+}
+
+void SAL_CALL Frame::impl_disablePropertySet()
+{
+    TransactionGuard aTransaction(m_aTransactionManager, E_SOFTEXCEPTIONS);
+
+    SolarMutexGuard g;
+
+    css::uno::Reference< css::uno::XInterface > xThis(static_cast< css::beans::XPropertySet* >(this), css::uno::UNO_QUERY);
+    css::lang::EventObject aEvent(xThis);
+
+    m_lSimpleChangeListener.disposeAndClear(aEvent);
+    m_lVetoChangeListener.disposeAndClear(aEvent);
+    m_lProps.free();
+}
+
+bool Frame::impl_existsVeto(const css::beans::PropertyChangeEvent& aEvent)
+{
+    /*  Don't use the lock here!
+        The used helper is threadsafe and it lives for the whole lifetime of
+        our own object.
+    */
+    ::cppu::OInterfaceContainerHelper* pVetoListener = m_lVetoChangeListener.getContainer(aEvent.PropertyName);
+    if (! pVetoListener)
+        return false;
+
+    ::cppu::OInterfaceIteratorHelper pListener(*pVetoListener);
+    while (pListener.hasMoreElements())
+    {
+        try
+        {
+            css::uno::Reference< css::beans::XVetoableChangeListener > xListener(
+                static_cast<css::beans::XVetoableChangeListener*>(pListener.next()),
+                css::uno::UNO_QUERY_THROW);
+            xListener->vetoableChange(aEvent);
+        }
+        catch(const css::uno::RuntimeException&)
+            { pListener.remove(); }
+        catch(const css::beans::PropertyVetoException&)
+            { return true; }
+    }
+
+    return false;
+}
+
+void Frame::impl_notifyChangeListener(const css::beans::PropertyChangeEvent& aEvent)
+{
+    /*  Don't use the lock here!
+        The used helper is threadsafe and it lives for the whole lifetime of
+        our own object.
+    */
+    ::cppu::OInterfaceContainerHelper* pSimpleListener = m_lSimpleChangeListener.getContainer(aEvent.PropertyName);
+    if (! pSimpleListener)
+        return;
+
+    ::cppu::OInterfaceIteratorHelper pListener(*pSimpleListener);
+    while (pListener.hasMoreElements())
+    {
+        try
+        {
+            css::uno::Reference< css::beans::XPropertyChangeListener > xListener(
+                static_cast<css::beans::XVetoableChangeListener*>(pListener.next()),
+                css::uno::UNO_QUERY_THROW);
+            xListener->propertyChange(aEvent);
+        }
+        catch(const css::uno::RuntimeException&)
+            { pListener.remove(); }
+    }
+}
+
 /*-****************************************************************************************************
     @short      dispose old container window and forget his reference
     @descr      Sometimes we must repair our "modal dialog parent mechanism" too!


More information about the Libreoffice-commits mailing list