xref: /aoo42x/main/svtools/inc/svtools/treelist.hxx (revision 2bfcd321)
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 _SVTREELIST_HXX
25 #define _SVTREELIST_HXX
26 
27 #include "svtools/svtdllapi.h"
28 #include <tools/solar.h>
29 #include <tools/list.hxx>
30 
31 #ifndef _TABLE_HXX
32 #include <tools/table.hxx>
33 #endif
34 #include <tools/link.hxx>
35 #include <tools/string.hxx>
36 #include <tools/debug.hxx>
37 
38 #define LISTACTION_INSERTED			1
39 #define LISTACTION_REMOVING         2
40 #define LISTACTION_REMOVED          3
41 #define LISTACTION_MOVING			4
42 #define LISTACTION_MOVED			5
43 #define LISTACTION_CLEARING 		6
44 #define LISTACTION_INSERTED_TREE	7
45 #define LISTACTION_INVALIDATE_ENTRY	8
46 #define LISTACTION_RESORTING		9
47 #define LISTACTION_RESORTED			10
48 #define LISTACTION_CLEARED			11
49 
50 #define SV_TREELIST_ROOT_ENTRY  (SvListEntry*)0
51 #define SV_TREELIST_ERROR		 0xFFFFFFFF
52 
53 // Entryflags, die an der View haengen
54 #define SVLISTENTRYFLAG_SELECTED		0x0001
55 #define SVLISTENTRYFLAG_EXPANDED		0x0002
56 #define SVLISTENTRYFLAG_FOCUSED			0x0004
57 #define SVLISTENTRYFLAG_CURSORED		0x0008
58 #define SVLISTENTRYFLAG_NOT_SELECTABLE	0x0010
59 // IAccessible2 implementation
60 #define SVLISTENTRYFLAG_OBJSELECTED	0x0040
61 
62 class SvListEntry;
63 
64 class SvTreeEntryList : public List // SvEntryListStd
65 {
66 public:
67 	SvTreeEntryList(sal_uInt16 nInitPos=16, sal_uInt16 nResize=16 )
68 			: List( nInitPos, nResize )
69 	{}
70 	SvTreeEntryList(sal_uInt16 BlockSize, sal_uInt16 InitSize, sal_uInt16 Resize )
71 		: List(BlockSize, InitSize, Resize )
72 	{}
73 
74 	void DestroyAll();
75 };
76 
77 class SVT_DLLPUBLIC SvListEntry
78 {
79 friend class SvTreeList;
80 friend class SvListView;
81 
82 private:
83 	SvListEntry*		pParent;
84 	SvTreeEntryList*	pChilds;
85 	sal_uLong				nAbsPos;
86 	sal_uLong				nListPos;
87 
88 	void				SetListPositions();
89 	void				InvalidateChildrensListPositions()
90 						{
91 							nListPos |= 0x80000000;
92 						}
93 public:
94 						SvListEntry();
95 						SvListEntry( const SvListEntry& );
96 	virtual				~SvListEntry();
97 	sal_Bool				HasChilds() { return (sal_Bool)(pChilds!=0); }
98 	sal_Bool				HasChildListPos() const
99 	{
100 		if( pParent && !(pParent->nListPos & 0x80000000) )
101 			return sal_True;
102 		else return sal_False;
103 	}
104 	sal_uLong				GetChildListPos() const
105 	{
106 		if( pParent && (pParent->nListPos & 0x80000000) )
107 			pParent->SetListPositions();
108 		return ( nListPos & 0x7fffffff );
109 	}
110 	virtual void 		Clone( SvListEntry* pSource );
111 };
112 
113 class SvListView;
114 
115 class SvViewData
116 {
117 friend class SvTreeList;
118 friend class SvListView;
119 
120 	sal_uLong		nVisPos;
121 protected:
122 	sal_uInt16 		nFlags;
123 public:
124 	SvViewData();
125 	SvViewData( const SvViewData& );
126 	virtual ~SvViewData();
127 
128 	sal_Bool IsSelected() const { return (sal_Bool)(nFlags&SVLISTENTRYFLAG_SELECTED)!=0; }
129 	sal_Bool IsExpanded() const { return (sal_Bool)(nFlags&SVLISTENTRYFLAG_EXPANDED)!=0; }
130 	sal_Bool HasFocus() const { return (sal_Bool)(nFlags&SVLISTENTRYFLAG_FOCUSED)!=0; }
131 	void SetFocus( sal_Bool bFocus)
132 	{
133 		if ( !bFocus )
134 			nFlags &= (~SVLISTENTRYFLAG_FOCUSED);
135 		else
136 			nFlags |= SVLISTENTRYFLAG_FOCUSED;
137 	}
138 	sal_Bool IsCursored() const { return (sal_Bool)(nFlags&SVLISTENTRYFLAG_CURSORED)!=0; }
139 	void SetCursored( sal_Bool bCursored )
140 	{
141 		if ( !bCursored )
142 			nFlags &= (~SVLISTENTRYFLAG_CURSORED);
143 		else
144 			nFlags |= SVLISTENTRYFLAG_CURSORED;
145 	}
146 
147 	sal_uInt16 GetFlags() const { return nFlags; }
148 
149 	void SetSelectable( bool bSelectable )
150 	{
151 		if( bSelectable )
152 			nFlags &= (~SVLISTENTRYFLAG_NOT_SELECTABLE);
153 		else
154 			nFlags |= SVLISTENTRYFLAG_NOT_SELECTABLE;
155 	}
156 	bool IsSelectable() const { return (bool)(nFlags&SVLISTENTRYFLAG_NOT_SELECTABLE)==0; }
157 	// IAccessible2 implementation
158 	void SetObjectSelected(sal_Bool bSelected)
159 	{
160 	if ( !bSelected )
161 		nFlags &= (~SVLISTENTRYFLAG_OBJSELECTED);
162 	else
163 		nFlags |= SVLISTENTRYFLAG_OBJSELECTED;
164 	}
165 };
166 
167 enum SvSortMode { SortAscending, SortDescending, SortNone };
168 
169 // Rueckgabewerte Sortlink:
170 // siehe International::Compare( pLeft, pRight )
171 // ( Compare(a,b) ==> b.Compare(a) ==> strcmp(a,b) )
172 struct SvSortData
173 {
174 	SvListEntry* pLeft;
175 	SvListEntry* pRight;
176 };
177 
178 class SVT_DLLPUBLIC SvTreeList
179 {
180 	friend class SvListView;
181 
182 	List			aViewList;
183 	sal_uLong           nEntryCount;
184 
185 	Link			aCloneLink;
186 	Link			aCompareLink;
187 	SvSortMode		eSortMode;
188 
189 	sal_uInt16			nRefCount;
190 
191 	sal_Bool			bAbsPositionsValid;
192 
193 	SvListEntry*    FirstVisible() const { return First(); }
194 	SvListEntry*    NextVisible( const SvListView*,SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const;
195 	SvListEntry*	PrevVisible( const SvListView*,SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const;
196 	SvListEntry*	LastVisible( const SvListView*,sal_uInt16* pDepth=0 ) const;
197 	SvListEntry*	NextVisible( const SvListView*,SvListEntry* pEntry, sal_uInt16& rDelta ) const;
198 	SvListEntry*	PrevVisible( const SvListView*,SvListEntry* pEntry, sal_uInt16& rDelta ) const;
199 
200 	sal_Bool			IsEntryVisible( const SvListView*,SvListEntry* pEntry ) const;
201 	SvListEntry*	GetEntryAtVisPos( const SvListView*,sal_uLong nVisPos ) const;
202 	sal_uLong			GetVisiblePos( const SvListView*,SvListEntry* pEntry ) const;
203 	sal_uLong			GetVisibleCount( const SvListView* ) const;
204 	sal_uLong			GetVisibleChildCount( const SvListView*,SvListEntry* pParent ) const;
205 
206 	SvListEntry*    FirstSelected( const SvListView*) const;
207 	SvListEntry*    NextSelected( const SvListView*,SvListEntry* pEntry ) const;
208 	SvListEntry*	PrevSelected( const SvListView*,SvListEntry* pEntry ) const;
209 	SvListEntry*	LastSelected( const SvListView*) const;
210 
211 	sal_Bool            Select( SvListView*,SvListEntry* pEntry, sal_Bool bSelect=sal_True );
212 	sal_uLong			SelectChilds( SvListView*,SvListEntry* pParent, sal_Bool bSelect );
213 	void			SelectAll( SvListView*,sal_Bool bSelect ); // ruft nicht Select-Hdl
214 	sal_uLong			GetChildSelectionCount( const SvListView*,SvListEntry* pParent ) const;
215 
216 	void            Expand( SvListView*,SvListEntry* pParent );
217 	void            Collapse( SvListView*,SvListEntry* pParent );
218 
219 //#if 0 // _SOLAR__PRIVATE
220 	SVT_DLLPRIVATE void 			SetAbsolutePositions();
221 	SVT_DLLPRIVATE SvTreeEntryList*CloneChilds( SvTreeEntryList* pChilds,
222 								 SvListEntry* pNewParent,
223 								 sal_uLong& nCloneCount ) const;
224 	SVT_DLLPRIVATE void			SetListPositions( SvTreeEntryList* );
225 
226 	// rPos wird bei SortModeNone nicht geaendert
227 	SVT_DLLPRIVATE void			GetInsertionPos( SvListEntry* pEntry, SvListEntry* pParent,
228 						sal_uLong& rPos );
229 	SVT_DLLPRIVATE void			ResortChilds( SvListEntry* pParent );
230 //#endif /* _SOLAR__PRIVATE */
231 
232 protected:
233 
234 	SvListEntry*      pRootItem;
235 
236 public:
237 
238 	SvTreeList();
239 	virtual ~SvTreeList();
240 
241 	void			InsertView( SvListView* );
242 	void			RemoveView( SvListView* );
243 	sal_uLong			GetViewCount() const { return aViewList.Count(); }
244 	SvListView*		GetView(sal_uLong nPos) const {return (SvListView*)aViewList.GetObject(nPos);}
245 	void			Broadcast( sal_uInt16 nActionId, SvListEntry* pEntry1=0,
246 						SvListEntry* pEntry2=0, sal_uLong nPos=0 );
247 	// informiert alle Listener
248 	void			InvalidateEntry( SvListEntry* );
249 
250 	sal_uLong			GetEntryCount() const { return nEntryCount; }
251 	SvListEntry*    First() const;
252 	SvListEntry*    Next( SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const;
253 	SvListEntry*	Prev( SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const;
254 	SvListEntry*	Last( sal_uInt16* pDepth=0 ) const;
255 
256 	SvListEntry*	FirstChild( SvListEntry* pParent ) const;
257 	SvListEntry*	NextSibling( SvListEntry* pEntry ) const;
258 	SvListEntry*	PrevSibling( SvListEntry* pEntry ) const;
259 	SvListEntry*	LastSibling( SvListEntry* pEntry ) const;
260 
261 	sal_uLong			Insert( SvListEntry* pEntry,SvListEntry* pPar,sal_uLong nPos=LIST_APPEND);
262 	sal_uLong			Insert( SvListEntry* pEntry,sal_uLong nRootPos = LIST_APPEND ) { return Insert(pEntry, pRootItem, nRootPos ); }
263 	void			InsertTree( SvListEntry* pTree, SvListEntry* pTarget );
264 	void			InsertTree( SvListEntry* pTree, SvListEntry* pTargetParent,
265 								sal_uLong nListPos );
266 	// Entries muessen im gleichen Model stehen!
267 	void            Move( SvListEntry* pSource, SvListEntry* pTarget );
268 	// erzeugt ggf. Child-List
269 	sal_uLong   		Move( SvListEntry* pSource, SvListEntry* pTargetParent,
270 						  sal_uLong nListPos);
271 	void			Copy( SvListEntry* pSource, SvListEntry* pTarget );
272 	sal_uLong   		Copy( SvListEntry* pSource, SvListEntry* pTargetParent,
273 						  sal_uLong nListPos);
274 
275 	sal_Bool            Remove( SvListEntry* pEntry );
276 	void            Clear();
277 
278 	sal_Bool			HasChilds( SvListEntry* pEntry ) const;
279 	sal_Bool			HasParent( SvListEntry* pEntry ) const 	{ return (sal_Bool)(pEntry->pParent!=pRootItem); }
280 	sal_Bool			IsChild( SvListEntry* pParent, SvListEntry* pChild ) const;
281 	sal_Bool			IsInChildList( SvListEntry* pParent, SvListEntry* pChild) const;
282 	SvListEntry*	GetEntry( SvListEntry* pParent, sal_uLong nPos ) const;
283 	SvListEntry*	GetEntry( sal_uLong nRootPos ) const;
284 	SvListEntry*	GetEntryAtAbsPos( sal_uLong nAbsPos ) const;
285 	SvListEntry*	GetParent( SvListEntry* pEntry ) const;
286 	SvListEntry*	GetRootLevelParent( SvListEntry* pEntry ) const;
287 	SvTreeEntryList* GetChildList( SvListEntry* pParent ) const;
288 
289 	sal_uLong			GetAbsPos( SvListEntry* pEntry ) const;
290 	sal_uLong			GetRelPos( SvListEntry* pChild ) const { return pChild->GetChildListPos(); }
291 	sal_uLong			GetChildCount( SvListEntry* pParent ) const;
292 	sal_uInt16          GetDepth( SvListEntry* pEntry ) const;
293 	sal_Bool			IsAtRootDepth( SvListEntry* pEntry ) const { return (sal_Bool)(pEntry->pParent==pRootItem); }
294 
295 	// das Model ruft zum Clonen von Entries den Clone-Link auf,
296 	// damit man sich nicht vom Model ableiten muss, wenn man
297 	// sich von SvListEntry ableitet.
298 	// Deklaration des Clone-Handlers:
299 	// DECL_LINK(CloneHdl,SvListEntry*);
300 	// der Handler muss einen SvListEntry* zurueckgeben
301 	SvListEntry*	Clone( SvListEntry* pEntry, sal_uLong& nCloneCount ) const;
302 	void			SetCloneLink( const Link& rLink ) { aCloneLink=rLink; }
303 	const Link&		GetCloneLink() const { return aCloneLink; }
304 	virtual SvListEntry* CloneEntry( SvListEntry* ) const; // ruft den Clone-Link
305 	virtual SvListEntry* CreateEntry() const; // zum 'new'en von Entries
306 
307 	sal_uInt16			GetRefCount() const { return nRefCount; }
308 	void			SetRefCount( sal_uInt16 nRef ) { nRefCount = nRef; }
309 
310 	void			SetSortMode( SvSortMode eMode ) { eSortMode = eMode; }
311 	SvSortMode		GetSortMode() const { return eSortMode; }
312 	virtual StringCompare Compare( SvListEntry*, SvListEntry* ) const;
313 	void			SetCompareHdl( const Link& rLink ) { aCompareLink = rLink; }
314 	const Link& 	GetCompareHdl() const { return aCompareLink; }
315 	void			Resort();
316 
317 	void			CheckIntegrity() const;
318 };
319 
320 class SVT_DLLPUBLIC SvListView
321 {
322 	friend class SvTreeList;
323 
324 	sal_uLong           nVisibleCount;
325 	sal_uLong			nSelectionCount;
326 	sal_Bool            bVisPositionsValid;
327 
328 //#if 0 // _SOLAR__PRIVATE
329 	SVT_DLLPRIVATE void			InitTable();
330 	SVT_DLLPRIVATE void			ClearTable();
331 	SVT_DLLPRIVATE void			RemoveViewData( SvListEntry* pParent );
332 //#endif
333 
334 protected:
335 	Table			aDataTable;  // Mapping SvListEntry -> ViewData
336 	SvTreeList*		pModel;
337 
338 	void ActionMoving( SvListEntry* pEntry,SvListEntry* pTargetPrnt,sal_uLong nChildPos);
339 	void ActionMoved( SvListEntry* pEntry,SvListEntry* pTargetPrnt,sal_uLong nChildPos);
340 	void ActionInserted( SvListEntry* pEntry );
341 	void ActionInsertedTree( SvListEntry* pEntry );
342 	void ActionRemoving( SvListEntry* pEntry );
343 	void ActionRemoved( SvListEntry* pEntry );
344 	void ActionClear();
345 
346 public:
347 
348 	SvListView();   // !!! setzt das Model auf 0
349 	SvListView( SvTreeList* pModel );
350 	virtual ~SvListView();
351 	void            Clear();
352 	SvTreeList*		GetModel() const { return pModel; }
353 	virtual void	SetModel( SvTreeList* );
354 	virtual void	ModelNotification( sal_uInt16 nActionId, SvListEntry* pEntry1,
355 						SvListEntry* pEntry2, sal_uLong nPos );
356 
357 	sal_uLong			GetVisibleCount() const { return pModel->GetVisibleCount( (SvListView*)this );}
358 	SvListEntry*    FirstVisible() const { return pModel->FirstVisible(); }
359 	SvListEntry*    NextVisible( SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const {return pModel->NextVisible(this,pEntry,pDepth); }
360 	SvListEntry*	PrevVisible( SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const {return pModel->PrevVisible(this,pEntry,pDepth); }
361 	SvListEntry*	LastVisible( sal_uInt16* pDepth=0 ) const { return pModel->LastVisible(this,pDepth);}
362 	SvListEntry*	NextVisible( SvListEntry* pEntry, sal_uInt16& rDelta ) const { return pModel->NextVisible(this,pEntry,rDelta); }
363 	SvListEntry*	PrevVisible( SvListEntry* pEntry, sal_uInt16& rDelta ) const { return pModel->PrevVisible(this,pEntry,rDelta); }
364 
365 	sal_uLong           GetSelectionCount() const { return nSelectionCount; }
366 	SvListEntry*	FirstSelected() const { return pModel->FirstSelected(this);}
367 	SvListEntry*    NextSelected( SvListEntry* pEntry ) const { return pModel->NextSelected(this,pEntry); }
368 	SvListEntry*	PrevSelected( SvListEntry* pEntry ) const { return pModel->PrevSelected(this,pEntry); }
369 	SvListEntry*	LastSelected() const { return pModel->LastSelected(this); }
370 	SvListEntry*	GetEntryAtVisPos( sal_uLong nVisPos ) const { return pModel->GetEntryAtVisPos((SvListView*)this,nVisPos); }
371 	sal_uLong			GetVisiblePos( SvListEntry* pEntry ) const { return pModel->GetVisiblePos((SvListView*)this,pEntry); }
372 
373 	sal_uLong			GetVisibleChildCount(SvListEntry* pParent ) const { return pModel->GetVisibleChildCount((SvListView*)this,pParent); }
374 	sal_uLong			GetChildSelectionCount( SvListEntry* pParent ) const { return pModel->GetChildSelectionCount((SvListView*)this,pParent); }
375 	void            Expand( SvListEntry* pParent ) { pModel->Expand((SvListView*)this,pParent); }
376 	void            Collapse( SvListEntry* pParent ) { pModel->Collapse((SvListView*)this,pParent); }
377 	sal_Bool            Select( SvListEntry* pEntry, sal_Bool bSelect=sal_True ) { return pModel->Select((SvListView*)this,pEntry,bSelect); }
378 	sal_uLong			SelectChilds( SvListEntry* pParent, sal_Bool bSelect ) { return pModel->SelectChilds((SvListView*)this,pParent, bSelect); }
379 	// ruft nicht Select-Hdl
380 	virtual void	SelectAll( sal_Bool bSelect, sal_Bool ) { pModel->SelectAll((SvListView*)this, bSelect); }
381 	sal_Bool			IsEntryVisible( SvListEntry* pEntry ) const	{ return pModel->IsEntryVisible((SvListView*)this,pEntry); }
382 	sal_Bool			IsExpanded( SvListEntry* pEntry ) const;
383 	sal_Bool			IsSelected( SvListEntry* pEntry ) const;
384 	sal_Bool			HasEntryFocus( SvListEntry* pEntry ) const;
385 	void			SetEntryFocus( SvListEntry* pEntry, sal_Bool bFocus ) const;
386 	SvViewData*		GetViewData( SvListEntry* pEntry ) const;
387 	sal_Bool			HasViewData() const { return aDataTable.Count() > 1;}	// eine ROOT gibts immer
388 	virtual	SvViewData* CreateViewData( SvListEntry* pEntry );
389 	virtual	void InitViewData( SvViewData*, SvListEntry* pEntry );
390 
391 	virtual void 	ModelHasCleared();
392 	virtual void 	ModelHasInserted( SvListEntry* pEntry );
393 	virtual void 	ModelHasInsertedTree( SvListEntry* pEntry );
394 	virtual void 	ModelIsMoving( SvListEntry* pSource, SvListEntry* pTargetParent,
395 								sal_uLong nPos	);
396 	virtual void 	ModelHasMoved( SvListEntry* pSource );
397 	virtual void 	ModelIsRemoving( SvListEntry* pEntry );
398 	virtual void 	ModelHasRemoved( SvListEntry* pEntry );
399 	virtual void 	ModelHasEntryInvalidated( SvListEntry* pEntry );
400 };
401 
402 inline sal_Bool SvListView::IsExpanded( SvListEntry* pEntry ) const
403 {
404 	DBG_ASSERT(pEntry,"IsExpanded:No Entry");
405 	SvViewData* pData = (SvViewData*)aDataTable.Get( (sal_uLong)pEntry );
406 	DBG_ASSERT(pData,"Entry not in Table");
407 	return pData->IsExpanded();
408 }
409 inline sal_Bool SvListView::IsSelected( SvListEntry* pEntry ) const
410 {
411 	DBG_ASSERT(pEntry,"IsExpanded:No Entry");
412 	SvViewData* pData = (SvViewData*)aDataTable.Get( (sal_uLong)pEntry );
413 	DBG_ASSERT(pData,"Entry not in Table");
414 	return pData->IsSelected();
415 }
416 inline sal_Bool SvListView::HasEntryFocus( SvListEntry* pEntry ) const
417 {
418 	DBG_ASSERT(pEntry,"IsExpanded:No Entry");
419 	SvViewData* pData = (SvViewData*)aDataTable.Get( (sal_uLong)pEntry );
420 	DBG_ASSERT(pData,"Entry not in Table");
421 	return pData->HasFocus();
422 }
423 inline void SvListView::SetEntryFocus( SvListEntry* pEntry, sal_Bool bFocus ) const
424 {
425 	DBG_ASSERT(pEntry,"SetEntryFocus:No Entry");
426 	SvViewData* pData = (SvViewData*)aDataTable.Get( (sal_uLong)pEntry );
427 	DBG_ASSERT(pData,"Entry not in Table");
428 	pData->SetFocus(bFocus);
429 }
430 
431 inline SvViewData* SvListView::GetViewData( SvListEntry* pEntry ) const
432 {
433 #ifndef DBG_UTIL
434 	return (SvViewData*)aDataTable.Get( (sal_uLong)pEntry );
435 #else
436 	SvViewData* pResult = (SvViewData*)aDataTable.Get( (sal_uLong)pEntry );
437 	DBG_ASSERT(pResult,"Entry not in model or wrong view");
438 	return pResult;
439 #endif
440 }
441 
442 inline sal_Bool SvTreeList::HasChilds( SvListEntry* pEntry ) const
443 {
444 	if ( !pEntry )
445 		pEntry = pRootItem;
446 	return (sal_Bool)(pEntry->pChilds != 0);
447 }
448 
449 inline SvListEntry* SvTreeList::GetEntry( SvListEntry* pParent, sal_uLong nPos ) const
450 {   if ( !pParent )
451 		pParent = pRootItem;
452 	SvListEntry* pRet = 0;
453 	if ( pParent->pChilds )
454 		pRet = (SvListEntry*)(pParent->pChilds->GetObject(nPos));
455 	return pRet;
456 }
457 
458 inline SvListEntry* SvTreeList::GetEntry( sal_uLong nRootPos ) const
459 {
460 	SvListEntry* pRet;
461 	if ( nEntryCount )
462 		pRet = (SvListEntry*)(pRootItem->pChilds->GetObject(nRootPos));
463 	else
464 		pRet = 0;
465 	return pRet;
466 }
467 
468 inline SvTreeEntryList* SvTreeList::GetChildList( SvListEntry* pParent ) const
469 {
470 	if ( !pParent )
471 		pParent = pRootItem;
472 	return pParent->pChilds;
473 }
474 
475 inline SvListEntry* SvTreeList::GetParent( SvListEntry* pEntry ) const
476 {
477 	SvListEntry* pParent = pEntry->pParent;
478 	if ( pParent==pRootItem )
479 		pParent = 0;
480 	return pParent;
481 }
482 
483 #define DECLARE_SVTREELIST( ClassName, Type )									\
484 class ClassName : public SvTreeList                                       	\
485 {                                                                           \
486 public:                                                                     \
487 	Type		First() const                                               \
488 					{ return (Type)SvTreeList::First(); }                     \
489     Type    	Next( SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const           \
490 					{ return (Type)SvTreeList::Next(pEntry,pDepth); }         \
491     Type		Prev( SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const           \
492 					{ return (Type)SvTreeList::Prev(pEntry,pDepth); }         \
493     Type		Last( sal_uInt16* pDepth=0 ) const           					\
494 					{ return (Type)SvTreeList::Last(pDepth); }         		\
495 																			\
496 	Type 		Clone( SvListEntry* pEntry, sal_uLong& nCloneCount ) const        \
497 					{ return (Type)SvTreeList::Clone(pEntry,nCloneCount); }   \
498 	Type		GetEntry( SvListEntry* pParent, sal_uLong nPos ) const            \
499 					{ return (Type)SvTreeList::GetEntry(pParent,nPos); }      \
500 	Type		GetEntry( sal_uLong nRootPos ) const                            \
501 					{ return (Type)SvTreeList::GetEntry(nRootPos); }          \
502 	Type		GetParent( SvListEntry* pEntry ) const                        \
503 					{ return (Type)SvTreeList::GetParent(pEntry); }           \
504     using SvTreeList::FirstChild;                                             \
505 	Type		FirstChild( Type pParent ) const							\
506 					{ return (Type)SvTreeList::FirstChild(pParent); }			\
507     using SvTreeList::NextSibling;                                             \
508 	Type		NextSibling( Type pEntry ) const							\
509 					{ return (Type)SvTreeList::NextSibling(pEntry); }			\
510     using SvTreeList::PrevSibling;                                             \
511 	Type		PrevSibling( Type pEntry ) const							\
512 					{ return (Type)SvTreeList::PrevSibling(pEntry); }			\
513     using SvTreeList::LastSibling;                                             \
514 	Type		LastSibling( Type pEntry ) const							\
515 					{ return (Type)SvTreeList::LastSibling(pEntry); }			\
516 	Type		GetEntryAtAbsPos( sal_uLong nAbsPos ) const						\
517 					{ return (Type)SvTreeList::GetEntryAtAbsPos( nAbsPos); }	\
518 };
519 
520 #endif
521