| /************************************************************** | |
| * | |
| * 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. | |
| * | |
| *************************************************************/ | |
| #ifndef _FRM_GROUPMANAGER_HXX_ | |
| #define _FRM_GROUPMANAGER_HXX_ | |
| #include <com/sun/star/sdbc/XRowSet.hpp> | |
| #include <com/sun/star/awt/XControlModel.hpp> | |
| #include <com/sun/star/beans/XPropertySet.hpp> | |
| #include <com/sun/star/beans/XPropertyChangeListener.hpp> | |
| #include <com/sun/star/container/XContainerListener.hpp> | |
| #include <com/sun/star/container/XContainer.hpp> | |
| #include <comphelper/stl_types.hxx> | |
| #include <cppuhelper/implbase2.hxx> | |
| #include <comphelper/stl_types.hxx> | |
| #include <comphelper/types.hxx> | |
| using namespace comphelper; | |
| /*======================================================================== | |
| Funktionsweise GroupManager: | |
| Der GroupManager horcht an der starform, ob FormComponents eingefuegt oder entfernt | |
| werden. Zusaetzlich horcht er bei den FormComponents an den Properties | |
| "Name" und "TabIndex". Mit diesen Infos aktualisiert er seine Gruppen. | |
| Der GroupManager verwaltet eine Gruppe, in der alle Controls nach TabIndex | |
| geordnet sind, und ein Array von Gruppen, in dem jede FormComponent noch | |
| einmal einer Gruppe dem Namen nach zugeordnet wird. | |
| Die einzelnen Gruppen werden ueber eine Map aktiviert, wenn sie mehr als | |
| ein Element besitzen. | |
| Die Gruppen verwalten intern die FormComponents in zwei Arrays. In dem | |
| GroupCompArray werden die Components nach TabIndex und Einfuegepostion | |
| sortiert. Da auf dieses Array ueber die FormComponent zugegriffen | |
| wird, gibt es noch das GroupCompAccessArray, in dem die FormComponents | |
| nach ihrer Speicheradresse sortiert sind. Jedes Element des | |
| GroupCompAccessArrays ist mit einem Element des GroupCompArrays verpointert. | |
| ========================================================================*/ | |
| //......................................................................... | |
| namespace frm | |
| { | |
| //......................................................................... | |
| //======================================================================== | |
| template <class ELEMENT, class LESS_COMPARE> | |
| sal_Int32 insert_sorted(::std::vector<ELEMENT>& _rArray, const ELEMENT& _rNewElement, const LESS_COMPARE& _rCompareOp) | |
| { | |
| typename ::std::vector<ELEMENT>::iterator aInsertPos = lower_bound( | |
| _rArray.begin(), | |
| _rArray.end(), | |
| _rNewElement, | |
| _rCompareOp | |
| ); | |
| aInsertPos = _rArray.insert(aInsertPos, _rNewElement); | |
| return aInsertPos - _rArray.begin(); | |
| } | |
| template <class ELEMENT, class LESS_COMPARE> | |
| sal_Bool seek_entry(const ::std::vector<ELEMENT>& _rArray, const ELEMENT& _rNewElement, sal_Int32& nPos, const LESS_COMPARE& _rCompareOp) | |
| { | |
| typename ::std::vector<ELEMENT>::const_iterator aExistentPos = lower_bound( | |
| _rArray.begin(), | |
| _rArray.end(), | |
| _rNewElement, | |
| _rCompareOp | |
| ); | |
| if ((aExistentPos != _rArray.end()) && (*aExistentPos == _rNewElement)) | |
| { // we have a valid "lower or equal" element and it's really "equal" | |
| nPos = aExistentPos - _rArray.begin(); | |
| return sal_True; | |
| } | |
| nPos = -1; | |
| return sal_False; | |
| } | |
| //======================================================================== | |
| class OGroupComp | |
| { | |
| ::rtl::OUString m_aName; | |
| ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xComponent; | |
| ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> m_xControlModel; | |
| sal_Int32 m_nPos; | |
| sal_Int16 m_nTabIndex; | |
| friend class OGroupCompLess; | |
| public: | |
| OGroupComp(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement, sal_Int32 nInsertPos ); | |
| OGroupComp(const OGroupComp& _rSource); | |
| OGroupComp(); | |
| sal_Bool operator==( const OGroupComp& rComp ) const; | |
| inline const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& GetComponent() const { return m_xComponent; } | |
| inline const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel>& GetControlModel() const { return m_xControlModel; } | |
| sal_Int32 GetPos() const { return m_nPos; } | |
| sal_Int16 GetTabIndex() const { return m_nTabIndex; } | |
| ::rtl::OUString GetName() const { return m_aName; } | |
| }; | |
| DECLARE_STL_VECTOR(OGroupComp, OGroupCompArr); | |
| //======================================================================== | |
| class OGroupComp; | |
| class OGroupCompAcc | |
| { | |
| ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xComponent; | |
| OGroupComp m_aGroupComp; | |
| friend class OGroupCompAccLess; | |
| public: | |
| OGroupCompAcc(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement, const OGroupComp& _rGroupComp ); | |
| sal_Bool operator==( const OGroupCompAcc& rCompAcc ) const; | |
| inline const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& GetComponent() const { return m_xComponent; } | |
| const OGroupComp& GetGroupComponent() const { return m_aGroupComp; } | |
| }; | |
| DECLARE_STL_VECTOR(OGroupCompAcc, OGroupCompAccArr); | |
| //======================================================================== | |
| class OGroup | |
| { | |
| OGroupCompArr m_aCompArray; | |
| OGroupCompAccArr m_aCompAccArray; | |
| ::rtl::OUString m_aGroupName; | |
| sal_uInt16 m_nInsertPos; // Die Einfugeposition der GroupComps wird von der Gruppe bestimmt. | |
| friend class OGroupLess; | |
| public: | |
| OGroup( const ::rtl::OUString& rGroupName ); | |
| #ifdef DBG_UTIL | |
| OGroup( const OGroup& _rSource ); // just to ensure the DBG_CTOR call | |
| #endif | |
| virtual ~OGroup(); | |
| sal_Bool operator==( const OGroup& rGroup ) const; | |
| ::rtl::OUString GetGroupName() const { return m_aGroupName; } | |
| ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> > GetControlModels() const; | |
| void InsertComponent( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement ); | |
| void RemoveComponent( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement ); | |
| sal_uInt16 Count() const { return sal::static_int_cast< sal_uInt16 >(m_aCompArray.size()); } | |
| const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& GetObject( sal_uInt16 nP ) const | |
| { return m_aCompArray[nP].GetComponent(); } | |
| }; | |
| DECLARE_STL_USTRINGACCESS_MAP(OGroup, OGroupArr); | |
| DECLARE_STL_VECTOR(OGroupArr::iterator, OActiveGroups); | |
| //======================================================================== | |
| class OGroupManager : public ::cppu::WeakImplHelper2< ::com::sun::star::beans::XPropertyChangeListener, ::com::sun::star::container::XContainerListener> | |
| { | |
| OGroup* m_pCompGroup; // Alle Components nach TabIndizes sortiert | |
| OGroupArr m_aGroupArr; // Alle Components nach Gruppen sortiert | |
| OActiveGroups m_aActiveGroupMap; // In dieser Map werden die Indizes aller Gruppen gehalten, | |
| // die mehr als 1 Element haben | |
| ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer > | |
| m_xContainer; | |
| // Helper functions | |
| void InsertElement( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement ); | |
| void RemoveElement( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement ); | |
| void removeFromGroupMap(const ::rtl::OUString& _sGroupName,const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xSet); | |
| public: | |
| OGroupManager(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer >& _rxContainer); | |
| virtual ~OGroupManager(); | |
| // ::com::sun::star::lang::XEventListener | |
| virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& _rSource) throw(::com::sun::star::uno::RuntimeException); | |
| // ::com::sun::star::beans::XPropertyChangeListener | |
| virtual void SAL_CALL propertyChange(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw ( ::com::sun::star::uno::RuntimeException); | |
| // ::com::sun::star::container::XContainerListener | |
| virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& _rEvent) throw ( ::com::sun::star::uno::RuntimeException); | |
| virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& _rEvent) throw ( ::com::sun::star::uno::RuntimeException); | |
| virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& _rEvent) throw ( ::com::sun::star::uno::RuntimeException); | |
| // Other functions | |
| sal_Int32 getGroupCount(); | |
| void getGroup(sal_Int32 nGroup, ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> >& _rGroup, ::rtl::OUString& Name); | |
| void getGroupByName(const ::rtl::OUString& Name, ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> >& _rGroup); | |
| ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> > getControlModels(); | |
| }; | |
| //......................................................................... | |
| } // namespace frm | |
| //......................................................................... | |
| #endif // _FRM_GROUPMANAGER_HXX_ | |