xref: /AOO41X/main/svtools/inc/svtools/treelist.hxx (revision d9c7f81ba5669c94b8491a5ba0cf17c139a28baf)
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:
SvTreeEntryList(sal_uInt16 nInitPos=16,sal_uInt16 nResize=16)67     SvTreeEntryList(sal_uInt16 nInitPos=16, sal_uInt16 nResize=16 )
68             : List( nInitPos, nResize )
69     {}
SvTreeEntryList(sal_uInt16 BlockSize,sal_uInt16 InitSize,sal_uInt16 Resize)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();
InvalidateChildrensListPositions()89     void                InvalidateChildrensListPositions()
90                         {
91                             nListPos |= 0x80000000;
92                         }
93 public:
94                         SvListEntry();
95                         SvListEntry( const SvListEntry& );
96     virtual             ~SvListEntry();
HasChilds()97     sal_Bool                HasChilds() { return (sal_Bool)(pChilds!=0); }
HasChildListPos() const98     sal_Bool                HasChildListPos() const
99     {
100         if( pParent && !(pParent->nListPos & 0x80000000) )
101             return sal_True;
102         else return sal_False;
103     }
GetChildListPos() const104     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 
IsSelected() const128     sal_Bool IsSelected() const { return (sal_Bool)(nFlags&SVLISTENTRYFLAG_SELECTED)!=0; }
IsExpanded() const129     sal_Bool IsExpanded() const { return (sal_Bool)(nFlags&SVLISTENTRYFLAG_EXPANDED)!=0; }
HasFocus() const130     sal_Bool HasFocus() const { return (sal_Bool)(nFlags&SVLISTENTRYFLAG_FOCUSED)!=0; }
SetFocus(sal_Bool bFocus)131     void SetFocus( sal_Bool bFocus)
132     {
133         if ( !bFocus )
134             nFlags &= (~SVLISTENTRYFLAG_FOCUSED);
135         else
136             nFlags |= SVLISTENTRYFLAG_FOCUSED;
137     }
IsCursored() const138     sal_Bool IsCursored() const { return (sal_Bool)(nFlags&SVLISTENTRYFLAG_CURSORED)!=0; }
SetCursored(sal_Bool bCursored)139     void SetCursored( sal_Bool bCursored )
140     {
141         if ( !bCursored )
142             nFlags &= (~SVLISTENTRYFLAG_CURSORED);
143         else
144             nFlags |= SVLISTENTRYFLAG_CURSORED;
145     }
146 
GetFlags() const147     sal_uInt16 GetFlags() const { return nFlags; }
148 
SetSelectable(bool bSelectable)149     void SetSelectable( bool bSelectable )
150     {
151         if( bSelectable )
152             nFlags &= (~SVLISTENTRYFLAG_NOT_SELECTABLE);
153         else
154             nFlags |= SVLISTENTRYFLAG_NOT_SELECTABLE;
155     }
IsSelectable() const156     bool IsSelectable() const { return (bool)(nFlags&SVLISTENTRYFLAG_NOT_SELECTABLE)==0; }
157     // IAccessible2 implementation
SetObjectSelected(sal_Bool bSelected)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 
FirstVisible() const193     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* );
GetViewCount() const243     sal_uLong           GetViewCount() const { return aViewList.Count(); }
GetView(sal_uLong nPos) const244     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 
GetEntryCount() const250     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);
Insert(SvListEntry * pEntry,sal_uLong nRootPos=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;
HasParent(SvListEntry * pEntry) const279     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;
GetRelPos(SvListEntry * pChild) const290     sal_uLong           GetRelPos( SvListEntry* pChild ) const { return pChild->GetChildListPos(); }
291     sal_uLong           GetChildCount( SvListEntry* pParent ) const;
292     sal_uInt16          GetDepth( SvListEntry* pEntry ) const;
IsAtRootDepth(SvListEntry * pEntry) const293     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;
SetCloneLink(const Link & rLink)302     void            SetCloneLink( const Link& rLink ) { aCloneLink=rLink; }
GetCloneLink() const303     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 
GetRefCount() const307     sal_uInt16          GetRefCount() const { return nRefCount; }
SetRefCount(sal_uInt16 nRef)308     void            SetRefCount( sal_uInt16 nRef ) { nRefCount = nRef; }
309 
SetSortMode(SvSortMode eMode)310     void            SetSortMode( SvSortMode eMode ) { eSortMode = eMode; }
GetSortMode() const311     SvSortMode      GetSortMode() const { return eSortMode; }
312     virtual StringCompare Compare( SvListEntry*, SvListEntry* ) const;
SetCompareHdl(const Link & rLink)313     void            SetCompareHdl( const Link& rLink ) { aCompareLink = rLink; }
GetCompareHdl() const314     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();
GetModel() const352     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 
GetVisibleCount() const357     sal_uLong           GetVisibleCount() const { return pModel->GetVisibleCount( (SvListView*)this );}
FirstVisible() const358     SvListEntry*    FirstVisible() const { return pModel->FirstVisible(); }
NextVisible(SvListEntry * pEntry,sal_uInt16 * pDepth=0) const359     SvListEntry*    NextVisible( SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const {return pModel->NextVisible(this,pEntry,pDepth); }
PrevVisible(SvListEntry * pEntry,sal_uInt16 * pDepth=0) const360     SvListEntry*    PrevVisible( SvListEntry* pEntry, sal_uInt16* pDepth=0 ) const {return pModel->PrevVisible(this,pEntry,pDepth); }
LastVisible(sal_uInt16 * pDepth=0) const361     SvListEntry*    LastVisible( sal_uInt16* pDepth=0 ) const { return pModel->LastVisible(this,pDepth);}
NextVisible(SvListEntry * pEntry,sal_uInt16 & rDelta) const362     SvListEntry*    NextVisible( SvListEntry* pEntry, sal_uInt16& rDelta ) const { return pModel->NextVisible(this,pEntry,rDelta); }
PrevVisible(SvListEntry * pEntry,sal_uInt16 & rDelta) const363     SvListEntry*    PrevVisible( SvListEntry* pEntry, sal_uInt16& rDelta ) const { return pModel->PrevVisible(this,pEntry,rDelta); }
364 
GetSelectionCount() const365     sal_uLong           GetSelectionCount() const { return nSelectionCount; }
FirstSelected() const366     SvListEntry*    FirstSelected() const { return pModel->FirstSelected(this);}
NextSelected(SvListEntry * pEntry) const367     SvListEntry*    NextSelected( SvListEntry* pEntry ) const { return pModel->NextSelected(this,pEntry); }
PrevSelected(SvListEntry * pEntry) const368     SvListEntry*    PrevSelected( SvListEntry* pEntry ) const { return pModel->PrevSelected(this,pEntry); }
LastSelected() const369     SvListEntry*    LastSelected() const { return pModel->LastSelected(this); }
GetEntryAtVisPos(sal_uLong nVisPos) const370     SvListEntry*    GetEntryAtVisPos( sal_uLong nVisPos ) const { return pModel->GetEntryAtVisPos((SvListView*)this,nVisPos); }
GetVisiblePos(SvListEntry * pEntry) const371     sal_uLong           GetVisiblePos( SvListEntry* pEntry ) const { return pModel->GetVisiblePos((SvListView*)this,pEntry); }
372 
GetVisibleChildCount(SvListEntry * pParent) const373     sal_uLong           GetVisibleChildCount(SvListEntry* pParent ) const { return pModel->GetVisibleChildCount((SvListView*)this,pParent); }
GetChildSelectionCount(SvListEntry * pParent) const374     sal_uLong           GetChildSelectionCount( SvListEntry* pParent ) const { return pModel->GetChildSelectionCount((SvListView*)this,pParent); }
Expand(SvListEntry * pParent)375     void            Expand( SvListEntry* pParent ) { pModel->Expand((SvListView*)this,pParent); }
Collapse(SvListEntry * pParent)376     void            Collapse( SvListEntry* pParent ) { pModel->Collapse((SvListView*)this,pParent); }
Select(SvListEntry * pEntry,sal_Bool bSelect=sal_True)377     sal_Bool            Select( SvListEntry* pEntry, sal_Bool bSelect=sal_True ) { return pModel->Select((SvListView*)this,pEntry,bSelect); }
SelectChilds(SvListEntry * pParent,sal_Bool bSelect)378     sal_uLong           SelectChilds( SvListEntry* pParent, sal_Bool bSelect ) { return pModel->SelectChilds((SvListView*)this,pParent, bSelect); }
379     // ruft nicht Select-Hdl
SelectAll(sal_Bool bSelect,sal_Bool)380     virtual void    SelectAll( sal_Bool bSelect, sal_Bool ) { pModel->SelectAll((SvListView*)this, bSelect); }
IsEntryVisible(SvListEntry * pEntry) const381     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;
HasViewData() const387     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 
IsExpanded(SvListEntry * pEntry) const402 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 && pData->IsExpanded();
408 }
IsSelected(SvListEntry * pEntry) const409 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 && pData->IsSelected();
415 }
HasEntryFocus(SvListEntry * pEntry) const416 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 && pData->HasFocus();
422 }
SetEntryFocus(SvListEntry * pEntry,sal_Bool bFocus) const423 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 
GetViewData(SvListEntry * pEntry) const431 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 
HasChilds(SvListEntry * pEntry) const442 inline sal_Bool SvTreeList::HasChilds( SvListEntry* pEntry ) const
443 {
444     if ( !pEntry )
445         pEntry = pRootItem;
446     return (sal_Bool)(pEntry->pChilds != 0);
447 }
448 
GetEntry(SvListEntry * pParent,sal_uLong nPos) const449 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 
GetEntry(sal_uLong nRootPos) const458 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 
GetChildList(SvListEntry * pParent) const468 inline SvTreeEntryList* SvTreeList::GetChildList( SvListEntry* pParent ) const
469 {
470     if ( !pParent )
471         pParent = pRootItem;
472     return pParent->pChilds;
473 }
474 
GetParent(SvListEntry * pEntry) const475 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