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