Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef _FRM_GROUPMANAGER_HXX_
21 : #define _FRM_GROUPMANAGER_HXX_
22 :
23 : #include <com/sun/star/sdbc/XRowSet.hpp>
24 : #include <com/sun/star/awt/XControlModel.hpp>
25 : #include <com/sun/star/beans/XPropertySet.hpp>
26 : #include <com/sun/star/beans/XPropertyChangeListener.hpp>
27 : #include <com/sun/star/container/XContainerListener.hpp>
28 : #include <com/sun/star/container/XContainer.hpp>
29 : #include <cppuhelper/implbase2.hxx>
30 : #include <comphelper/stl_types.hxx>
31 : #include <comphelper/types.hxx>
32 :
33 : #include <algorithm>
34 :
35 : using namespace comphelper;
36 :
37 : /*========================================================================
38 : Funktionsweise GroupManager:
39 :
40 : Der GroupManager horcht an der starform, ob FormComponents eingefuegt oder entfernt
41 : werden. Zusaetzlich horcht er bei den FormComponents an den Properties
42 : "Name" und "TabIndex". Mit diesen Infos aktualisiert er seine Gruppen.
43 :
44 : Der GroupManager verwaltet eine Gruppe, in der alle Controls nach TabIndex
45 : geordnet sind, und ein Array von Gruppen, in dem jede FormComponent noch
46 : einmal einer Gruppe dem Namen nach zugeordnet wird.
47 : Die einzelnen Gruppen werden ueber eine Map aktiviert, wenn sie mehr als
48 : ein Element besitzen.
49 :
50 : Die Gruppen verwalten intern die FormComponents in zwei Arrays. In dem
51 : GroupCompArray werden die Components nach TabIndex und Einfuegepostion
52 : sortiert. Da auf dieses Array ueber die FormComponent zugegriffen
53 : wird, gibt es noch das GroupCompAccessArray, in dem die FormComponents
54 : nach ihrer Speicheradresse sortiert sind. Jedes Element des
55 : GroupCompAccessArrays ist mit einem Element des GroupCompArrays verpointert.
56 :
57 : ========================================================================*/
58 :
59 : //.........................................................................
60 : namespace frm
61 : {
62 : //.........................................................................
63 :
64 : //========================================================================
65 : template <class ELEMENT, class LESS_COMPARE>
66 48 : sal_Int32 insert_sorted(::std::vector<ELEMENT>& _rArray, const ELEMENT& _rNewElement, const LESS_COMPARE& _rCompareOp)
67 : {
68 : typename ::std::vector<ELEMENT>::iterator aInsertPos = ::std::lower_bound(
69 : _rArray.begin(),
70 : _rArray.end(),
71 : _rNewElement,
72 : _rCompareOp
73 48 : );
74 48 : aInsertPos = _rArray.insert(aInsertPos, _rNewElement);
75 48 : return aInsertPos - _rArray.begin();
76 : }
77 :
78 : template <class ELEMENT, class LESS_COMPARE>
79 8 : sal_Bool seek_entry(const ::std::vector<ELEMENT>& _rArray, const ELEMENT& _rNewElement, sal_Int32& nPos, const LESS_COMPARE& _rCompareOp)
80 : {
81 : typename ::std::vector<ELEMENT>::const_iterator aExistentPos = ::std::lower_bound(
82 : _rArray.begin(),
83 : _rArray.end(),
84 : _rNewElement,
85 : _rCompareOp
86 8 : );
87 8 : if ((aExistentPos != _rArray.end()) && (*aExistentPos == _rNewElement))
88 : { // we have a valid "lower or equal" element and it's really "equal"
89 8 : nPos = aExistentPos - _rArray.begin();
90 8 : return sal_True;
91 : }
92 0 : nPos = -1;
93 0 : return sal_False;
94 : }
95 :
96 : //========================================================================
97 143 : class OGroupComp
98 : {
99 : ::rtl::OUString m_aName;
100 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xComponent;
101 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> m_xControlModel;
102 : sal_Int32 m_nPos;
103 : sal_Int16 m_nTabIndex;
104 :
105 : friend class OGroupCompLess;
106 :
107 : public:
108 : OGroupComp(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement, sal_Int32 nInsertPos );
109 : OGroupComp(const OGroupComp& _rSource);
110 : OGroupComp();
111 :
112 : sal_Bool operator==( const OGroupComp& rComp ) const;
113 :
114 0 : inline const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& GetComponent() const { return m_xComponent; }
115 9 : inline const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel>& GetControlModel() const { return m_xControlModel; }
116 :
117 29 : sal_Int32 GetPos() const { return m_nPos; }
118 29 : sal_Int16 GetTabIndex() const { return m_nTabIndex; }
119 : ::rtl::OUString GetName() const { return m_aName; }
120 : };
121 :
122 : DECLARE_STL_VECTOR(OGroupComp, OGroupCompArr);
123 :
124 : //========================================================================
125 : class OGroupComp;
126 123 : class OGroupCompAcc
127 : {
128 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xComponent;
129 :
130 : OGroupComp m_aGroupComp;
131 :
132 : friend class OGroupCompAccLess;
133 :
134 : public:
135 : OGroupCompAcc(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement, const OGroupComp& _rGroupComp );
136 :
137 : sal_Bool operator==( const OGroupCompAcc& rCompAcc ) const;
138 :
139 4 : inline const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& GetComponent() const { return m_xComponent; }
140 4 : const OGroupComp& GetGroupComponent() const { return m_aGroupComp; }
141 : };
142 :
143 : DECLARE_STL_VECTOR(OGroupCompAcc, OGroupCompAccArr);
144 :
145 : //========================================================================
146 12 : class OGroup
147 : {
148 : OGroupCompArr m_aCompArray;
149 : OGroupCompAccArr m_aCompAccArray;
150 :
151 : ::rtl::OUString m_aGroupName;
152 : sal_uInt16 m_nInsertPos; // Die Einfugeposition der GroupComps wird von der Gruppe bestimmt.
153 :
154 : friend class OGroupLess;
155 :
156 : public:
157 : OGroup( const ::rtl::OUString& rGroupName );
158 : #ifdef DBG_UTIL
159 : OGroup( const OGroup& _rSource ); // just to ensure the DBG_CTOR call
160 : #endif
161 : virtual ~OGroup();
162 :
163 : sal_Bool operator==( const OGroup& rGroup ) const;
164 :
165 0 : ::rtl::OUString GetGroupName() const { return m_aGroupName; }
166 : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> > GetControlModels() const;
167 :
168 : void InsertComponent( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement );
169 : void RemoveComponent( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement );
170 26 : sal_uInt16 Count() const { return sal::static_int_cast< sal_uInt16 >(m_aCompArray.size()); }
171 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& GetObject( sal_uInt16 nP ) const
172 0 : { return m_aCompArray[nP].GetComponent(); }
173 : };
174 :
175 : DECLARE_STL_USTRINGACCESS_MAP(OGroup, OGroupArr);
176 : DECLARE_STL_VECTOR(OGroupArr::iterator, OActiveGroups);
177 :
178 : //========================================================================
179 : class OGroupManager : public ::cppu::WeakImplHelper2< ::com::sun::star::beans::XPropertyChangeListener, ::com::sun::star::container::XContainerListener>
180 : {
181 : OGroup* m_pCompGroup; // Alle Components nach TabIndizes sortiert
182 : OGroupArr m_aGroupArr; // Alle Components nach Gruppen sortiert
183 : OActiveGroups m_aActiveGroupMap; // In dieser Map werden die Indizes aller Gruppen gehalten,
184 : // die mehr als 1 Element haben
185 :
186 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer >
187 : m_xContainer;
188 :
189 : // Helper functions
190 : void InsertElement( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement );
191 : void RemoveElement( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& rxElement );
192 : void removeFromGroupMap(const ::rtl::OUString& _sGroupName,const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xSet);
193 :
194 : public:
195 : OGroupManager(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer >& _rxContainer);
196 : virtual ~OGroupManager();
197 :
198 : // ::com::sun::star::lang::XEventListener
199 : virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& _rSource) throw(::com::sun::star::uno::RuntimeException);
200 :
201 : // ::com::sun::star::beans::XPropertyChangeListener
202 : virtual void SAL_CALL propertyChange(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw ( ::com::sun::star::uno::RuntimeException);
203 :
204 : // ::com::sun::star::container::XContainerListener
205 : virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& _rEvent) throw ( ::com::sun::star::uno::RuntimeException);
206 : virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& _rEvent) throw ( ::com::sun::star::uno::RuntimeException);
207 : virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& _rEvent) throw ( ::com::sun::star::uno::RuntimeException);
208 :
209 : // Other functions
210 : sal_Int32 getGroupCount();
211 : void getGroup(sal_Int32 nGroup, ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> >& _rGroup, ::rtl::OUString& Name);
212 : void getGroupByName(const ::rtl::OUString& Name, ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> >& _rGroup);
213 : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel> > getControlModels();
214 :
215 : static ::rtl::OUString GetGroupName( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> xComponent );
216 : };
217 :
218 :
219 : //.........................................................................
220 : } // namespace frm
221 : //.........................................................................
222 :
223 : #endif // _FRM_GROUPMANAGER_HXX_
224 :
225 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|