xref: /trunk/main/sw/source/ui/utlui/content.cxx (revision 4d7c9de063a797b8b4f3d45e3561e82ad1f8ef1f)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 #ifndef _SVSTDARR_HXX
28 #define _SVSTDARR_STRINGSDTOR
29 #include <svl/svstdarr.hxx>
30 #endif
31 #include <svl/urlbmk.hxx>
32 #include <tools/urlobj.hxx>
33 #include <sfx2/docfile.hxx>
34 #include <sfx2/dispatch.hxx>
35 #include <vcl/help.hxx>
36 #include <sot/formats.hxx>
37 #include <vcl/sound.hxx>
38 #include <uiitems.hxx>
39 #include <fmtinfmt.hxx>
40 #include <txtinet.hxx>
41 #include <fmtfld.hxx>
42 #include <swmodule.hxx>
43 #include <wrtsh.hxx>
44 #include <view.hxx>
45 #include <errhdl.hxx>
46 #include <docsh.hxx>
47 #include <content.hxx>
48 #include <frmfmt.hxx>
49 #include <fldbas.hxx>
50 #include <txtatr.hxx>
51 #include <IMark.hxx>
52 #include <section.hxx>
53 #include <tox.hxx>
54 #define NAVIPI_CXX
55 #include <navipi.hxx>
56 #include <navicont.hxx>
57 #include <navicfg.hxx>
58 #include <edtwin.hxx>
59 #include <doc.hxx>
60 #include <unotools.hxx>
61 #include <crsskip.hxx>
62 #include <cmdid.h>
63 #include <helpid.h>
64 #include <navipi.hrc>
65 #include <utlui.hrc>
66 #include <misc.hrc>
67 #include <comcore.hrc>
68 #include <com/sun/star/text/XTextSectionsSupplier.hpp>
69 #include <com/sun/star/text/XTextGraphicObjectsSupplier.hpp>
70 #include <com/sun/star/text/XTextTablesSupplier.hpp>
71 #include <com/sun/star/text/XDocumentIndexesSupplier.hpp>
72 #include <com/sun/star/text/XDocumentIndex.hpp>
73 #include <com/sun/star/text/XBookmarksSupplier.hpp>
74 #include <com/sun/star/text/XTextEmbeddedObjectsSupplier.hpp>
75 #include <com/sun/star/text/XTextFramesSupplier.hpp>
76 #include <dcontact.hxx>
77 #include <svx/svdogrp.hxx>
78 #include <svx/svdmodel.hxx>
79 #include <svx/svdpage.hxx>
80 #include <svx/svdview.hxx>
81 #include <vcl/scrbar.hxx>
82 #include <comcore.hrc>
83 #include <SwRewriter.hxx>
84 #include <hints.hxx>
85 #include <numrule.hxx>
86 #include <swundo.hxx>
87 #include <ndtxt.hxx>
88 //#include <ndgrf.hxx>
89 #include <fmtcntnt.hxx>
90 #include <PostItMgr.hxx>
91 //#include <../../core/inc/flyfrm.hxx>
92 //#include <../../core/inc/cntfrm.hxx>
93 //#include <ndnotxt.hxx>
94 //#include <postit.hxx>
95 #include <postithelper.hxx>
96 #include <redline.hxx>
97 #include <docary.hxx>
98 
99 #include "swabstdlg.hxx"
100 #include "globals.hrc"
101 #include <unomid.h>
102 
103 
104 #define CTYPE_CNT   0
105 #define CTYPE_CTT   1
106 
107 using namespace ::std;
108 using namespace ::com::sun::star;
109 using namespace ::com::sun::star::text;
110 using namespace ::com::sun::star::uno;
111 using namespace ::com::sun::star::container;
112 
113 
114 #define NAVI_BOOKMARK_DELIM     (sal_Unicode)1
115 
116 /***************************************************************************
117 
118 ***************************************************************************/
119 
120 typedef SwContent* SwContentPtr;
121 SV_DECL_PTRARR_SORT_DEL( SwContentArr, SwContentPtr, 0,4)
122 SV_IMPL_OP_PTRARR_SORT(SwContentArr, SwContentPtr)
123 
124 sal_Bool SwContentTree::bIsInDrag = sal_False;
125 
126 
127 namespace
128 {
129     static sal_Bool lcl_IsContent(SvLBoxEntry* pEntry)
130     {
131         return ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId() == CTYPE_CNT;
132     }
133 
134 
135     static sal_Bool lcl_IsContentType(SvLBoxEntry* pEntry)
136     {
137         return ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId() == CTYPE_CTT;
138     }
139 
140 
141     static sal_Bool lcl_FindShell(SwWrtShell* pShell)
142     {
143         sal_Bool bFound = sal_False;
144         SwView *pView = SwModule::GetFirstView();
145         while (pView)
146         {
147             if(pShell == &pView->GetWrtShell())
148             {
149                 bFound = sal_True;
150                 break;
151             }
152             pView = SwModule::GetNextView(pView);
153         }
154         return bFound;
155     }
156 
157     static bool lcl_IsUiVisibleBookmark(const IDocumentMarkAccess::pMark_t& rpMark)
158     {
159         return IDocumentMarkAccess::GetType(*rpMark) == IDocumentMarkAccess::BOOKMARK;
160     }
161 }
162 
163 /***************************************************************************
164     Beschreibung: Inhalt, enthaelt Namen und Verweis auf den Inhalstyp
165 ***************************************************************************/
166 
167 
168 SwContent::SwContent(const SwContentType* pCnt, const String& rName, long nYPos) :
169     SwTypeNumber(CTYPE_CNT),
170     pParent(pCnt),
171     sContentName(rName),
172     nYPosition(nYPos),
173     bInvisible(sal_False)
174 {
175 }
176 
177 
178 sal_uInt8   SwTypeNumber::GetTypeId()
179 {
180     return nTypeId;
181 }
182 
183 SwTypeNumber::~SwTypeNumber()
184 {
185 }
186 
187 sal_Bool SwContent::IsProtect() const
188 {
189     return sal_False;
190 }
191 
192 sal_Bool SwPostItContent::IsProtect() const
193 {
194     if (mbPostIt)
195         return pFld->IsProtect();
196     else
197         return false;
198 }
199 
200 sal_Bool SwURLFieldContent::IsProtect() const
201 {
202     return pINetAttr->IsProtect();
203 }
204 
205 SwGraphicContent::~SwGraphicContent()
206 {
207 }
208 SwTOXBaseContent::~SwTOXBaseContent()
209 {
210 }
211 
212 /***************************************************************************
213     Beschreibung:   Inhaltstyp, kennt seine Inhalte und die WrtShell
214 ***************************************************************************/
215 
216 
217 SwContentType::SwContentType(SwWrtShell* pShell, sal_uInt16 nType, sal_uInt8 nLevel) :
218     SwTypeNumber(CTYPE_CTT),
219     pWrtShell(pShell),
220     pMember(0),
221     sContentTypeName(SW_RES(STR_CONTENT_TYPE_FIRST + nType)),
222     sSingleContentTypeName(SW_RES(STR_CONTENT_TYPE_SINGLE_FIRST + nType)),
223     nMemberCount(0),
224     nContentType(nType),
225     nOutlineLevel(nLevel),
226     bMemberFilled(sal_False),
227     bDataValid(sal_False),
228     bEdit(sal_False),
229     bDelete(sal_True)
230 {
231     Init();
232 }
233 
234 /***************************************************************************
235     Beschreibung:   Initialisierung
236 ***************************************************************************/
237 
238 
239 void SwContentType::Init(sal_Bool* pbInvalidateWindow)
240 {
241     // wenn sich der MemberCount aendert ...
242     sal_uInt16 nOldMemberCount = nMemberCount;
243     nMemberCount = 0;
244     switch(nContentType)
245     {
246         case CONTENT_TYPE_OUTLINE   :
247         {
248             sTypeToken = C2S(pMarkToOutline);
249             sal_uInt16 nOutlineCount = nMemberCount =
250                 static_cast<sal_uInt16>(pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineNodesCount());
251             if(nOutlineLevel < MAXLEVEL)
252             {
253                 for(sal_uInt16 j = 0; j < nOutlineCount; j++)
254                 {
255                     if(pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineLevel(j) > nOutlineLevel )
256                         nMemberCount --;
257                 }
258             }
259             bDelete = sal_False;
260         }
261         break;
262 
263         case CONTENT_TYPE_TABLE     :
264             sTypeToken = C2S(pMarkToTable);
265             nMemberCount = pWrtShell->GetTblFrmFmtCount(sal_True);
266             bEdit = sal_True;
267         break;
268 
269         case CONTENT_TYPE_FRAME     :
270         case CONTENT_TYPE_GRAPHIC   :
271         case CONTENT_TYPE_OLE       :
272         {
273             FlyCntType eType = FLYCNTTYPE_FRM;
274             sTypeToken = C2S(pMarkToFrame);
275             if(nContentType == CONTENT_TYPE_OLE)
276             {
277                 eType = FLYCNTTYPE_OLE;
278                 sTypeToken = C2S(pMarkToOLE);
279             }
280             else if(nContentType == CONTENT_TYPE_GRAPHIC)
281             {
282                 eType = FLYCNTTYPE_GRF;
283                 sTypeToken = C2S(pMarkToGraphic);
284             }
285             nMemberCount = pWrtShell->GetFlyCount(eType);
286             bEdit = sal_True;
287         }
288         break;
289         case CONTENT_TYPE_BOOKMARK:
290         {
291             IDocumentMarkAccess* const pMarkAccess = pWrtShell->getIDocumentMarkAccess();
292             nMemberCount = static_cast<sal_uInt16>(count_if(
293                 pMarkAccess->getBookmarksBegin(),
294                 pMarkAccess->getBookmarksEnd(),
295                 &lcl_IsUiVisibleBookmark));
296             sTypeToken = aEmptyStr;
297             bEdit = sal_True;
298         }
299         break;
300         case CONTENT_TYPE_REGION :
301         {
302             SwContentArr*   pOldMember = 0;
303             sal_uInt16 nOldRegionCount = 0;
304             sal_Bool bInvalidate = sal_False;
305             if(!pMember)
306                 pMember = new SwContentArr;
307             else if(pMember->Count())
308             {
309                 pOldMember = pMember;
310                 nOldRegionCount = pOldMember->Count();
311                 pMember = new SwContentArr;
312             }
313             const Point aNullPt;
314             nMemberCount = pWrtShell->GetSectionFmtCount();
315             for(sal_uInt16 i = 0; i < nMemberCount; i++)
316             {
317                 const SwSectionFmt* pFmt;
318                 SectionType eTmpType;
319                 if( (pFmt = &pWrtShell->GetSectionFmt(i))->IsInNodesArr() &&
320                 (eTmpType = pFmt->GetSection()->GetType()) != TOX_CONTENT_SECTION
321                 && TOX_HEADER_SECTION != eTmpType )
322                 {
323                     const String& rSectionName =
324                         pFmt->GetSection()->GetSectionName();
325                     sal_uInt8 nLevel = 0;
326                     SwSectionFmt* pParentFmt = pFmt->GetParent();
327                     while(pParentFmt)
328                     {
329                         nLevel++;
330                         pParentFmt = pParentFmt->GetParent();
331                     }
332 
333                     SwContent* pCnt = new SwRegionContent(this, rSectionName,
334                             nLevel,
335                             pFmt->FindLayoutRect( sal_False, &aNullPt ).Top());
336 
337                     SwPtrMsgPoolItem aAskItem( RES_CONTENT_VISIBLE, 0 );
338                     if( !pFmt->GetInfo( aAskItem ) &&
339                         !aAskItem.pObject )     // not visible
340                         pCnt->SetInvisible();
341                     pMember->Insert(pCnt);//, pMember->Count());
342 
343                     sal_uInt16 nPos = pMember->Count() - 1;
344                     if(nOldRegionCount > nPos &&
345                         (pOldMember->GetObject(nPos))->IsInvisible()
346                                 != pCnt->IsInvisible())
347                             bInvalidate = sal_True;
348                 }
349             }
350             nMemberCount = pMember->Count();
351             sTypeToken = C2S(pMarkToRegion);
352             bEdit = sal_True;
353             bDelete = sal_False;
354             if(pOldMember)
355             {
356                 pOldMember->DeleteAndDestroy(0, pOldMember->Count());
357                 delete pOldMember;
358                 if(pbInvalidateWindow && bInvalidate)
359                     *pbInvalidateWindow = sal_True;
360             }
361         }
362         break;
363         case CONTENT_TYPE_INDEX:
364         {
365             nMemberCount = pWrtShell->GetTOXCount();
366             bEdit = sal_True;
367             bDelete = sal_False;
368         }
369         break;
370         case CONTENT_TYPE_REFERENCE:
371         {
372             nMemberCount = pWrtShell->GetRefMarks( 0 );
373             bDelete = sal_False;
374         }
375         break;
376         case CONTENT_TYPE_URLFIELD:
377         {
378             nMemberCount = 0;
379             if(!pMember)
380                 pMember = new SwContentArr;
381             else if(pMember->Count())
382                 pMember->DeleteAndDestroy(0, pMember->Count());
383 
384             SwGetINetAttrs aArr;
385             nMemberCount = pWrtShell->GetINetAttrs( aArr );
386             for( sal_uInt16 n = 0; n < nMemberCount; ++n )
387             {
388                 SwGetINetAttr* p = aArr[ n ];
389                 SwURLFieldContent* pCnt = new SwURLFieldContent(
390                                     this,
391                                     p->sText,
392                                     INetURLObject::decode(
393                                         p->rINetAttr.GetINetFmt().GetValue(),
394                                         INET_HEX_ESCAPE,
395                                         INetURLObject::DECODE_UNAMBIGUOUS,
396                                         RTL_TEXTENCODING_UTF8 ),
397                                     &p->rINetAttr,
398                                     n );
399                 pMember->Insert( pCnt );//, n );
400             }
401             bEdit = sal_True;
402             nOldMemberCount = nMemberCount;
403             bDelete = sal_False;
404         }
405         break;
406         case CONTENT_TYPE_POSTIT:
407         {
408             nMemberCount = 0;
409             if(!pMember)
410                 pMember = new SwContentArr;
411             else if(pMember->Count())
412                 pMember->DeleteAndDestroy(0, pMember->Count());
413 
414             SwPostItMgr* aMgr = pWrtShell->GetView().GetPostItMgr();
415             if (aMgr)
416             {
417                 for(SwPostItMgr::const_iterator i = aMgr->begin(); i != aMgr->end(); ++i)
418                 {
419                     if ( (*i)->GetBroadCaster()->ISA(SwFmtFld)) // SwPostit
420                     {
421                         SwFmtFld* aFmtFld = static_cast<SwFmtFld*>((*i)->GetBroadCaster());
422                         if (aFmtFld->GetTxtFld() && aFmtFld->IsFldInDoc() &&
423                             (*i)->mLayoutStatus!=SwPostItHelper::INVISIBLE )
424                         {
425                             String sEntry = aFmtFld->GetField()->GetPar2();
426                             RemoveNewline(sEntry);
427                             SwPostItContent* pCnt = new SwPostItContent(
428                                                 this,
429                                                 sEntry,
430                                                 (const SwFmtFld*)aFmtFld,
431                                                 nMemberCount);
432                             pMember->Insert(pCnt);
433                             nMemberCount++;
434                         }
435                     }
436                 }
437             }
438             //
439             sTypeToken = aEmptyStr;
440             bEdit = sal_True;
441             nOldMemberCount = nMemberCount;
442         }
443         break;
444         case CONTENT_TYPE_DRAWOBJECT:
445         {
446             sTypeToken = aEmptyStr;
447             nMemberCount = 0;
448             SdrModel* pModel = pWrtShell->getIDocumentDrawModelAccess()->GetDrawModel();
449             if(pModel)
450             {
451                 SdrPage* pPage = pModel->GetPage(0);
452                 sal_uInt32 nCount = pPage->GetObjCount();
453                 for( sal_uInt32 i=0; i< nCount; i++ )
454                 {
455                     SdrObject* pTemp = pPage->GetObj(i);
456                     // --> OD 2006-03-09 #i51726# - all drawing objects can be named now
457 //                    if(pTemp->ISA(SdrObjGroup) && pTemp->GetName().Len())
458                     if ( pTemp->GetName().Len() )
459                     // <--
460                         nMemberCount++;
461                 }
462             }
463         }
464         break;
465     }
466     // ... dann koennen die Daten auch nicht mehr gueltig sein
467     // abgesehen von denen, die schon korrigiert wurden, dann ist
468     // nOldMemberCount doch nicht so old
469     if( nOldMemberCount != nMemberCount )
470         bDataValid = sal_False;
471 }
472 
473 /***************************************************************************
474     Beschreibung:
475 ***************************************************************************/
476 
477 
478 SwContentType::~SwContentType()
479 {
480     delete pMember;
481 }
482 
483 /***************************************************************************
484     Beschreibung:    Inhalt liefern, dazu gfs. die Liste fuellen
485 ***************************************************************************/
486 
487 
488 const SwContent* SwContentType::GetMember(sal_uInt16 nIndex)
489 {
490     if(!bDataValid || !pMember)
491     {
492         FillMemberList();
493     }
494     if(nIndex < pMember->Count())
495         return pMember->GetObject(nIndex);
496     else
497         return 0;
498 
499 }
500 
501 
502 /***************************************************************************
503     Beschreibung:
504 ***************************************************************************/
505 
506 
507 void    SwContentType::Invalidate()
508 {
509     bDataValid = sal_False;
510 }
511 
512 /***************************************************************************
513     Beschreibung: Liste der Inhalte fuellen
514 ***************************************************************************/
515 
516 
517 void    SwContentType::FillMemberList(sal_Bool* pbLevelOrVisibiblityChanged)
518 {
519     SwContentArr*   pOldMember = 0;
520     int nOldMemberCount = -1;
521     SwPtrMsgPoolItem aAskItem( RES_CONTENT_VISIBLE, 0 );
522     if(pMember && pbLevelOrVisibiblityChanged)
523     {
524         pOldMember = pMember;
525         nOldMemberCount = pOldMember->Count();
526         pMember = new SwContentArr;
527         *pbLevelOrVisibiblityChanged = sal_False;
528     }
529     else if(!pMember)
530         pMember = new SwContentArr;
531     else if(pMember->Count())
532         pMember->DeleteAndDestroy(0, pMember->Count());
533     switch(nContentType)
534     {
535         case CONTENT_TYPE_OUTLINE   :
536         {
537             sal_uInt16 nOutlineCount = nMemberCount =
538                 static_cast<sal_uInt16>(pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineNodesCount());
539 
540             sal_uInt16 nPos = 0;
541             for (sal_uInt16 i = 0; i < nOutlineCount; ++i)
542             {
543                 const sal_Int8 nLevel = (sal_Int8)pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineLevel(i);
544                 if(nLevel >= nOutlineLevel )
545                     nMemberCount--;
546                 else
547                 {
548                     String aEntry(pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineText(i));
549                     aEntry.EraseLeadingChars();
550                     SwNavigationPI::CleanEntry( aEntry );
551                     SwOutlineContent* pCnt = new SwOutlineContent(this, aEntry, i, nLevel,
552                                                         pWrtShell->IsOutlineMovable( i ), nPos );
553                     pMember->Insert(pCnt);//, nPos);
554                     // bei gleicher Anzahl und vorhandenem pOldMember wird die
555                     // alte mit der neuen OutlinePos verglichen
556                     // cast fuer Win16
557                     if(nOldMemberCount > (int)nPos &&
558                         ((SwOutlineContent*)pOldMember->GetObject(nPos))->GetOutlineLevel() != nLevel)
559                         *pbLevelOrVisibiblityChanged = sal_True;
560 
561                     nPos++;
562                 }
563             }
564 
565         }
566         break;
567 
568         case CONTENT_TYPE_TABLE     :
569         {
570             DBG_ASSERT(nMemberCount ==
571                     pWrtShell->GetTblFrmFmtCount(sal_True),
572                     "MemberCount differiert");
573             Point aNullPt;
574             nMemberCount =  pWrtShell->GetTblFrmFmtCount(sal_True);
575             for(sal_uInt16 i = 0; i < nMemberCount; i++)
576             {
577                 const SwFrmFmt& rTblFmt = pWrtShell->GetTblFrmFmt(i, sal_True);
578                 String sTblName( rTblFmt.GetName() );
579 
580                 SwContent* pCnt = new SwContent(this, sTblName,
581                         rTblFmt.FindLayoutRect(sal_False, &aNullPt).Top() );
582                 if( !rTblFmt.GetInfo( aAskItem ) &&
583                     !aAskItem.pObject )     // not visible
584                     pCnt->SetInvisible();
585 
586                 pMember->Insert(pCnt);//, i);
587 
588                 if(nOldMemberCount > (int)i &&
589                     (pOldMember->GetObject(i))->IsInvisible() != pCnt->IsInvisible())
590                         *pbLevelOrVisibiblityChanged = sal_True;
591             }
592         }
593         break;
594         case CONTENT_TYPE_OLE       :
595         case CONTENT_TYPE_FRAME     :
596         case CONTENT_TYPE_GRAPHIC   :
597         {
598             FlyCntType eType = FLYCNTTYPE_FRM;
599             if(nContentType == CONTENT_TYPE_OLE)
600                 eType = FLYCNTTYPE_OLE;
601             else if(nContentType == CONTENT_TYPE_GRAPHIC)
602                 eType = FLYCNTTYPE_GRF;
603             DBG_ASSERT(nMemberCount ==  pWrtShell->GetFlyCount(eType),
604                     "MemberCount differiert");
605             Point aNullPt;
606             nMemberCount = pWrtShell->GetFlyCount(eType);
607             for(sal_uInt16 i = 0; i < nMemberCount; i++)
608             {
609                 const SwFrmFmt* pFrmFmt = pWrtShell->GetFlyNum(i,eType);
610                 String sFrmName = pFrmFmt->GetName();
611 
612                 SwContent* pCnt;
613                 if(CONTENT_TYPE_GRAPHIC == nContentType)
614                 {
615                     String sLink;
616                     pWrtShell->GetGrfNms( &sLink, 0, (SwFlyFrmFmt*) pFrmFmt);
617                     pCnt = new SwGraphicContent(this, sFrmName,
618                                 INetURLObject::decode( sLink, INET_HEX_ESCAPE,
619                                         INetURLObject::DECODE_UNAMBIGUOUS,
620                                         RTL_TEXTENCODING_UTF8 ),
621                                 pFrmFmt->FindLayoutRect(sal_False, &aNullPt).Top());
622                 }
623                 else
624                 {
625                     pCnt = new SwContent(this, sFrmName,
626                             pFrmFmt->FindLayoutRect(sal_False, &aNullPt).Top() );
627                 }
628                 if( !pFrmFmt->GetInfo( aAskItem ) &&
629                     !aAskItem.pObject )     // not visible
630                     pCnt->SetInvisible();
631                 pMember->Insert(pCnt);//, i);
632                 if(nOldMemberCount > (int)i &&
633                     (pOldMember->GetObject(i))->IsInvisible() != pCnt->IsInvisible())
634                         *pbLevelOrVisibiblityChanged = sal_True;
635             }
636         }
637         break;
638         case CONTENT_TYPE_BOOKMARK:
639         {
640             IDocumentMarkAccess* const pMarkAccess = pWrtShell->getIDocumentMarkAccess();
641             for(IDocumentMarkAccess::const_iterator_t ppBookmark = pMarkAccess->getBookmarksBegin();
642                 ppBookmark != pMarkAccess->getBookmarksEnd();
643                 ppBookmark++)
644             {
645                 if(lcl_IsUiVisibleBookmark(*ppBookmark))
646                 {
647                     const String& rBkmName = ppBookmark->get()->GetName();
648                     //nYPos von 0 -> text::Bookmarks werden nach Alphabet sortiert
649                     SwContent* pCnt = new SwContent(this, rBkmName, 0);
650                     pMember->Insert(pCnt);//, pMember->Count());
651                 }
652             }
653         }
654         break;
655         case CONTENT_TYPE_REGION    :
656         {
657             const Point aNullPt;
658             nMemberCount = pWrtShell->GetSectionFmtCount();
659             for(sal_uInt16 i = 0; i < nMemberCount; i++)
660             {
661                 const SwSectionFmt* pFmt;
662                 SectionType eTmpType;
663                 if( (pFmt = &pWrtShell->GetSectionFmt(i))->IsInNodesArr() &&
664                 (eTmpType = pFmt->GetSection()->GetType()) != TOX_CONTENT_SECTION
665                 && TOX_HEADER_SECTION != eTmpType )
666                 {
667                     String sSectionName = pFmt->GetSection()->GetSectionName();
668 
669                     sal_uInt8 nLevel = 0;
670                     SwSectionFmt* pParentFmt = pFmt->GetParent();
671                     while(pParentFmt)
672                     {
673                         nLevel++;
674                         pParentFmt = pParentFmt->GetParent();
675                     }
676 
677                     SwContent* pCnt = new SwRegionContent(this, sSectionName,
678                             nLevel,
679                             pFmt->FindLayoutRect( sal_False, &aNullPt ).Top());
680                     if( !pFmt->GetInfo( aAskItem ) &&
681                         !aAskItem.pObject )     // not visible
682                         pCnt->SetInvisible();
683                     pMember->Insert(pCnt);//, pMember->Count());
684 
685                     sal_uInt16 nPos = pMember->Count() - 1;
686                     if(nOldMemberCount > nPos &&
687                         (pOldMember->GetObject(nPos))->IsInvisible()
688                                 != pCnt->IsInvisible())
689                             *pbLevelOrVisibiblityChanged = sal_True;
690                 }
691             }
692             nMemberCount = pMember->Count();
693         }
694         break;
695         case CONTENT_TYPE_REFERENCE:
696         {
697             SvStringsDtor aRefMarks;
698             nMemberCount = pWrtShell->GetRefMarks( &aRefMarks );
699 
700             for(sal_uInt16 i=0; i<nMemberCount; i++)
701             {
702                 //Referenzen nach Alphabet sortiert
703                 SwContent* pCnt = new SwContent(
704                             this, *aRefMarks.GetObject(i), 0);
705                 pMember->Insert(pCnt);//, i);
706             }
707         }
708         break;
709         case CONTENT_TYPE_URLFIELD:
710         {
711             SwGetINetAttrs aArr;
712             nMemberCount = pWrtShell->GetINetAttrs( aArr );
713             for( sal_uInt16 n = 0; n < nMemberCount; ++n )
714             {
715                 SwGetINetAttr* p = aArr[ n ];
716                 SwURLFieldContent* pCnt = new SwURLFieldContent(
717                                     this,
718                                     p->sText,
719                                     INetURLObject::decode(
720                                         p->rINetAttr.GetINetFmt().GetValue(),
721                                         INET_HEX_ESCAPE,
722                                         INetURLObject::DECODE_UNAMBIGUOUS,
723                                         RTL_TEXTENCODING_UTF8 ),
724                                     &p->rINetAttr,
725                                     n );
726                 pMember->Insert( pCnt );//, n );
727             }
728         }
729         break;
730         case CONTENT_TYPE_INDEX:
731         {
732 
733             sal_uInt16 nCount = nMemberCount = pWrtShell->GetTOXCount();
734             for ( sal_uInt16 nTox = 0; nTox < nCount; nTox++ )
735             {
736                 const SwTOXBase* pBase = pWrtShell->GetTOX( nTox );
737                 String sTOXNm( pBase->GetTOXName() );
738 
739                 SwContent* pCnt = new SwTOXBaseContent(
740                         this, sTOXNm, nTox, *pBase);
741 
742                 if( !pBase->GetInfo( aAskItem ) &&
743                     !aAskItem.pObject )     // not visible
744                     pCnt->SetInvisible();
745 
746                 pMember->Insert( pCnt );//, nTox );
747                 sal_uInt16 nPos = pMember->Count() - 1;
748                 if(nOldMemberCount > nPos &&
749                     (pOldMember->GetObject(nPos))->IsInvisible()
750                             != pCnt->IsInvisible())
751                         *pbLevelOrVisibiblityChanged = sal_True;
752             }
753         }
754         break;
755         case CONTENT_TYPE_POSTIT:
756         {
757             nMemberCount = 0;
758             if(!pMember)
759                 pMember = new SwContentArr;
760             else if(pMember->Count())
761                 pMember->DeleteAndDestroy(0, pMember->Count());
762             SwPostItMgr* aMgr = pWrtShell->GetView().GetPostItMgr();
763             if (aMgr)
764             {
765                 for(SwPostItMgr::const_iterator i = aMgr->begin(); i != aMgr->end(); ++i)
766                 {
767                     if ( (*i)->GetBroadCaster()->ISA(SwFmtFld)) // SwPostit
768                     {
769                         SwFmtFld* aFmtFld = static_cast<SwFmtFld*>((*i)->GetBroadCaster());
770                         if (aFmtFld->GetTxtFld() && aFmtFld->IsFldInDoc() &&
771                             (*i)->mLayoutStatus!=SwPostItHelper::INVISIBLE )
772                         {
773                             String sEntry = aFmtFld->GetField()->GetPar2();
774                             RemoveNewline(sEntry);
775                             SwPostItContent* pCnt = new SwPostItContent(
776                                                 this,
777                                                 sEntry,
778                                                 (const SwFmtFld*)aFmtFld,
779                                                 nMemberCount);
780                             pMember->Insert(pCnt);
781                             nMemberCount++;
782                         }
783                     }
784                     /*  this code can be used once we want redline comments in the margin
785                     else    // redcomment
786                     {
787                         SwRedline* pRedline = static_cast<SwRedline*>((*i)->GetBroadCaster());
788                         if ( pRedline->GetComment() != String(::rtl::OUString::createFromAscii("")) )
789                         {
790                             String sEntry = pRedline->GetComment();
791                             RemoveNewline(sEntry);
792                             SwPostItContent* pCnt = new SwPostItContent(
793                                                 this,
794                                                 sEntry,
795                                                 pRedline,
796                                                 nMemberCount);
797                             pMember->Insert(pCnt);
798                             nMemberCount++;
799                         }
800                     }
801                     */
802                 }
803             }
804             //
805         }
806         break;
807         case CONTENT_TYPE_DRAWOBJECT:
808         {
809             nMemberCount = 0;
810             if(!pMember)
811                 pMember = new SwContentArr;
812             else if(pMember->Count())
813                 pMember->DeleteAndDestroy(0, pMember->Count());
814 
815             IDocumentDrawModelAccess* pIDDMA = pWrtShell->getIDocumentDrawModelAccess();
816             SdrModel* pModel = pIDDMA->GetDrawModel();
817             if(pModel)
818             {
819                 SdrPage* pPage = pModel->GetPage(0);
820                 sal_uInt32 nCount = pPage->GetObjCount();
821                 for( sal_uInt32 i=0; i< nCount; i++ )
822                 {
823                     SdrObject* pTemp = pPage->GetObj(i);
824                     // --> OD 2006-03-09 #i51726# - all drawing objects can be named now
825 //                    if(pTemp->ISA(SdrObjGroup) && pTemp->GetName().Len())
826                     if ( pTemp->GetName().Len() )
827                     // <--
828                     {
829                         SwContact* pContact = (SwContact*)pTemp->GetUserCall();
830                         long nYPos = 0;
831                         const Point aNullPt;
832                         if(pContact && pContact->GetFmt())
833                             nYPos = pContact->GetFmt()->FindLayoutRect(sal_False, &aNullPt).Top();
834                         SwContent* pCnt = new SwContent(
835                                             this,
836                                             pTemp->GetName(),
837                                             nYPos);
838                         if(!pIDDMA->IsVisibleLayerId(pTemp->GetLayer()))
839                             pCnt->SetInvisible();
840                         pMember->Insert(pCnt);
841                         nMemberCount++;
842                         if(nOldMemberCount > (int)i &&
843                             (pOldMember->GetObject((sal_uInt16)i))->IsInvisible() != pCnt->IsInvisible())
844                                 *pbLevelOrVisibiblityChanged = sal_True;
845                     }
846                 }
847             }
848         }
849         break;
850     }
851     bDataValid = sal_True;
852     if(pOldMember)
853         pOldMember->DeleteAndDestroy(0, pOldMember->Count());
854 
855 }
856 
857 /***************************************************************************
858     Beschreibung: TreeListBox fuer Inhaltsanzeige
859 ***************************************************************************/
860 
861 
862 SwContentTree::SwContentTree(Window* pParent, const ResId& rResId) :
863         SvTreeListBox( pParent, rResId ),
864 
865         sSpace(C2S("                    ")),
866 
867         sRemoveIdx(SW_RES(ST_REMOVE_INDEX)),
868         sUpdateIdx(SW_RES(ST_UPDATE)),
869         sUnprotTbl(SW_RES(ST_REMOVE_TBL_PROTECTION)),
870         sRename(SW_RES(ST_RENAME)),
871         sReadonlyIdx(SW_RES(ST_READONLY_IDX)),
872         sInvisible(SW_RES(ST_INVISIBLE)),
873 
874     sPostItShow(SW_RES(ST_POSTIT_SHOW)),
875     sPostItHide(SW_RES(ST_POSTIT_HIDE)),
876     sPostItDelete(SW_RES(ST_POSTIT_DELETE)),
877 
878         pHiddenShell(0),
879     pActiveShell(0),
880     pConfig(SW_MOD()->GetNavigationConfig()),
881 
882         nActiveBlock(0),
883     nHiddenBlock(0),
884 
885         nRootType(USHRT_MAX),
886         nLastSelType(USHRT_MAX),
887         nOutlineLevel(MAXLEVEL),
888 
889         bIsActive(sal_True),
890         bIsConstant(sal_False),
891         bIsHidden(sal_False),
892         bDocChgdInDragging(sal_False),
893         bIsInternalDrag(sal_False),
894         bIsRoot(sal_False),
895         bIsIdleClear(sal_False),
896         bIsLastReadOnly(sal_False),
897         bIsOutlineMoveable(sal_True),
898         bViewHasChanged(sal_False),
899         bIsImageListInitialized(sal_False),
900         bIsKeySpace(sal_False){
901     sal_uInt16 i;
902 
903     SetHelpId(HID_NAVIGATOR_TREELIST);
904 
905     SetNodeDefaultImages();
906     SetDoubleClickHdl(LINK(this, SwContentTree, ContentDoubleClickHdl));
907     SetDragDropMode(SV_DRAGDROP_APP_COPY);
908     for( i = 0; i < CONTENT_TYPE_MAX; i++)
909     {
910         aActiveContentArr[i]    = 0;
911         aHiddenContentArr[i]    = 0;
912     }
913     for( i = 0; i < CONTEXT_COUNT; i++  )
914     {
915         aContextStrings[i] = SW_RESSTR(i+ST_CONTEXT_FIRST);
916     }
917     nActiveBlock = pConfig->GetActiveBlock();
918     aUpdTimer.SetTimeoutHdl(LINK(this, SwContentTree, TimerUpdate));
919     aUpdTimer.SetTimeout(1000);
920     Clear();
921     EnableContextMenuHandling();
922     SetStyle( GetStyle() | WB_QUICK_SEARCH );
923 }
924 
925 /***************************************************************************
926     Beschreibung:
927 ***************************************************************************/
928 
929 
930 SwContentTree::~SwContentTree()
931 {
932     Clear(); // vorher gfs. Inhaltstypen loeschen
933     bIsInDrag = sal_False;
934 }
935 
936 String SwContentTree::GetEntryAltText( SvLBoxEntry* pEntry ) const
937 {
938     if( pEntry == NULL)
939         return String();
940 
941     SwContent* pCnt = (SwContent*)pEntry->GetUserData();
942     if( pCnt == NULL || pCnt->GetParent() == NULL)
943         return String();
944 
945     sal_uInt16 nJumpType = pCnt->GetParent()->GetType();
946     SdrObject* pTemp;
947 
948     switch(nJumpType)
949     {
950         case CONTENT_TYPE_DRAWOBJECT:
951             {
952                 SdrView* pDrawView = pActiveShell->GetDrawView();
953                 if (pDrawView)
954                 {
955                     SdrModel* pDrawModel = pActiveShell->GetDoc()->GetDrawModel();
956                     SdrPage* pPage = pDrawModel->GetPage(0);
957                     const sal_uInt32 nCount = pPage->GetObjCount();
958                     for( sal_uInt32 i=0; i< nCount; i++ )
959                     {
960                         pTemp = pPage->GetObj(i);
961                         sal_uInt16 nCmpId;
962                         switch( pTemp->GetObjIdentifier() )
963                         {
964                         case OBJ_GRUP:
965                         case OBJ_TEXT:
966                         case OBJ_TEXTEXT:
967                         case OBJ_wegFITTEXT:
968                         case OBJ_LINE:
969                         case OBJ_RECT:
970                             //caoxueqin added custom shape
971                         case OBJ_CUSTOMSHAPE:
972                             //end 2005/08/05
973                         case OBJ_CIRC:
974                         case OBJ_SECT:
975                         case OBJ_CARC:
976                         case OBJ_CCUT:
977                         case OBJ_POLY:
978                         case OBJ_PLIN:
979                         case OBJ_PATHLINE:
980                         case OBJ_PATHFILL:
981                         case OBJ_FREELINE:
982                         case OBJ_FREEFILL:
983                         case OBJ_PATHPOLY:
984                         case OBJ_PATHPLIN:
985                         case OBJ_CAPTION:
986                             nCmpId = OBJ_GRUP;
987                             break;
988                         default:
989                             nCmpId = pTemp->GetObjIdentifier();
990                         }
991                         if(nCmpId == OBJ_GRUP /*pTemp->ISA(SdrObjGroup)*/ && pTemp->GetName() == pCnt->GetName())
992                         {
993                             return pTemp->GetTitle();
994                         }
995                         //Commented End
996                     }
997                 }
998             }
999             break;
1000         case CONTENT_TYPE_GRAPHIC   :
1001             {
1002                 if( pActiveShell && pActiveShell->GetDoc() )
1003                 {
1004                     const SwFlyFrmFmt* pFrmFmt = pActiveShell->GetDoc()->FindFlyByName( pCnt->GetName(), 0);
1005                     if( pFrmFmt )
1006                     {
1007 //                        SwNodeIndex aIdx( *(pFrmFmt->GetCntnt().GetCntntIdx()), 1 );
1008 //                        const SwGrfNode* pGrfNd = aIdx.GetNode().GetGrfNode();
1009 //                        if( pGrfNd )
1010 //                            return pGrfNd->GetAlternateText();
1011                         return pFrmFmt->GetObjTitle();
1012                     }
1013                 }
1014             }
1015             break;
1016         case CONTENT_TYPE_OLE       :
1017         case CONTENT_TYPE_FRAME     :
1018             {
1019                 //Can't find the GetAlternateText function. Need to verify again.
1020                 const SwFlyFrmFmt* pFlyFmt = pActiveShell->GetDoc()->FindFlyByName( pCnt->GetName(), 0);
1021                 if( pFlyFmt )
1022                     return pFlyFmt->/*GetAlternateText*/GetName();
1023             }
1024             break;
1025     }
1026     return String();
1027 }
1028 
1029 String SwContentTree::GetEntryLongDescription( SvLBoxEntry* pEntry ) const
1030 {
1031     if( pEntry == NULL)
1032         return String();
1033 
1034     SwContent* pCnt = (SwContent*)pEntry->GetUserData();
1035     if( pCnt == NULL || pCnt->GetParent() == NULL)
1036         return String();
1037 
1038     sal_uInt16 nJumpType = pCnt->GetParent()->GetType();
1039     SdrObject* pTemp;
1040 
1041     switch(nJumpType)
1042     {
1043         case CONTENT_TYPE_DRAWOBJECT:
1044             {
1045                 SdrView* pDrawView = pActiveShell->GetDrawView();
1046                 if (pDrawView)
1047                 {
1048                     SdrModel* pDrawModel = pActiveShell->GetDoc()->GetDrawModel();
1049                     SdrPage* pPage = pDrawModel->GetPage(0);
1050                     sal_uInt32 nCount = pPage->GetObjCount();
1051                     for( sal_uInt32 i=0; i< nCount; i++ )
1052                     {
1053                         pTemp = pPage->GetObj(i);
1054                         sal_uInt16 nCmpId;
1055                         switch( pTemp->GetObjIdentifier() )
1056                         {
1057                         case OBJ_GRUP:
1058                         case OBJ_TEXT:
1059                         case OBJ_TEXTEXT:
1060                         case OBJ_wegFITTEXT:
1061                         case OBJ_LINE:
1062                         case OBJ_RECT:
1063                             //caoxueqin added custom shape
1064                         case OBJ_CUSTOMSHAPE:
1065                             //end 2005/08/05
1066                         case OBJ_CIRC:
1067                         case OBJ_SECT:
1068                         case OBJ_CARC:
1069                         case OBJ_CCUT:
1070                         case OBJ_POLY:
1071                         case OBJ_PLIN:
1072                         case OBJ_PATHLINE:
1073                         case OBJ_PATHFILL:
1074                         case OBJ_FREELINE:
1075                         case OBJ_FREEFILL:
1076                         case OBJ_PATHPOLY:
1077                         case OBJ_PATHPLIN:
1078                         case OBJ_CAPTION:
1079                             nCmpId = OBJ_GRUP;
1080                             break;
1081                         default:
1082                             nCmpId = pTemp->GetObjIdentifier();
1083                         }
1084                         if(nCmpId == OBJ_GRUP /*pTemp->ISA(SdrObjGroup)*/ && pTemp->GetName() == pCnt->GetName())
1085                         {
1086                             return pTemp->GetDescription();
1087                         }
1088                         //Commented End
1089                     }
1090                 }
1091             }
1092             break;
1093         case CONTENT_TYPE_GRAPHIC   :
1094         case CONTENT_TYPE_OLE       :
1095         case CONTENT_TYPE_FRAME     :
1096             {
1097                 //Can't find the function "GetLongDescription". Need to verify again.
1098                 const SwFlyFrmFmt* pFlyFmt = pActiveShell->GetDoc()->FindFlyByName( pCnt->GetName(), 0);
1099                 if( pFlyFmt )
1100                     return pFlyFmt->GetDescription();
1101             }
1102             break;
1103     }
1104     return String();
1105 }
1106 
1107 /***************************************************************************
1108     Drag&Drop methods
1109 ***************************************************************************/
1110 
1111 void SwContentTree::StartDrag( sal_Int8 nAction, const Point& rPosPixel )
1112 {
1113     if( !bIsRoot || nRootType != CONTENT_TYPE_OUTLINE )
1114     {
1115         ReleaseMouse();
1116 
1117         TransferDataContainer* pContainer = new TransferDataContainer;
1118         uno::Reference<
1119             datatransfer::XTransferable > xRef( pContainer );
1120 
1121         sal_Int8 nDragMode = DND_ACTION_COPYMOVE | DND_ACTION_LINK;
1122         if( FillTransferData( *pContainer, nDragMode ))
1123         {
1124             SwContentTree::SetInDrag(sal_True);
1125             pContainer->StartDrag( this, nDragMode, GetDragFinishedHdl() );
1126         }
1127     }
1128     else
1129         SvTreeListBox::StartDrag( nAction, rPosPixel );
1130 }
1131 
1132 void SwContentTree::DragFinished( sal_Int8 nAction )
1133 {
1134     //to prevent the removing of the selected entry in external drag and drop
1135     // the drag action mustn't be MOVE
1136     SvTreeListBox::DragFinished( bIsInternalDrag ? nAction : DND_ACTION_COPY );
1137     SwContentTree::SetInDrag(sal_False);
1138     bIsInternalDrag = sal_False;
1139 }
1140 
1141 /***************************************************************************
1142     Beschreibung:   QueryDrop wird im Navigator ausgefuehrt
1143 ***************************************************************************/
1144 sal_Int8 SwContentTree::AcceptDrop( const AcceptDropEvent& rEvt )
1145 {
1146     sal_Int8 nRet = DND_ACTION_NONE;
1147     if( bIsRoot )
1148     {
1149         if( bIsOutlineMoveable )
1150             nRet = SvTreeListBox::AcceptDrop( rEvt );
1151     }
1152     else if( !bIsInDrag )
1153         nRet = GetParentWindow()->AcceptDrop( rEvt );
1154     return nRet;
1155 }
1156 
1157 /***************************************************************************
1158     Beschreibung:   Drop wird im Navigator ausgefuehrt
1159 ***************************************************************************/
1160 sal_Int8 SwContentTree::ExecuteDrop( const ExecuteDropEvent& rEvt )
1161 {
1162     if( bIsRoot )
1163         return SvTreeListBox::ExecuteDrop( rEvt );
1164     return bIsInDrag ? DND_ACTION_NONE : GetParentWindow()->ExecuteDrop(rEvt);
1165 }
1166 
1167 
1168 /***************************************************************************
1169     Beschreibung:   Handler fuer Dragging und ContextMenu
1170 ***************************************************************************/
1171 PopupMenu* SwContentTree::CreateContextMenu( void )
1172 {
1173     PopupMenu* pPop = new PopupMenu;
1174     PopupMenu* pSubPop1 = new PopupMenu;
1175     PopupMenu* pSubPop2 = new PopupMenu;
1176     PopupMenu* pSubPop3 = new PopupMenu;
1177     PopupMenu* pSubPop4 = new PopupMenu; // Edit
1178 
1179     sal_uInt16 i;
1180     for(i = 1; i <= MAXLEVEL; i++ )
1181     {
1182         pSubPop1->InsertItem( i + 100, String::CreateFromInt32(i));
1183     }
1184     pSubPop1->CheckItem(100 + nOutlineLevel);
1185     for(i=0; i < 3; i++ )
1186     {
1187         pSubPop2->InsertItem( i + 201, aContextStrings[
1188                 ST_HYPERLINK - ST_CONTEXT_FIRST + i]);
1189     }
1190     pSubPop2->CheckItem( 201 +
1191                     GetParentWindow()->GetRegionDropMode());
1192     //Liste der offenen Dateien einfuegen
1193     sal_uInt16 nId = 301;
1194     const SwView* pActiveView = ::GetActiveView();
1195     SwView *pView = SwModule::GetFirstView();
1196     while (pView)
1197     {
1198         String sInsert = pView->GetDocShell()->GetTitle();
1199         if(pView == pActiveView)
1200         {
1201             sInsert += '(';
1202             sInsert += aContextStrings[ ST_ACTIVE - ST_CONTEXT_FIRST];
1203             sInsert += ')';
1204         }
1205         pSubPop3->InsertItem(nId, sInsert);
1206         if(bIsConstant && pActiveShell == &pView->GetWrtShell())
1207             pSubPop3->CheckItem(nId);
1208         pView = SwModule::GetNextView(pView);
1209         nId++;
1210     }
1211     pSubPop3->InsertItem(nId++, aContextStrings[ST_ACTIVE_VIEW - ST_CONTEXT_FIRST]);
1212     if(pHiddenShell)
1213     {
1214         String sHiddenEntry = pHiddenShell->GetView().GetDocShell()->GetTitle();
1215         sHiddenEntry += C2S(" ( ");
1216         sHiddenEntry += aContextStrings[ ST_HIDDEN - ST_CONTEXT_FIRST];
1217         sHiddenEntry += C2S(" )");
1218         pSubPop3->InsertItem(nId, sHiddenEntry);
1219     }
1220 
1221     if(bIsActive)
1222         pSubPop3->CheckItem( --nId );
1223     else if(bIsHidden)
1224         pSubPop3->CheckItem( nId );
1225 
1226     pPop->InsertItem( 1, aContextStrings[ST_OUTLINE_LEVEL - ST_CONTEXT_FIRST]);
1227     pPop->InsertItem(2, aContextStrings[ST_DRAGMODE - ST_CONTEXT_FIRST]);
1228     pPop->InsertItem(3, aContextStrings[ST_DISPLAY - ST_CONTEXT_FIRST]);
1229     //jetzt noch bearbeiten
1230     SvLBoxEntry* pEntry = 0;
1231     //Bearbeiten nur, wenn die angezeigten Inhalte aus der aktiven View kommen
1232     if((bIsActive || pActiveShell == pActiveView->GetWrtShellPtr())
1233             && 0 != (pEntry = FirstSelected()) && lcl_IsContent(pEntry))
1234     {
1235         const SwContentType* pContType = ((SwContent*)pEntry->GetUserData())->GetParent();
1236         const sal_uInt16 nContentType = pContType->GetType();
1237         sal_Bool bReadonly = pActiveShell->GetView().GetDocShell()->IsReadOnly();
1238         sal_Bool bVisible = !((SwContent*)pEntry->GetUserData())->IsInvisible();
1239         sal_Bool bProtected = ((SwContent*)pEntry->GetUserData())->IsProtect();
1240         sal_Bool bEditable = pContType->IsEditable() &&
1241             ((bVisible && !bProtected) ||CONTENT_TYPE_REGION == nContentType);
1242         sal_Bool bDeletable = pContType->IsDeletable() &&
1243             ((bVisible && !bProtected) ||CONTENT_TYPE_REGION == nContentType);
1244         sal_Bool bRenamable = bEditable && !bReadonly &&
1245             (CONTENT_TYPE_TABLE == nContentType ||
1246                 CONTENT_TYPE_FRAME == nContentType ||
1247                 CONTENT_TYPE_GRAPHIC == nContentType ||
1248                 CONTENT_TYPE_OLE == nContentType ||
1249                 CONTENT_TYPE_BOOKMARK == nContentType ||
1250                 CONTENT_TYPE_REGION == nContentType||
1251                 CONTENT_TYPE_INDEX == nContentType);
1252 
1253         if(!bReadonly && (bEditable || bDeletable))
1254         {
1255             sal_Bool bSubPop4 = sal_False;
1256             if(CONTENT_TYPE_INDEX == nContentType)
1257             {
1258                 bSubPop4 = sal_True;
1259                 pSubPop4->InsertItem(401, sRemoveIdx);
1260                 pSubPop4->InsertItem(402, sUpdateIdx);
1261 
1262                 const SwTOXBase* pBase = ((SwTOXBaseContent*)pEntry->GetUserData())->GetTOXBase();
1263                 if(!pBase->IsTOXBaseInReadonly())
1264                     pSubPop4->InsertItem(403, aContextStrings[ST_EDIT_ENTRY - ST_CONTEXT_FIRST]);
1265                 pSubPop4->InsertItem(405, sReadonlyIdx);
1266 
1267                 pSubPop4->CheckItem( 405, pActiveShell->IsTOXBaseReadonly(*pBase));
1268                 pSubPop4->InsertItem(501, aContextStrings[ST_DELETE_ENTRY - ST_CONTEXT_FIRST]);
1269             }
1270             else if(CONTENT_TYPE_TABLE == nContentType && !bReadonly)
1271             {
1272                 bSubPop4 = sal_True;
1273                 pSubPop4->InsertItem(403, aContextStrings[ST_EDIT_ENTRY - ST_CONTEXT_FIRST]);
1274                 pSubPop4->InsertItem(404, sUnprotTbl);
1275                 sal_Bool bFull = sal_False;
1276                 String sTblName = ((SwContent*)pEntry->GetUserData())->GetName();
1277                 sal_Bool bProt =pActiveShell->HasTblAnyProtection( &sTblName, &bFull );
1278                 pSubPop4->EnableItem(403, !bFull );
1279                 pSubPop4->EnableItem(404, bProt );
1280                 pSubPop4->InsertItem(501, aContextStrings[ST_DELETE_ENTRY - ST_CONTEXT_FIRST]);
1281             }
1282             else if(bEditable || bDeletable)
1283             {
1284 
1285                 if(bEditable && bDeletable)
1286                 {
1287                     pSubPop4->InsertItem(403, aContextStrings[ST_EDIT_ENTRY - ST_CONTEXT_FIRST]);
1288                     pSubPop4->InsertItem(501, aContextStrings[ST_DELETE_ENTRY - ST_CONTEXT_FIRST]);
1289                     bSubPop4 = sal_True;
1290                 }
1291                 else if(bEditable)
1292                     pPop->InsertItem(403, aContextStrings[ST_EDIT_ENTRY - ST_CONTEXT_FIRST]);
1293                 else if(bDeletable)
1294                 {
1295                     pSubPop4->InsertItem(501, aContextStrings[ST_DELETE_ENTRY - ST_CONTEXT_FIRST]);
1296                 }
1297             }
1298             //Rename object
1299             if(bRenamable)
1300             {
1301                 if(bSubPop4)
1302                     pSubPop4->InsertItem(502, sRename);
1303                 else
1304                     pPop->InsertItem(502, sRename);
1305             }
1306 
1307             if(bSubPop4)
1308             {
1309                 pPop->InsertItem(4, pContType->GetSingleName());
1310                 pPop->SetPopupMenu(4, pSubPop4);
1311             }
1312         }
1313     }
1314     else if( pEntry )
1315     {
1316         SwContentType* pType = (SwContentType*)pEntry->GetUserData();
1317         if ( (pType->GetType() == CONTENT_TYPE_POSTIT) &&  (!pActiveShell->GetView().GetDocShell()->IsReadOnly()) && ( pType->GetMemberCount() > 0) )
1318         {
1319                 pSubPop4->InsertItem(600, sPostItShow );
1320                 pSubPop4->InsertItem(601, sPostItHide );
1321                 pSubPop4->InsertItem(602, sPostItDelete );
1322                 /*
1323                 pSubPop4->InsertItem(603,rtl::OUString::createFromAscii("Sort"));
1324                 PopupMenu* pMenuSort = new PopupMenu;
1325                 pMenuSort->InsertItem(604,rtl::OUString::createFromAscii("By Position"));
1326                 pMenuSort->InsertItem(605,rtl::OUString::createFromAscii("By Author"));
1327                 pMenuSort->InsertItem(606,rtl::OUString::createFromAscii("By Date"));
1328                 pSubPop4->SetPopupMenu(603, pMenuSort);
1329                 */
1330                 pPop->InsertItem(4, pType->GetSingleName());
1331                 pPop->SetPopupMenu(4, pSubPop4);
1332         }
1333     }
1334 
1335     pPop->SetPopupMenu( 1, pSubPop1 );
1336     pPop->SetPopupMenu( 2, pSubPop2 );
1337     pPop->SetPopupMenu( 3, pSubPop3 );
1338     return pPop;
1339 
1340 }
1341 /***************************************************************************
1342     Beschreibung:   Einrueckung fuer outlines (und sections)
1343 ***************************************************************************/
1344 
1345 
1346 long    SwContentTree::GetTabPos( SvLBoxEntry* pEntry, SvLBoxTab* pTab)
1347 {
1348     sal_uInt16 nLevel = 0;
1349     if(lcl_IsContent(pEntry))
1350     {
1351         nLevel++;
1352         SwContent* pCnt = (SwContent *) pEntry->GetUserData();
1353         const SwContentType*    pParent;
1354         if(pCnt &&  0 != (pParent = pCnt->GetParent()))
1355         {
1356             if(pParent->GetType() == CONTENT_TYPE_OUTLINE)
1357                 nLevel = nLevel + ((SwOutlineContent*)pCnt)->GetOutlineLevel();
1358             else if(pParent->GetType() == CONTENT_TYPE_REGION)
1359                 nLevel = nLevel + ((SwRegionContent*)pCnt)->GetRegionLevel();
1360         }
1361     }
1362     sal_uInt16 nBasis = bIsRoot ? 0 : 5;
1363     return nLevel * 10 + nBasis + pTab->GetPos();  //empirisch ermittelt
1364 }
1365 
1366 /***************************************************************************
1367     Beschreibung:   Inhalte werden erst auf Anforderung in die Box eingefuegt
1368 ***************************************************************************/
1369 
1370 
1371 void  SwContentTree::RequestingChilds( SvLBoxEntry* pParent )
1372 {
1373     // ist es ein Inhaltstyp?
1374     if(lcl_IsContentType(pParent))
1375     {
1376         if(!pParent->HasChilds())
1377         {
1378             DBG_ASSERT(pParent->GetUserData(), "keine UserData?");
1379             SwContentType* pCntType = (SwContentType*)pParent->GetUserData();
1380 
1381             sal_uInt16 nCount = pCntType->GetMemberCount();
1382             for(sal_uInt16 i = 0; i < nCount; i++)
1383             {
1384                 const SwContent* pCnt = pCntType->GetMember(i);
1385                 if(pCnt)
1386                 {
1387                     String sEntry = pCnt->GetName();
1388                     if(!sEntry.Len())
1389                         sEntry = sSpace;
1390                     SvLBoxEntry* pChild = InsertEntry(sEntry, pParent,
1391                             sal_False, LIST_APPEND, (void*)pCnt);
1392                     //Solution: If object is marked , the corresponding entry is set true ,
1393                     //else the corresponding entry is set false .
1394                     //==================================================
1395                     SdrObject * pObj = GetDrawingObjectsByContent(pCnt);
1396                     if(pChild)
1397                           pChild->SetMarked(sal_False);
1398                     if(pObj)
1399                     {
1400                         SdrView* pDrawView = pActiveShell->GetDrawView();
1401                         SdrPageView* pPV = pDrawView->/*GetPageViewPvNum*/GetSdrPageView(/*0*/);
1402                         if( pPV )
1403                         {
1404                             sal_Bool Marked = pDrawView->IsObjMarked(pObj);
1405                             if(Marked)
1406                             {
1407                                 //sEntry += String::CreateFromAscii(" *");
1408                                 pChild->SetMarked(sal_True);
1409                             }
1410 
1411                         }
1412                     }
1413                 }
1414             }
1415         }
1416     }
1417 }
1418 /***************************************************************************
1419     Beschreibung:   Expand - Zustand fuer Inhaltstypen merken
1420 ***************************************************************************/
1421 
1422 //Solution: Get drawing Objects by content .
1423 SdrObject* SwContentTree::GetDrawingObjectsByContent(const SwContent *pCnt)
1424 {
1425     SdrObject *pRetObj = NULL;
1426     sal_uInt16 nJumpType = pCnt->GetParent()->GetType();
1427     switch(nJumpType)
1428     {
1429         case CONTENT_TYPE_DRAWOBJECT:
1430         {
1431             SdrView* pDrawView = pActiveShell->GetDrawView();
1432             if (pDrawView)
1433             {
1434                 SdrModel* pDrawModel = pActiveShell->GetDoc()->GetDrawModel();
1435                 SdrPage* pPage = pDrawModel->GetPage(0);
1436                 sal_uInt32 nCount = pPage->GetObjCount();
1437 
1438                 for( sal_uInt32 i=0; i< nCount; i++ )
1439                 {
1440                     SdrObject* pTemp = pPage->GetObj(i);
1441                     if( pTemp->GetName() == pCnt->GetName())
1442                     {
1443                         pRetObj = pTemp;
1444                         break;
1445                     }
1446                 }
1447             }
1448             break;
1449         }
1450         default:
1451             pRetObj = NULL;
1452     }
1453     return pRetObj;
1454 }
1455 
1456 sal_Bool  SwContentTree::Expand( SvLBoxEntry* pParent )
1457 {
1458     if(!bIsRoot)
1459     {
1460         if(lcl_IsContentType(pParent))
1461         {
1462             SwContentType* pCntType = (SwContentType*)pParent->GetUserData();
1463             sal_uInt16 nOr = 1 << pCntType->GetType(); //linear -> Bitposition
1464             if(bIsActive || bIsConstant)
1465             {
1466                 nActiveBlock |= nOr;
1467                 pConfig->SetActiveBlock(nActiveBlock);
1468             }
1469             else
1470                 nHiddenBlock |= nOr;
1471         }
1472     }
1473     return SvTreeListBox::Expand(pParent);
1474 }
1475 /***************************************************************************
1476     Beschreibung:   Collapse - Zustand fuer Inhaltstypen merken
1477 ***************************************************************************/
1478 
1479 
1480 sal_Bool  SwContentTree::Collapse( SvLBoxEntry* pParent )
1481 {
1482     sal_Bool bRet;
1483     if(!bIsRoot)
1484     {
1485         if(lcl_IsContentType(pParent))
1486         {
1487             SwContentType* pCntType = (SwContentType*)pParent->GetUserData();
1488             sal_uInt16 nAnd = 1 << pCntType->GetType();
1489             nAnd = ~nAnd;
1490             if(bIsActive || bIsConstant)
1491             {
1492                 nActiveBlock &= nAnd;
1493                 pConfig->SetActiveBlock(nActiveBlock);
1494             }
1495             else
1496                 nHiddenBlock &= nAnd;
1497         }
1498             bRet = SvTreeListBox::Collapse(pParent);
1499     }
1500     else
1501         bRet = sal_False;
1502     return bRet;
1503 }
1504 
1505 
1506 /***************************************************************************
1507     Beschreibung:   Auch auf Doppelclick wird zunaechst nur aufgeklappt
1508 ***************************************************************************/
1509 
1510 
1511 IMPL_LINK( SwContentTree, ContentDoubleClickHdl, SwContentTree *, EMPTYARG )
1512 {
1513     SvLBoxEntry* pEntry = GetCurEntry();
1514     // ist es ein Inhaltstyp?
1515     DBG_ASSERT(pEntry, "kein aktueller Eintrag!");
1516     if(pEntry)
1517     {
1518         if(lcl_IsContentType(pEntry))
1519             RequestingChilds(pEntry);
1520         else if(bIsActive || bIsConstant)
1521         {
1522             if(bIsConstant)
1523             {
1524                 pActiveShell->GetView().GetViewFrame()->GetWindow().ToTop();
1525             }
1526             //Inhaltstyp anspringen:
1527             SwContent* pCnt = (SwContent*)pEntry->GetUserData();
1528             DBG_ASSERT( pCnt, "keine UserData");
1529             GotoContent(pCnt);
1530             if(pCnt->GetParent()->GetType() == CONTENT_TYPE_FRAME)
1531                 pActiveShell->EnterStdMode();
1532         }
1533     }
1534     return 0;
1535 }
1536 
1537 /***************************************************************************
1538     Beschreibung:   Anzeigen der Datei
1539 ***************************************************************************/
1540 
1541 
1542 void SwContentTree::Display( sal_Bool bActive )
1543 {
1544     if(!bIsImageListInitialized)
1545     {
1546         sal_uInt16 nResId = GetSettings().GetStyleSettings().GetHighContrastMode() ? IMG_NAVI_ENTRYBMPH : IMG_NAVI_ENTRYBMP;
1547         aEntryImages = ImageList(SW_RES(nResId));
1548         bIsImageListInitialized = sal_True;
1549     }
1550     // erst den selektierten Eintrag auslesen, um ihn spaeter evtl. wieder
1551     // zu selektieren -> die UserDaten sind hier nicht mehr gueltig!
1552     SvLBoxEntry* pOldSelEntry = FirstSelected();
1553     String sEntryName;  // Name des Eintrags
1554     sal_uInt16 nEntryRelPos = 0; // rel. Pos zu seinem Parent
1555     sal_uInt32 nOldEntryCount = GetEntryCount();
1556     sal_Int32 nOldScrollPos = 0;
1557     if(pOldSelEntry)
1558     {
1559         ScrollBar* pVScroll = GetVScroll();
1560         if(pVScroll && pVScroll->IsVisible())
1561             nOldScrollPos = pVScroll->GetThumbPos();
1562 
1563         sEntryName = GetEntryText(pOldSelEntry);
1564         if(GetParent(pOldSelEntry))
1565         {
1566             nEntryRelPos = (sal_uInt16)(GetModel()->GetAbsPos(pOldSelEntry) - GetModel()->GetAbsPos(GetParent(pOldSelEntry)));
1567         }
1568     }
1569     Clear();
1570     SetUpdateMode( sal_False );
1571     if(bActive && !bIsConstant && !bIsActive)
1572         bIsActive = bActive;
1573     bIsHidden = !bActive;
1574     SwWrtShell* pShell = GetWrtShell();
1575     sal_Bool bReadOnly = pShell ? pShell->GetView().GetDocShell()->IsReadOnly() : sal_True;
1576     if(bReadOnly != bIsLastReadOnly)
1577     {
1578         bIsLastReadOnly = bReadOnly;
1579         sal_Bool bDisable =  pShell == 0 || bReadOnly;
1580         SwNavigationPI* pNavi = GetParentWindow();
1581         pNavi->aContentToolBox.EnableItem(FN_ITEM_UP , !bDisable);
1582         pNavi->aContentToolBox.EnableItem(FN_ITEM_DOWN, !bDisable);
1583         pNavi->aContentToolBox.EnableItem(FN_ITEM_LEFT, !bDisable);
1584         pNavi->aContentToolBox.EnableItem(FN_ITEM_RIGHT, !bDisable);
1585         pNavi->aContentToolBox.EnableItem(FN_SELECT_SET_AUTO_BOOKMARK, !bDisable);
1586     }
1587     if(pShell)
1588     {
1589         SvLBoxEntry* pSelEntry = 0;
1590         if(nRootType == USHRT_MAX)
1591         {
1592             for(sal_uInt16 nCntType = CONTENT_TYPE_OUTLINE;
1593                         nCntType <= CONTENT_TYPE_DRAWOBJECT; nCntType++ )
1594             {
1595                 SwContentType** ppContentT = bActive ?
1596                                 &aActiveContentArr[nCntType] :
1597                                     &aHiddenContentArr[nCntType];
1598                 if(!*ppContentT)
1599                     (*ppContentT) = new SwContentType(pShell, nCntType, nOutlineLevel );
1600 
1601 
1602                 String sEntry = (*ppContentT)->GetName();
1603                 SvLBoxEntry* pEntry;
1604                 const Image& rImage = aEntryImages.GetImage(SID_SW_START + nCntType);
1605                 sal_Bool bChOnDemand = 0 != (*ppContentT)->GetMemberCount();
1606                 pEntry = InsertEntry(sEntry, rImage, rImage,
1607                                 0, bChOnDemand, LIST_APPEND, (*ppContentT));
1608                 if(nCntType == nLastSelType)
1609                     pSelEntry = pEntry;
1610                 sal_Int32 nExpandOptions = bIsActive || bIsConstant ?
1611                                             nActiveBlock :
1612                                                 nHiddenBlock;
1613                 if(nExpandOptions & (1 << nCntType))
1614                 {
1615                     Expand(pEntry);
1616                     if(nEntryRelPos && nCntType == nLastSelType)
1617                     {
1618                         // jetzt vielleicht noch ein Child selektieren
1619                         SvLBoxEntry* pChild = pEntry;
1620                         SvLBoxEntry* pTemp = 0;
1621                         sal_uInt16 nPos = 1;
1622                         while(0 != (pChild = Next(pChild)))
1623                         {
1624                             // der alte Text wird leicht bevorzugt
1625                             if(sEntryName == GetEntryText(pChild) ||
1626                                 nPos == nEntryRelPos )
1627                             {
1628                                 pSelEntry = pChild;
1629                                 break;
1630                             }
1631                             pTemp = pChild;
1632                             nPos++;
1633                         }
1634                         if(!pSelEntry || lcl_IsContentType(pSelEntry))
1635                             pSelEntry = pTemp;
1636                     }
1637 
1638                 }
1639             }
1640             if(pSelEntry)
1641             {
1642                 MakeVisible(pSelEntry);
1643                 Select(pSelEntry);
1644             }
1645             else
1646                 nOldScrollPos = 0;
1647         }
1648         else
1649         {
1650             SwContentType** ppRootContentT = bActive ?
1651                                 &aActiveContentArr[nRootType] :
1652                                     &aHiddenContentArr[nRootType];
1653             if(!(*ppRootContentT))
1654                 (*ppRootContentT) = new SwContentType(pShell, nRootType, nOutlineLevel );
1655             const Image& rImage = aEntryImages.GetImage(20000 + nRootType);
1656             SvLBoxEntry* pParent = InsertEntry(
1657                     (*ppRootContentT)->GetName(), rImage, rImage,
1658                         0, sal_False, LIST_APPEND, *ppRootContentT);
1659 
1660             for(sal_uInt16 i = 0; i < (*ppRootContentT)->GetMemberCount(); i++ )
1661             {
1662                 const SwContent* pCnt = (*ppRootContentT)->GetMember(i);
1663                 if(pCnt)
1664                 {
1665                     String sEntry = pCnt->GetName();
1666                     if(!sEntry.Len())
1667                         sEntry = sSpace;
1668                     InsertEntry( sEntry, pParent,
1669                                 sal_False, LIST_APPEND, (void*)pCnt);
1670                 }
1671             }
1672             Expand(pParent);
1673             if( nRootType == CONTENT_TYPE_OUTLINE && bIsActive )
1674             {
1675                 //feststellen, wo der Cursor steht
1676                 const sal_uInt16 nActPos = pShell->GetOutlinePos(MAXLEVEL);
1677                 SvLBoxEntry* pEntry = First();
1678 
1679                 while( 0 != (pEntry = Next(pEntry)) )
1680                 {
1681                     if(((SwOutlineContent*)pEntry->GetUserData())->GetPos() == nActPos)
1682                     {
1683                         MakeVisible(pEntry);
1684                         Select(pEntry);
1685                     }
1686                 }
1687 
1688             }
1689             else
1690             {
1691                 // jetzt vielleicht noch ein Child selektieren
1692                 SvLBoxEntry* pChild = pParent;
1693                 SvLBoxEntry* pTemp = 0;
1694                 sal_uInt16 nPos = 1;
1695                 while(0 != (pChild = Next(pChild)))
1696                 {
1697                     // der alte Text wird leicht bevorzugt
1698                     if(sEntryName == GetEntryText(pChild) ||
1699                         nPos == nEntryRelPos )
1700                     {
1701                         pSelEntry = pChild;
1702                         break;
1703                     }
1704                     pTemp = pChild;
1705                     nPos++;
1706                 }
1707                 if(!pSelEntry)
1708                     pSelEntry = pTemp;
1709                 if(pSelEntry)
1710                 {
1711                     MakeVisible(pSelEntry);
1712                     Select(pSelEntry);
1713                 }
1714             }
1715         }
1716     }
1717     SetUpdateMode( sal_True );
1718     ScrollBar* pVScroll = GetVScroll();
1719     if(GetEntryCount() == nOldEntryCount &&
1720         nOldScrollPos && pVScroll && pVScroll->IsVisible()
1721         && pVScroll->GetThumbPos() != nOldScrollPos)
1722     {
1723         sal_Int32 nDelta = pVScroll->GetThumbPos() - nOldScrollPos;
1724         ScrollOutputArea( (short)nDelta );
1725     }
1726 
1727 }
1728 
1729 /***************************************************************************
1730     Beschreibung:   Im Clear muessen auch die ContentTypes geloescht werden
1731 ***************************************************************************/
1732 
1733 
1734 void SwContentTree::Clear()
1735 {
1736     SetUpdateMode(sal_False);
1737     SvTreeListBox::Clear();
1738     SetUpdateMode(sal_True);
1739 }
1740 
1741 /***************************************************************************
1742     Beschreibung:
1743 ***************************************************************************/
1744 
1745 sal_Bool SwContentTree::FillTransferData( TransferDataContainer& rTransfer,
1746                                             sal_Int8& rDragMode )
1747 {
1748     SwWrtShell* pWrtShell = GetWrtShell();
1749     DBG_ASSERT(pWrtShell, "keine Shell!");
1750     SvLBoxEntry* pEntry = GetCurEntry();
1751     if(!pEntry || lcl_IsContentType(pEntry) || !pWrtShell)
1752         return sal_False;
1753     String sEntry;
1754     SwContent* pCnt = ((SwContent*)pEntry->GetUserData());
1755 
1756     sal_uInt16 nActType = pCnt->GetParent()->GetType();
1757     String sUrl;
1758     sal_Bool bOutline = sal_False;
1759     String sOutlineText;
1760     switch( nActType )
1761     {
1762         case CONTENT_TYPE_OUTLINE:
1763         {
1764             sal_uInt16 nPos = ((SwOutlineContent*)pCnt)->GetPos();
1765             DBG_ASSERT(nPos < pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineNodesCount(),
1766                        "outlinecnt veraendert");
1767 
1768             // #100738# make sure outline may actually be copied
1769             if( pWrtShell->IsOutlineCopyable( nPos ) )
1770             {
1771                 const SwNumRule* pOutlRule = pWrtShell->GetOutlineNumRule();
1772                 const SwTxtNode* pTxtNd =
1773                         pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineNode(nPos);
1774                 if( pTxtNd && pOutlRule && pTxtNd->IsNumbered())
1775                 {
1776                     SwNumberTree::tNumberVector aNumVector =
1777                         pTxtNd->GetNumberVector();
1778                     for( sal_Int8 nLevel = 0;
1779                          nLevel <= pTxtNd->GetActualListLevel();
1780                          nLevel++ )
1781                     {
1782                         sal_uInt16 nVal = (sal_uInt16)aNumVector[nLevel];
1783                         nVal ++;
1784                         nVal = nVal - pOutlRule->Get(nLevel).GetStart();
1785                         sEntry += String::CreateFromInt32( nVal );
1786                         sEntry += '.';
1787                     }
1788                 }
1789                 sEntry += pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineText(nPos, false);
1790                 sOutlineText = pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineText(nPos, true);
1791                 bIsOutlineMoveable = ((SwOutlineContent*)pCnt)->IsMoveable();
1792                 bOutline = sal_True;
1793             }
1794         }
1795         break;
1796         case CONTENT_TYPE_POSTIT:
1797         case CONTENT_TYPE_INDEX:
1798         case CONTENT_TYPE_REFERENCE :
1799             // koennen weder als URL noch als Bereich eingefuegt werden
1800         break;
1801         case CONTENT_TYPE_URLFIELD:
1802             sUrl = ((SwURLFieldContent*)pCnt)->GetURL();
1803         // kein break;
1804         case CONTENT_TYPE_OLE:
1805         case CONTENT_TYPE_GRAPHIC:
1806             if(GetParentWindow()->GetRegionDropMode() != REGION_MODE_NONE)
1807                 break;
1808             else
1809                 rDragMode &= ~( DND_ACTION_MOVE | DND_ACTION_LINK );
1810         default:
1811             sEntry = GetEntryText(pEntry);
1812     }
1813 
1814     sal_Bool bRet = sal_False;
1815     if(sEntry.Len())
1816     {
1817         const SwDocShell* pDocShell = pWrtShell->GetView().GetDocShell();
1818         if(!sUrl.Len())
1819         {
1820             if(pDocShell->HasName())
1821             {
1822                 SfxMedium* pMedium = pDocShell->GetMedium();
1823                 sUrl = pMedium->GetURLObject().GetURLNoMark();
1824                 // nur, wenn primaer ein Link eingefuegt werden soll
1825                 bRet = sal_True;
1826             }
1827             else if(    nActType == CONTENT_TYPE_REGION ||
1828                         nActType == CONTENT_TYPE_BOOKMARK )
1829             {
1830                 // fuer Bereich und Textmarken ist ein Link auch ohne
1831                 // Dateiname ins eigene Dokument erlaubt
1832                 bRet = sal_True;
1833             }
1834             else if(bIsConstant &&
1835                     ( !::GetActiveView() ||
1836                         pActiveShell != ::GetActiveView()->GetWrtShellPtr()))
1837             {
1838                 // Urls von inaktiven Views ohne Dateinamen koennen auch nicht
1839                 // gedraggt werden
1840                 bRet = sal_False;
1841             }
1842             else
1843             {
1844                 bRet = GetParentWindow()->GetRegionDropMode() == REGION_MODE_NONE;
1845                 rDragMode = DND_ACTION_MOVE;
1846             }
1847 
1848             const String& rToken = pCnt->GetParent()->GetTypeToken();
1849             sUrl += '#';
1850             sUrl += sEntry;
1851             if(rToken.Len())
1852             {
1853                 sUrl += cMarkSeperator;
1854                 sUrl += rToken;
1855             }
1856         }
1857         else
1858             bRet = sal_True;
1859 
1860         if( bRet )
1861         {
1862             //fuer Outlines muss in die Description der Ueberschrifttext mit der echten Nummer
1863             if(bOutline)
1864                 sEntry = sOutlineText;
1865 
1866             {
1867                 NaviContentBookmark aBmk( sUrl, sEntry,
1868                                     GetParentWindow()->GetRegionDropMode(),
1869                                     pDocShell);
1870                 aBmk.Copy( rTransfer );
1871             }
1872 
1873             // fuer fremde DocShells muss eine INetBookmark
1874             // dazugeliefert werden
1875             if( pDocShell->HasName() )
1876             {
1877                 INetBookmark aBkmk( sUrl, sEntry );
1878                 rTransfer.CopyINetBookmark( aBkmk );
1879             }
1880         }
1881     }
1882     return bRet;
1883 }
1884 /***************************************************************************
1885     Beschreibung:   Umschalten der Anzeige auf Root
1886 ***************************************************************************/
1887 
1888 
1889 sal_Bool SwContentTree::ToggleToRoot()
1890 {
1891     if(!bIsRoot)
1892     {
1893         SvLBoxEntry* pEntry = GetCurEntry();
1894         const SwContentType* pCntType;
1895         if(pEntry)
1896         {
1897             if(lcl_IsContentType(pEntry))
1898                 pCntType = (SwContentType*)pEntry->GetUserData();
1899             else
1900                 pCntType = ((SwContent*)pEntry->GetUserData())->GetParent();
1901             nRootType = pCntType->GetType();
1902             bIsRoot = sal_True;
1903             Display(bIsActive || bIsConstant);
1904         }
1905     }
1906     else
1907     {
1908         nRootType = USHRT_MAX;
1909         bIsRoot = sal_False;
1910         FindActiveTypeAndRemoveUserData();
1911         Display(bIsActive || bIsConstant);
1912     }
1913     pConfig->SetRootType( nRootType );
1914     GetParentWindow()->aContentToolBox.CheckItem(FN_SHOW_ROOT, bIsRoot);
1915     return bIsRoot;
1916 }
1917 
1918 /***************************************************************************
1919     Beschreibung:   Angezeigten Inhalt auf Gueltigkeit pruefen
1920 ***************************************************************************/
1921 
1922 
1923 sal_Bool SwContentTree::HasContentChanged()
1924 {
1925 /*
1926     -Parallel durch das lokale Array und die Treelistbox laufen.
1927     -Sind die Eintraege nicht expandiert, werden sie nur im Array verworfen
1928     und der Contenttype wird als UserData neu gesetzt.
1929     - ist der Root-Modus aktiv, wird nur dieser aktualisiert,
1930     fuer die nicht angezeigten Inhaltstypen gilt:
1931         die Memberliste wird geloescht und der Membercount aktualisiert
1932     Wenn Inhalte ueberprueft werden, werden gleichzeitig die vorhanden
1933     Memberlisten aufgefuellt. Sobald ein Unterschied auftritt wird nur noch
1934     gefuellt und nicht mehr ueberprueft. Abschliessend wird die Box neu gefuellt.
1935 
1936 */
1937 
1938     sal_Bool bRepaint = sal_False;
1939     sal_Bool bInvalidate = sal_False;
1940 
1941     if(!bIsActive && ! bIsConstant)
1942     {
1943         for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
1944         {
1945             if(aActiveContentArr[i])
1946                 aActiveContentArr[i]->Invalidate();
1947         }
1948     }
1949     else if(bIsRoot)
1950     {
1951         sal_Bool bOutline = sal_False;
1952         SvLBoxEntry* pEntry = First();
1953         if(!pEntry)
1954             bRepaint = sal_True;
1955         else
1956         {
1957             sal_uInt16 nType = ((SwContentType*)pEntry->GetUserData())->GetType();
1958             bOutline = nRootType == CONTENT_TYPE_OUTLINE;
1959             SwContentType* pArrType = aActiveContentArr[nType];
1960             if(!pArrType)
1961                 bRepaint = sal_True;
1962             else
1963             {
1964                 sal_uInt16 nSelLevel = USHRT_MAX;
1965 
1966                 SvLBoxEntry* pFirstSel;
1967                 if(bOutline &&
1968                         0 != ( pFirstSel = FirstSelected()) &&
1969                             lcl_IsContent(pFirstSel))
1970                 {
1971                     nSelLevel = ((SwOutlineContent*)pFirstSel->GetUserData())->GetOutlineLevel();
1972                     SwWrtShell* pSh = GetWrtShell();
1973                     sal_uInt16 nOutlinePos = pSh->GetOutlinePos(MAXLEVEL);
1974                     bRepaint |= nOutlinePos != USHRT_MAX &&
1975                                 pSh->getIDocumentOutlineNodesAccess()->getOutlineLevel(nOutlinePos) != nSelLevel;
1976                 }
1977 
1978                 pArrType->Init(&bInvalidate);
1979                 pArrType->FillMemberList();
1980                 pEntry->SetUserData((void*)pArrType);
1981                 if(!bRepaint)
1982                 {
1983                     if(GetChildCount(pEntry) != pArrType->GetMemberCount())
1984                             bRepaint = sal_True;
1985                     else
1986                     {
1987                         sal_uInt16 nChildCount = (sal_uInt16)GetChildCount(pEntry);
1988                         for(sal_uInt16 j = 0; j < nChildCount; j++)
1989                         {
1990                             pEntry = Next(pEntry);
1991                             const SwContent* pCnt = pArrType->GetMember(j);
1992                             pEntry->SetUserData((void*)pCnt);
1993                             String sEntryText = GetEntryText(pEntry);
1994                             if( sEntryText != pCnt->GetName() &&
1995                                 !(sEntryText == sSpace && !pCnt->GetName().Len()))
1996                                 bRepaint = sal_True;
1997                         }
1998                     }
1999                 }
2000             }
2001         }
2002         if( !bRepaint && bOutline )
2003         {
2004             //feststellen, wo der Cursor steht
2005             const sal_uInt16 nActPos = GetWrtShell()->GetOutlinePos(MAXLEVEL);
2006             SvLBoxEntry* pFirstEntry = First();
2007 
2008             while( 0 != (pFirstEntry = Next(pFirstEntry)) )
2009             {
2010                 if(((SwOutlineContent*)pFirstEntry->GetUserData())->GetPos() == nActPos)
2011                 {
2012                     if(FirstSelected() != pFirstEntry)
2013                     {
2014                         Select(pFirstEntry);
2015                         MakeVisible(pFirstEntry);
2016                     }
2017                 }
2018             }
2019 
2020         }
2021 
2022     }
2023     else
2024     {
2025         SvLBoxEntry* pEntry = First();
2026         while ( pEntry )
2027         {
2028             sal_Bool bNext = sal_True; // mindestens ein Next muss sein
2029             SwContentType* pTreeType = (SwContentType*)pEntry->GetUserData();
2030             sal_uInt16 nType = pTreeType->GetType();
2031             sal_uInt16 nTreeCount = pTreeType->GetMemberCount();
2032             SwContentType* pArrType = aActiveContentArr[nType];
2033             if(!pArrType)
2034                 bRepaint = sal_True;
2035             else
2036             {
2037                 pArrType->Init(&bInvalidate);
2038                 pEntry->SetUserData((void*)pArrType);
2039                 if(IsExpanded(pEntry))
2040                 {
2041                     sal_Bool bLevelOrVisibiblityChanged = sal_False;
2042                     // bLevelOrVisibiblityChanged is set if outlines have changed their level
2043                     // or if the visibility of objects (frames, sections, tables) has changed
2044                     // i.e. in header/footer
2045                     pArrType->FillMemberList(&bLevelOrVisibiblityChanged);
2046                     if(bLevelOrVisibiblityChanged)
2047                         bInvalidate = sal_True;
2048                     sal_uInt16 nChildCount = (sal_uInt16)GetChildCount(pEntry);
2049                     if(bLevelOrVisibiblityChanged)
2050                         bInvalidate = sal_True;
2051 
2052                     if(nChildCount != pArrType->GetMemberCount())
2053                         bRepaint = sal_True;
2054                     else
2055                     {
2056                         for(sal_uInt16 j = 0; j < nChildCount; j++)
2057                         {
2058                             pEntry = Next(pEntry);
2059                             bNext = sal_False;
2060                             const SwContent* pCnt = pArrType->GetMember(j);
2061                             pEntry->SetUserData((void*)pCnt);
2062                             String sEntryText = GetEntryText(pEntry);
2063                             if( sEntryText != pCnt->GetName() &&
2064                                 !(sEntryText == sSpace && !pCnt->GetName().Len()))
2065                                 bRepaint = sal_True;
2066                         }
2067                     }
2068 
2069                 }
2070                 else if(pEntry->HasChilds())
2071                 {
2072                     //war der Eintrag einmal aufgeklappt, dann muessen auch
2073                     // die unsichtbaren Eintraege geprueft werden.
2074                     // zumindest muessen die Userdaten aktualisiert werden
2075                     sal_Bool bLevelOrVisibiblityChanged = sal_False;
2076                     // bLevelOrVisibiblityChanged is set if outlines have changed their level
2077                     // or if the visibility of objects (frames, sections, tables) has changed
2078                     // i.e. in header/footer
2079                     pArrType->FillMemberList(&bLevelOrVisibiblityChanged);
2080                     sal_Bool bRemoveChildren = sal_False;
2081                     sal_uInt16 nChildCount = (sal_uInt16)GetChildCount(pEntry);
2082                     if( nChildCount != pArrType->GetMemberCount() )
2083                     {
2084                         bRemoveChildren = sal_True;
2085                     }
2086                     else
2087                     {
2088                         SvLBoxEntry* pChild = FirstChild(pEntry);
2089                         for(sal_uInt16 j = 0; j < nChildCount; j++)
2090                         {
2091                             const SwContent* pCnt = pArrType->GetMember(j);
2092                             pChild->SetUserData((void*)pCnt);
2093                             String sEntryText = GetEntryText(pChild);
2094                             if( sEntryText != pCnt->GetName() &&
2095                                 !(sEntryText == sSpace && !pCnt->GetName().Len()))
2096                                 bRemoveChildren = sal_True;
2097                             pChild = Next(pChild);
2098                         }
2099                     }
2100                     if(bRemoveChildren)
2101                     {
2102                         SvLBoxEntry* pChild = FirstChild(pEntry);
2103                         SvLBoxEntry* pRemove = pChild;
2104                         for(sal_uInt16 j = 0; j < nChildCount; j++)
2105                         {
2106                             pChild = Next(pRemove);
2107                             GetModel()->Remove(pRemove);
2108                             pRemove = pChild;
2109                         }
2110                     }
2111                     if(!nChildCount)
2112                     {
2113                         pEntry->EnableChildsOnDemand(sal_False);
2114                         InvalidateEntry(pEntry);
2115                     }
2116 
2117                 }
2118                 else if((nTreeCount != 0)
2119                             != (pArrType->GetMemberCount()!=0))
2120                 {
2121                     bRepaint = sal_True;
2122                 }
2123             }
2124             //hier muss noch der naechste Root-Entry gefunden werden
2125             while( pEntry && (bNext || GetParent(pEntry ) ))
2126             {
2127                 pEntry = Next(pEntry);
2128                 bNext = sal_False;
2129             }
2130         }
2131     }
2132     if(!bRepaint && bInvalidate)
2133         Invalidate();
2134     return bRepaint;
2135 }
2136 
2137 /***************************************************************************
2138     Beschreibung:   Bevor alle Daten geloescht werden, soll noch der letzte
2139  *                  aktive Eintrag festgestellt werden. Dann werden die
2140  *                  UserData geloescht
2141 ***************************************************************************/
2142 void SwContentTree::FindActiveTypeAndRemoveUserData()
2143 {
2144     SvLBoxEntry* pEntry = FirstSelected();
2145     if(pEntry)
2146     {
2147         // wird Clear ueber TimerUpdate gerufen, kann nur fuer die Root
2148         // die Gueltigkeit der UserData garantiert werden
2149         SvLBoxEntry* pParent;
2150         while(0 != (pParent = GetParent(pEntry)))
2151             pEntry = pParent;
2152         if(pEntry->GetUserData() && lcl_IsContentType(pEntry))
2153             nLastSelType = ((SwContentType*)pEntry->GetUserData())->GetType();
2154     }
2155 //  else
2156 //      nLastSelType = USHRT_MAX;
2157     pEntry = First();
2158     while(pEntry)
2159     {
2160         pEntry->SetUserData(0);
2161         pEntry = Next(pEntry);
2162     }
2163 }
2164 
2165 /***************************************************************************
2166     Beschreibung:   Nachdem ein File auf den Navigator gedroppt wurde,
2167                     wird die neue Shell gesetzt
2168 ***************************************************************************/
2169 
2170 
2171 void SwContentTree::SetHiddenShell(SwWrtShell* pSh)
2172 {
2173     pHiddenShell = pSh;
2174     bIsHidden = sal_True;
2175     bIsActive = bIsConstant = sal_False;
2176     FindActiveTypeAndRemoveUserData();
2177     for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
2178     {
2179         DELETEZ(aHiddenContentArr[i]);
2180     }
2181     Display(bIsActive);
2182 
2183     GetParentWindow()->UpdateListBox();
2184 }
2185 /***************************************************************************
2186     Beschreibung:   Dokumentwechsel - neue Shell setzen
2187 ***************************************************************************/
2188 
2189 
2190 void SwContentTree::SetActiveShell(SwWrtShell* pSh)
2191 {
2192     if(bIsInternalDrag)
2193         bDocChgdInDragging = sal_True;
2194     sal_Bool bClear = pActiveShell != pSh;
2195     if(bIsActive && bClear)
2196     {
2197         pActiveShell = pSh;
2198         FindActiveTypeAndRemoveUserData();
2199         Clear();
2200     }
2201     else if(bIsConstant)
2202     {
2203         if(!lcl_FindShell(pActiveShell))
2204         {
2205             pActiveShell = pSh;
2206             bIsActive = sal_True;
2207             bIsConstant = sal_False;
2208             bClear = sal_True;
2209         }
2210     }
2211     // nur wenn es die aktive View ist, wird das Array geloescht und
2212     // die Anzeige neu gefuellt
2213     if(bIsActive && bClear)
2214     {
2215         FindActiveTypeAndRemoveUserData();
2216         for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
2217         {
2218             DELETEZ(aActiveContentArr[i]);
2219         }
2220         Display(sal_True);
2221     }
2222 }
2223 
2224 /***************************************************************************
2225     Beschreibung:   Eine offene View als aktiv festlegen
2226 ***************************************************************************/
2227 
2228 
2229 void SwContentTree::SetConstantShell(SwWrtShell* pSh)
2230 {
2231     pActiveShell = pSh;
2232     bIsActive       = sal_False;
2233     bIsConstant     = sal_True;
2234     FindActiveTypeAndRemoveUserData();
2235     for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
2236     {
2237         DELETEZ(aActiveContentArr[i]);
2238     }
2239     Display(sal_True);
2240 }
2241 /***************************************************************************
2242     Beschreibung:   Kommandos des Navigators ausfuehren
2243 ***************************************************************************/
2244 
2245 
2246 void SwContentTree::ExecCommand(sal_uInt16 nCmd, sal_Bool bModifier)
2247 {
2248     sal_Bool nMove = sal_False;
2249     switch( nCmd )
2250     {
2251         case FN_ITEM_DOWN:
2252         case FN_ITEM_UP:   nMove = sal_True;
2253         case FN_ITEM_LEFT:
2254         case FN_ITEM_RIGHT:
2255         if( !GetWrtShell()->GetView().GetDocShell()->IsReadOnly() &&
2256                 (bIsActive ||
2257                     (bIsConstant && pActiveShell == GetParentWindow()->GetCreateView()->GetWrtShellPtr())))
2258         {
2259             SwWrtShell* pShell = GetWrtShell();
2260             sal_Int8 nActOutlineLevel = nOutlineLevel;
2261             sal_uInt16 nActPos = pShell->GetOutlinePos(nActOutlineLevel);
2262             SvLBoxEntry* pFirstEntry = FirstSelected();
2263             if (pFirstEntry && lcl_IsContent(pFirstEntry))
2264             {
2265                 if((bIsRoot && nRootType == CONTENT_TYPE_OUTLINE) ||
2266                     ((SwContent*)pFirstEntry->GetUserData())->GetParent()->GetType()
2267                                                 ==  CONTENT_TYPE_OUTLINE)
2268                 {
2269                     nActPos = ((SwOutlineContent*)pFirstEntry->GetUserData())->GetPos();
2270                 }
2271             }
2272             if ( nActPos < USHRT_MAX &&
2273                     ( !nMove || pShell->IsOutlineMovable( nActPos )) )
2274             {
2275                 pShell->StartAllAction();
2276                 pShell->GotoOutline( nActPos); // Falls Textselektion != BoxSelektion
2277                 pShell->Push();
2278                 pShell->MakeOutlineSel( nActPos, nActPos,
2279                                     bModifier);
2280                 if( nMove )
2281                 {
2282                     short nDir = nCmd == FN_ITEM_UP ? -1 : 1;
2283                     if( !bModifier && ((nDir == -1 && nActPos > 0) ||
2284                         (nDir == 1 && nActPos < GetEntryCount() - 2 )) )
2285                     {
2286                         pShell->MoveOutlinePara( nDir );
2287                         //Cursor wieder an die aktuelle Position setzen
2288                         pShell->GotoOutline( nActPos + nDir);
2289                     }
2290                     else if(bModifier)
2291                     {
2292                         sal_uInt16 nActEndPos = nActPos;
2293                         SvLBoxEntry* pEntry = pFirstEntry;
2294                         sal_uInt16 nActLevel = ((SwOutlineContent*)
2295                                 pFirstEntry->GetUserData())->GetOutlineLevel();
2296                         pEntry = Next(pEntry);
2297                         while( pEntry && CONTENT_TYPE_OUTLINE ==
2298                             ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId() )
2299                         {
2300                             if(nActLevel >= ((SwOutlineContent*)
2301                                 pEntry->GetUserData())->GetOutlineLevel())
2302                                 break;
2303                             pEntry = Next(pEntry);
2304                             nActEndPos++;
2305                         }
2306                         sal_uInt16 nDest;
2307                         if(nDir == 1)
2308                         {
2309                             //Wenn der letzte Eintrag bewegt werden soll
2310                             //ist Schluss
2311                             if(pEntry && CONTENT_TYPE_OUTLINE ==
2312                                 ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId())
2313                             {
2314                                 // pEntry zeigt jetzt auf den
2315                                 // dem letzten sel. Eintrag folgenden E.
2316                                 nDest = nActEndPos;
2317                                 nDest++;
2318                                 //hier muss der uebernaechste Eintrag
2319                                 //gefunden werden. Die Selektion muss davor eingefuegt
2320                                 //werden
2321                                 while(pEntry )
2322                                 {
2323                                     pEntry = Next(pEntry);
2324                                     // nDest++ darf nur ausgefuehrt werden,
2325                                     // wenn pEntry != 0
2326                                     if(pEntry && nDest++ &&
2327                                     ( nActLevel >= ((SwOutlineContent*)pEntry->GetUserData())->GetOutlineLevel()||
2328                                      CONTENT_TYPE_OUTLINE != ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId()))
2329                                     {
2330                                         nDest--;
2331                                         break;
2332                                     }
2333                                 }
2334                                 nDir = nDest - nActEndPos;
2335                                 //wenn kein Eintrag gefunden wurde, der der Bedingung
2336                                 //fuer das zuvor Einfuegen entspricht, muss etwas weniger
2337                                 //geschoben werden
2338                             }
2339                             else
2340                                 nDir = 0;
2341                         }
2342                         else
2343                         {
2344                             nDest = nActPos;
2345                             pEntry = pFirstEntry;
2346                             while(pEntry && nDest )
2347                             {
2348                                 nDest--;
2349                                 pEntry = Prev(pEntry);
2350                                 if(pEntry &&
2351                                     (nActLevel >= ((SwOutlineContent*)pEntry->GetUserData())->GetOutlineLevel()||
2352                                     CONTENT_TYPE_OUTLINE !=
2353                                 ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId()))
2354                                 {
2355                                     break;
2356                                 }
2357                             }
2358                             nDir = nDest - nActPos;
2359                         }
2360                         if(nDir)
2361                         {
2362                             pShell->MoveOutlinePara( nDir );
2363                             //Cursor wieder an die aktuelle Position setzen
2364                             pShell->GotoOutline( nActPos + nDir);
2365                         }
2366                     }
2367                 }
2368                 else
2369                 {
2370                     if( pShell->IsProtectedOutlinePara() )
2371                         Sound::Beep(); //konnte nicht umgestuft werden
2372                     else
2373                         pShell->OutlineUpDown( nCmd == FN_ITEM_LEFT ? -1 : 1 );
2374                 }
2375 
2376                 pShell->ClearMark();
2377                 pShell->Pop(sal_False); //Cursor steht jetzt wieder an der akt. Ueberschrift
2378                 pShell->EndAllAction();
2379                 if(aActiveContentArr[CONTENT_TYPE_OUTLINE])
2380                     aActiveContentArr[CONTENT_TYPE_OUTLINE]->Invalidate();
2381                 Display(sal_True);
2382                 if(!bIsRoot)
2383                 {
2384                     const sal_uInt16 nCurrPos = pShell->GetOutlinePos(MAXLEVEL);
2385                     SvLBoxEntry* pFirst = First();
2386 
2387                     while( 0 != (pFirst = Next(pFirst)) && lcl_IsContent(pFirst))
2388                     {
2389                         if(((SwOutlineContent*)pFirst->GetUserData())->GetPos() == nCurrPos)
2390                         {
2391                             Select(pFirst);
2392                             MakeVisible(pFirst);
2393                         }
2394                     }
2395                 }
2396             }
2397             else
2398                 Sound::Beep(); //konnte nicht verschoben werden
2399         }
2400     }
2401 }
2402 /***************************************************************************
2403     Beschreibung:
2404 ***************************************************************************/
2405 
2406 
2407 void    SwContentTree::ShowTree()
2408 {
2409     aUpdTimer.Start();
2410     SvTreeListBox::Show();
2411 }
2412 
2413 /***************************************************************************
2414     Beschreibung:   zusammengefaltet wird nicht geidlet
2415 ***************************************************************************/
2416 
2417 
2418 void    SwContentTree::HideTree()
2419 {
2420     aUpdTimer.Stop();
2421     SvTreeListBox::Hide();
2422 }
2423 
2424 /***************************************************************************
2425     Beschreibung:   Kein Idle mit Focus oder waehrend des Dragging
2426 ***************************************************************************/
2427 
2428 
2429 IMPL_LINK( SwContentTree, TimerUpdate, Timer*, EMPTYARG)
2430 {
2431     // kein Update waehrend D&D
2432     // Viewabfrage, da der Navigator zu spaet abgeraeumt wird
2433     SwView* pView = GetParentWindow()->GetCreateView();
2434     if( (!HasFocus() || bViewHasChanged) &&
2435          !bIsInDrag && !bIsInternalDrag && pView &&
2436          pView->GetWrtShellPtr() && !pView->GetWrtShellPtr()->ActionPend() )
2437     {
2438         bViewHasChanged = sal_False;
2439         bIsIdleClear = sal_False;
2440         SwWrtShell* pActShell = pView->GetWrtShellPtr();
2441         if( bIsConstant && !lcl_FindShell( pActiveShell ) )
2442         {
2443             SetActiveShell(pActShell);
2444             GetParentWindow()->UpdateListBox();
2445         }
2446 
2447         if(bIsActive && pActShell != GetWrtShell())
2448             SetActiveShell(pActShell);
2449         else if( (bIsActive || (bIsConstant && pActShell == GetWrtShell())) &&
2450                     HasContentChanged())
2451         {
2452             FindActiveTypeAndRemoveUserData();
2453             Display(sal_True);
2454             //Solution: Set focus
2455             if( bIsKeySpace )
2456             {
2457                 HideFocus();
2458                 ShowFocus( oldRectangle);
2459                 bIsKeySpace = sal_False;
2460             }
2461         }
2462     }
2463     else if(!pView && bIsActive && !bIsIdleClear)
2464     {
2465         if(pActiveShell)
2466             SetActiveShell(0);
2467         Clear();
2468         bIsIdleClear = sal_True;
2469     }
2470     return 0;
2471 }
2472 
2473 /***************************************************************************
2474     Beschreibung:
2475 ***************************************************************************/
2476 
2477 
2478 DragDropMode SwContentTree::NotifyStartDrag(
2479                 TransferDataContainer& rContainer,
2480                 SvLBoxEntry* pEntry )
2481 {
2482     DragDropMode eMode = (DragDropMode)0;
2483     if( bIsActive && nRootType == CONTENT_TYPE_OUTLINE &&
2484         GetModel()->GetAbsPos( pEntry ) > 0
2485         && !GetWrtShell()->GetView().GetDocShell()->IsReadOnly())
2486         eMode = GetDragDropMode();
2487     else if(!bIsActive && GetWrtShell()->GetView().GetDocShell()->HasName())
2488         eMode = SV_DRAGDROP_APP_COPY;
2489 
2490     sal_Int8 nDragMode;
2491     FillTransferData( rContainer, nDragMode );
2492     bDocChgdInDragging = sal_False;
2493     bIsInternalDrag = sal_True;
2494     return eMode;
2495 }
2496 
2497 
2498 /***************************************************************************
2499     Beschreibung :  Nach dem Drag wird der aktuelle Absatz m i t
2500                     Childs verschoben
2501 ***************************************************************************/
2502 
2503 
2504 sal_Bool  SwContentTree::NotifyMoving( SvLBoxEntry*  pTarget,
2505         SvLBoxEntry*  pEntry, SvLBoxEntry*& , sal_uLong& )
2506 {
2507     if(!bDocChgdInDragging)
2508     {
2509         sal_uInt16 nTargetPos = 0;
2510         sal_uInt16 nSourcePos = (( SwOutlineContent* )pEntry->GetUserData())->GetPos();
2511         if(!lcl_IsContent(pTarget))
2512             nTargetPos = USHRT_MAX;
2513         else
2514             nTargetPos = (( SwOutlineContent* )pTarget->GetUserData())->GetPos();
2515         if( MAXLEVEL > nOutlineLevel && // werden nicht alle Ebenen angezeigt
2516                         nTargetPos != USHRT_MAX)
2517         {
2518             SvLBoxEntry* pNext = Next(pTarget);
2519             if(pNext)
2520                 nTargetPos = (( SwOutlineContent* )pNext->GetUserData())->GetPos() -1;
2521             else
2522                 nTargetPos = static_cast<sal_uInt16>(GetWrtShell()->getIDocumentOutlineNodesAccess()->getOutlineNodesCount())- 1;
2523 
2524         }
2525 
2526         DBG_ASSERT( pEntry &&
2527             lcl_IsContent(pEntry),"Source == 0 oder Source hat keinen Content" );
2528         GetParentWindow()->MoveOutline( nSourcePos,
2529                                     nTargetPos,
2530                                     sal_True);
2531 
2532         aActiveContentArr[CONTENT_TYPE_OUTLINE]->Invalidate();
2533         Display(sal_True);
2534     }
2535     //TreeListBox wird aus dem Dokument neu geladen
2536     return sal_False;
2537 }
2538 /***************************************************************************
2539     Beschreibung :  Nach dem Drag wird der aktuelle Absatz o h n e
2540                     Childs verschoben
2541 ***************************************************************************/
2542 
2543 
2544 sal_Bool  SwContentTree::NotifyCopying( SvLBoxEntry*  pTarget,
2545         SvLBoxEntry*  pEntry, SvLBoxEntry*& , sal_uLong& )
2546 {
2547     if(!bDocChgdInDragging)
2548     {
2549         sal_uInt16 nTargetPos = 0;
2550         sal_uInt16 nSourcePos = (( SwOutlineContent* )pEntry->GetUserData())->GetPos();
2551         if(!lcl_IsContent(pTarget))
2552             nTargetPos = USHRT_MAX;
2553         else
2554             nTargetPos = (( SwOutlineContent* )pTarget->GetUserData())->GetPos();
2555 
2556         if( MAXLEVEL > nOutlineLevel && // werden nicht alle Ebenen angezeigt
2557                         nTargetPos != USHRT_MAX)
2558         {
2559             SvLBoxEntry* pNext = Next(pTarget);
2560             if(pNext)
2561                 nTargetPos = (( SwOutlineContent* )pNext->GetUserData())->GetPos() - 1;
2562             else
2563                 nTargetPos = static_cast<sal_uInt16>(GetWrtShell()->getIDocumentOutlineNodesAccess()->getOutlineNodesCount()) - 1;
2564 
2565         }
2566 
2567 
2568         DBG_ASSERT( pEntry &&
2569             lcl_IsContent(pEntry),"Source == 0 oder Source hat keinen Content" );
2570         GetParentWindow()->MoveOutline( nSourcePos, nTargetPos, sal_False);
2571 
2572         //TreeListBox wird aus dem Dokument neu geladen
2573         aActiveContentArr[CONTENT_TYPE_OUTLINE]->Invalidate();
2574         Display(sal_True);
2575     }
2576     return sal_False;
2577 }
2578 
2579 /***************************************************************************
2580     Beschreibung:   Kein Drop vor den ersten Eintrag - es ist ein SwContentType
2581 ***************************************************************************/
2582 
2583 sal_Bool  SwContentTree::NotifyAcceptDrop( SvLBoxEntry* pEntry)
2584 {
2585     return pEntry != 0;
2586 }
2587 
2588 
2589 /***************************************************************************
2590     Beschreibung:   Wird ein Ctrl+DoubleClick in einen freien Bereich ausgefuehrt,
2591  *                  dann soll die Basisfunktion des Controls gerufen werden
2592 ***************************************************************************/
2593 void  SwContentTree::MouseButtonDown( const MouseEvent& rMEvt )
2594 {
2595     Point aPos( rMEvt.GetPosPixel());
2596     SvLBoxEntry* pEntry = GetEntry( aPos, sal_True );
2597     if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0)
2598         Control::MouseButtonDown( rMEvt );
2599     else
2600         SvTreeListBox::MouseButtonDown( rMEvt );
2601 }
2602 
2603 /***************************************************************************
2604     Beschreibung:   sofort aktualisieren
2605 ***************************************************************************/
2606 
2607 
2608 void  SwContentTree::GetFocus()
2609 {
2610     SwView* pActView = GetParentWindow()->GetCreateView();
2611     if(pActView)
2612     {
2613         SwWrtShell* pActShell = pActView->GetWrtShellPtr();
2614         if(bIsConstant && !lcl_FindShell(pActiveShell))
2615         {
2616             SetActiveShell(pActShell);
2617         }
2618 
2619         if(bIsActive && pActShell != GetWrtShell())
2620             SetActiveShell(pActShell);
2621         else if( (bIsActive || (bIsConstant && pActShell == GetWrtShell())) &&
2622                     HasContentChanged())
2623         {
2624             Display(sal_True);
2625         }
2626     }
2627     else if(bIsActive)
2628         Clear();
2629     SvTreeListBox::GetFocus();
2630 }
2631 
2632 /***************************************************************************
2633     Beschreibung:
2634 ***************************************************************************/
2635 
2636 
2637 void  SwContentTree::KeyInput(const KeyEvent& rEvent)
2638 {
2639     const KeyCode aCode = rEvent.GetKeyCode();
2640     if(aCode.GetCode() == KEY_RETURN)
2641     {
2642         SvLBoxEntry* pEntry = FirstSelected();
2643         if ( pEntry )
2644         {
2645             switch(aCode.GetModifier())
2646             {
2647                 case KEY_MOD2:
2648                     // Boxen umschalten
2649                     GetParentWindow()->ToggleTree();
2650                 break;
2651                 case KEY_MOD1:
2652                     // RootModus umschalten
2653                     ToggleToRoot();
2654                 break;
2655                 case 0:
2656                     if(lcl_IsContentType(pEntry))
2657                     {
2658                         IsExpanded(pEntry) ?
2659                             Collapse(pEntry) :
2660                                 Expand(pEntry);
2661                     }
2662                     else
2663                         ContentDoubleClickHdl(0);
2664                 break;
2665             }
2666         }
2667     }
2668     else if(aCode.GetCode() == KEY_DELETE && 0 == aCode.GetModifier())
2669     {
2670         SvLBoxEntry* pEntry = FirstSelected();
2671         if(pEntry &&
2672             lcl_IsContent(pEntry) &&
2673                 ((SwContent*)pEntry->GetUserData())->GetParent()->IsDeletable() &&
2674                     !pActiveShell->GetView().GetDocShell()->IsReadOnly())
2675         {
2676             EditEntry(pEntry, EDIT_MODE_DELETE);
2677             bViewHasChanged = sal_True;
2678             GetParentWindow()->UpdateListBox();
2679             TimerUpdate(&aUpdTimer);
2680             GrabFocus();
2681         }
2682     }
2683     //Solution: Make KEY_SPACE has same function as DoubleClick ,
2684     //and realize multi-selection .
2685     else if(aCode.GetCode() == KEY_SPACE && 0 == aCode.GetModifier())
2686     {
2687 
2688         SvLBoxEntry* pEntry = GetCurEntry();
2689         if( GetChildCount( pEntry ) == 0 )
2690             bIsKeySpace = sal_True;
2691         Point tempPoint = GetEntryPosition( pEntry );//Change from "GetEntryPos" to "GetEntryPosition" for acc migration
2692         oldRectangle = GetFocusRect( pEntry,tempPoint.Y() );
2693 
2694         if(pEntry)
2695         {
2696             if(bIsActive || bIsConstant)
2697             {
2698                 if(bIsConstant)
2699                 {
2700                     pActiveShell->GetView().GetViewFrame()->GetWindow().ToTop();
2701                 }
2702 
2703                 SwContent* pCnt = (SwContent*)pEntry->GetUserData();
2704 
2705                 sal_uInt16 nJumpType = pCnt->GetParent()->GetType();
2706                 switch(nJumpType)
2707                 {
2708                     case CONTENT_TYPE_DRAWOBJECT:
2709                     {
2710                         SdrView* pDrawView = pActiveShell->GetDrawView();
2711                         if (pDrawView)
2712                         {
2713                             pDrawView->SdrEndTextEdit();//Change from "EndTextEdit" to "SdrEndTextEdit" for acc migration
2714 
2715                             SdrModel* pDrawModel = pActiveShell->GetDoc()->GetDrawModel();
2716                             SdrPage* pPage = pDrawModel->GetPage(0);
2717                             sal_uInt32 nCount = pPage->GetObjCount();
2718                             sal_Bool hasObjectMarked = sal_False;
2719 
2720                             SdrObject* pObject = NULL;
2721                             pObject = GetDrawingObjectsByContent( pCnt );
2722                             if( pObject )
2723                             {
2724                                 SdrPageView* pPV = pDrawView->GetSdrPageView/*GetPageViewPvNum*/(/*0*/);
2725                                 if( pPV )
2726                                 {
2727                                     sal_Bool bUnMark = pDrawView->IsObjMarked(pObject);
2728                                     pDrawView->MarkObj( pObject, pPV, bUnMark);
2729 
2730                                 }
2731                             }
2732                             for( sal_uInt32 i=0; i< nCount; i++ )
2733                             {
2734                                 SdrObject* pTemp = pPage->GetObj(i);
2735                                 sal_uInt16 nCmpId;
2736                                 sal_Bool bMark = pDrawView->IsObjMarked(pTemp);
2737                                 switch( pTemp->GetObjIdentifier() )
2738                                 {
2739                                     case OBJ_GRUP:
2740                                     case OBJ_TEXT:
2741                                     case OBJ_TEXTEXT:
2742                                     case OBJ_wegFITTEXT:
2743                                     case OBJ_LINE:
2744                                     case OBJ_RECT:
2745                                     case OBJ_CIRC:
2746                                     case OBJ_SECT:
2747                                     case OBJ_CARC:
2748                                     case OBJ_CCUT:
2749                                     case OBJ_POLY:
2750                                     case OBJ_PLIN:
2751                                     case OBJ_PATHLINE:
2752                                     case OBJ_PATHFILL:
2753                                     case OBJ_FREELINE:
2754                                     case OBJ_FREEFILL:
2755                                     case OBJ_PATHPOLY:
2756                                     case OBJ_PATHPLIN:
2757                                     case OBJ_CAPTION:
2758                                     case OBJ_CUSTOMSHAPE:
2759                                         nCmpId = OBJ_GRUP;
2760                                         if( bMark )
2761                                             hasObjectMarked = sal_True;
2762                                         break;
2763                                     default:
2764                                         nCmpId = pTemp->GetObjIdentifier();
2765                                         if ( bMark )
2766                                         {
2767                                             SdrPageView* pPV = pDrawView->GetSdrPageView/*GetPageViewPvNum*/(/*0*/);
2768                                             if (pPV)
2769                                             {
2770                                                 pDrawView->MarkObj(pTemp, pPV, sal_True);
2771                                             }
2772                                         }
2773                                 }
2774                                 //mod end
2775                             }
2776                             if ( pActiveShell && !hasObjectMarked )
2777                             {
2778                                 SwEditWin& pEditWindow =
2779                                     pActiveShell->GetView().GetEditWin();
2780                                 if( &pEditWindow )
2781                                 {
2782                                     KeyCode tempKeycode( KEY_ESCAPE );
2783                                     KeyEvent rKEvt( 0 , tempKeycode );
2784                                     ((Window*)&pEditWindow)->KeyInput( rKEvt );
2785 
2786                                 }
2787                                 //rView.GetEditWin().GrabFocus();
2788                             }
2789                         }
2790                     }
2791                     break;
2792                 }
2793 
2794 
2795                 bViewHasChanged = sal_True;
2796             }
2797         }
2798 
2799     }
2800     else
2801         SvTreeListBox::KeyInput(rEvent);
2802 
2803 }
2804 
2805 /***************************************************************************
2806     Beschreibung:
2807 ***************************************************************************/
2808 
2809 
2810 void  SwContentTree::RequestHelp( const HelpEvent& rHEvt )
2811 {
2812     sal_Bool bCallBase = sal_True;
2813     if( rHEvt.GetMode() & HELPMODE_QUICK )
2814     {
2815         Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
2816         SvLBoxEntry* pEntry = GetEntry( aPos );
2817         if( pEntry )
2818         {
2819             sal_uInt16 nType;
2820             sal_Bool bBalloon = sal_False;
2821             sal_Bool bContent = sal_False;
2822             void* pUserData = pEntry->GetUserData();
2823             if(lcl_IsContentType(pEntry))
2824                 nType = ((SwContentType*)pUserData)->GetType();
2825             else
2826             {
2827                 nType = ((SwContent*)pUserData)->GetParent()->GetType();
2828                 bContent = sal_True;
2829             }
2830             String sEntry;
2831             sal_Bool bRet = sal_False;
2832             if(bContent)
2833             {
2834                 switch( nType )
2835                 {
2836                     case CONTENT_TYPE_URLFIELD:
2837                         sEntry = ((SwURLFieldContent*)pUserData)->GetURL();
2838                         bRet = sal_True;
2839                     break;
2840 
2841                     case CONTENT_TYPE_POSTIT:
2842                         sEntry = ((SwPostItContent*)pUserData)->GetName();
2843                         bRet = sal_True;
2844                         if(Help::IsBalloonHelpEnabled())
2845                             bBalloon = sal_True;
2846                     break;
2847                     case CONTENT_TYPE_OUTLINE:
2848                         sEntry = ((SwOutlineContent*)pUserData)->GetName();
2849                         bRet = sal_True;
2850                     break;
2851                     case CONTENT_TYPE_GRAPHIC:
2852                         sEntry = ((SwGraphicContent*)pUserData)->GetLink();
2853 #if OSL_DEBUG_LEVEL > 1
2854                         sEntry += ' ';
2855                         sEntry += String::CreateFromInt32(
2856                                     ((SwGraphicContent*)pUserData)->GetYPos());
2857 #endif
2858                         bRet = sal_True;
2859                     break;
2860 #if OSL_DEBUG_LEVEL > 1
2861                     case CONTENT_TYPE_TABLE:
2862                     case CONTENT_TYPE_FRAME:
2863                         sEntry = String::CreateFromInt32(
2864                                         ((SwContent*)pUserData)->GetYPos() );
2865                         bRet = sal_True;
2866                     break;
2867 #endif
2868                 }
2869                 if(((SwContent*)pUserData)->IsInvisible())
2870                 {
2871                     if(sEntry.Len())
2872                         sEntry += C2S(", ");
2873                     sEntry += sInvisible;
2874                     bRet = sal_True;
2875                 }
2876             }
2877             else
2878             {
2879                 sal_uInt16 nMemberCount = ((SwContentType*)pUserData)->GetMemberCount();
2880                 sEntry = String::CreateFromInt32(nMemberCount);
2881                 sEntry += ' ';
2882                 sEntry += nMemberCount == 1
2883                             ? ((SwContentType*)pUserData)->GetSingleName()
2884                             : ((SwContentType*)pUserData)->GetName();
2885                 bRet = sal_True;
2886             }
2887             if(bRet)
2888             {
2889                 SvLBoxTab* pTab;
2890                 SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
2891                 if( pItem && SV_ITEM_ID_LBOXSTRING == pItem->IsA())
2892                 {
2893                     aPos = GetEntryPosition( pEntry );
2894 
2895                     aPos.X() = GetTabPos( pEntry, pTab );
2896                     Size aSize( pItem->GetSize( this, pEntry ) );
2897 
2898                     if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
2899                         aSize.Width() = GetSizePixel().Width() - aPos.X();
2900 
2901                     aPos = OutputToScreenPixel(aPos);
2902                     Rectangle aItemRect( aPos, aSize );
2903                     if(bBalloon)
2904                     {
2905                         aPos.X() += aSize.Width();
2906                         Help::ShowBalloon( this, aPos, aItemRect, sEntry );
2907                     }
2908                     else
2909                         Help::ShowQuickHelp( this, aItemRect, sEntry,
2910                             QUICKHELP_LEFT|QUICKHELP_VCENTER );
2911                     bCallBase = sal_False;
2912                 }
2913             }
2914             else
2915             {
2916                 Help::ShowQuickHelp( this, Rectangle(), aEmptyStr, 0 );
2917                 bCallBase = sal_False;
2918             }
2919         }
2920     }
2921     if( bCallBase )
2922         Window::RequestHelp( rHEvt );
2923 }
2924 
2925 /***************************************************************************
2926     Beschreibung:
2927 ***************************************************************************/
2928 
2929 
2930 void    SwContentTree::ExcecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry )
2931 {
2932     SvLBoxEntry* pFirst = FirstSelected();
2933     switch( nSelectedPopupEntry )
2934     {
2935         //Outlinelevel
2936         case 101:
2937         case 102:
2938         case 103:
2939         case 104:
2940         case 105:
2941         case 106:
2942         case 107:
2943         case 108:
2944         case 109:
2945         case 110:
2946             nSelectedPopupEntry -= 100;
2947             if(nOutlineLevel != nSelectedPopupEntry )
2948                 SetOutlineLevel((sal_Int8)nSelectedPopupEntry);
2949         break;
2950         case 201:
2951         case 202:
2952         case 203:
2953             GetParentWindow()->SetRegionDropMode(nSelectedPopupEntry - 201);
2954         break;
2955         case 401:
2956         case 402:
2957             EditEntry(pFirst, nSelectedPopupEntry == 401 ? EDIT_MODE_RMV_IDX : EDIT_MODE_UPD_IDX);
2958         break;
2959         // Eintrag bearbeiten
2960         case 403:
2961             EditEntry(pFirst, EDIT_MODE_EDIT);
2962         break;
2963         case 404:
2964             EditEntry(pFirst, EDIT_UNPROTECT_TABLE);
2965         break;
2966         case 405 :
2967         {
2968             const SwTOXBase* pBase = ((SwTOXBaseContent*)pFirst->GetUserData())
2969                                                                 ->GetTOXBase();
2970             pActiveShell->SetTOXBaseReadonly(*pBase, !pActiveShell->IsTOXBaseReadonly(*pBase));
2971         }
2972         break;
2973         case 4:
2974         break;
2975         case 501:
2976             EditEntry(pFirst, EDIT_MODE_DELETE);
2977         break;
2978         case 502 :
2979             EditEntry(pFirst, EDIT_MODE_RENAME);
2980         break;
2981         case 600:
2982             pActiveShell->GetView().GetPostItMgr()->Show();
2983             break;
2984         case 601:
2985             pActiveShell->GetView().GetPostItMgr()->Hide();
2986             break;
2987         case 602:
2988             {
2989                 pActiveShell->GetView().GetPostItMgr()->SetActiveSidebarWin(0);
2990                 pActiveShell->GetView().GetPostItMgr()->Delete();
2991                 break;
2992             }
2993         //Anzeige
2994         default: // nSelectedPopupEntry > 300
2995         if(nSelectedPopupEntry > 300 && nSelectedPopupEntry < 400)
2996         {
2997             nSelectedPopupEntry -= 300;
2998             SwView *pView = SwModule::GetFirstView();
2999             while (pView)
3000             {
3001                 nSelectedPopupEntry --;
3002                 if(nSelectedPopupEntry == 0)
3003                 {
3004                     SetConstantShell(&pView->GetWrtShell());
3005                     break;
3006                 }
3007                 pView = SwModule::GetNextView(pView);
3008             }
3009             if(nSelectedPopupEntry)
3010             {
3011                 bViewHasChanged = bIsActive = nSelectedPopupEntry == 1;
3012                 bIsConstant = sal_False;
3013                 Display(nSelectedPopupEntry == 1);
3014             }
3015         }
3016     }
3017     GetParentWindow()->UpdateListBox();
3018 }
3019 
3020 /***************************************************************************
3021     Beschreibung:
3022 ***************************************************************************/
3023 
3024 
3025 void SwContentTree::SetOutlineLevel(sal_uInt8 nSet)
3026 {
3027     nOutlineLevel = nSet;
3028     pConfig->SetOutlineLevel( nOutlineLevel );
3029     SwContentType** ppContentT = bIsActive ?
3030                     &aActiveContentArr[CONTENT_TYPE_OUTLINE] :
3031                         &aHiddenContentArr[CONTENT_TYPE_OUTLINE];
3032     if(*ppContentT)
3033     {
3034         (*ppContentT)->SetOutlineLevel(nOutlineLevel);
3035         (*ppContentT)->Init();
3036     }
3037     Display(bIsActive);
3038 }
3039 
3040 /***************************************************************************
3041     Beschreibung:   Moduswechsel: gedropptes Doc anzeigen
3042 ***************************************************************************/
3043 
3044 
3045 void SwContentTree::ShowHiddenShell()
3046 {
3047     if(pHiddenShell)
3048     {
3049         bIsConstant = sal_False;
3050         bIsActive = sal_False;
3051         Display(sal_False);
3052     }
3053 }
3054 
3055 /***************************************************************************
3056     Beschreibung:   Moduswechsel: aktive Sicht anzeigen
3057 ***************************************************************************/
3058 
3059 
3060 void SwContentTree::ShowActualView()
3061 {
3062     bIsActive = sal_True;
3063     bIsConstant = sal_False;
3064     Display(sal_True);
3065     GetParentWindow()->UpdateListBox();
3066 }
3067 
3068 /*-----------------20.11.96 13.34-------------------
3069     Beschreibung: Hier sollen die Buttons zum Verschieben von
3070                   Outlines en-/disabled werden
3071 --------------------------------------------------*/
3072 
3073 sal_Bool  SwContentTree::Select( SvLBoxEntry* pEntry, sal_Bool bSelect )
3074 {
3075     if(!pEntry)
3076         return sal_False;
3077     sal_Bool bEnable = sal_False;
3078     SvLBoxEntry* pParentEntry = GetParent(pEntry);
3079     if(!bIsLastReadOnly && (!IsVisible() ||
3080         ((bIsRoot && nRootType == CONTENT_TYPE_OUTLINE && pParentEntry) ||
3081             (lcl_IsContent(pEntry) && ((SwContentType*)pParentEntry->GetUserData())->GetType() == CONTENT_TYPE_OUTLINE))))
3082         bEnable = sal_True;
3083     SwNavigationPI* pNavi = GetParentWindow();
3084     pNavi->aContentToolBox.EnableItem(FN_ITEM_UP ,  bEnable);
3085     pNavi->aContentToolBox.EnableItem(FN_ITEM_DOWN, bEnable);
3086     pNavi->aContentToolBox.EnableItem(FN_ITEM_LEFT, bEnable);
3087     pNavi->aContentToolBox.EnableItem(FN_ITEM_RIGHT,bEnable);
3088 
3089     return SvTreeListBox::Select(pEntry, bSelect);
3090 }
3091 
3092 /*-----------------27.11.96 12.56-------------------
3093 
3094 --------------------------------------------------*/
3095 
3096 void SwContentTree::SetRootType(sal_uInt16 nType)
3097 {
3098     nRootType = nType;
3099     bIsRoot = sal_True;
3100     pConfig->SetRootType( nRootType );
3101 }
3102 
3103 /*-----------------10.01.97 12.19-------------------
3104 
3105 --------------------------------------------------*/
3106 
3107 void SwContentType::RemoveNewline(String& rEntry)
3108 {
3109     sal_Unicode* pStr = rEntry.GetBufferAccess();
3110     for(xub_StrLen i = rEntry.Len(); i; --i, ++pStr )
3111     {
3112         if( *pStr == 10 || *pStr == 13 )
3113             *pStr = 0x20;
3114     }
3115 }
3116 
3117 /*-----------------14.01.97 16.38-------------------
3118 
3119 --------------------------------------------------*/
3120 
3121 void SwContentTree::EditEntry(SvLBoxEntry* pEntry, sal_uInt8 nMode)
3122 {
3123     SwContent* pCnt = (SwContent*)pEntry->GetUserData();
3124     GotoContent(pCnt);
3125     sal_uInt16 nType = pCnt->GetParent()->GetType();
3126     sal_uInt16 nSlot = 0;
3127 
3128     uno::Reference< container::XNameAccess >  xNameAccess, xSecond, xThird;
3129     switch(nType)
3130     {
3131         case CONTENT_TYPE_TABLE     :
3132             if(nMode == EDIT_UNPROTECT_TABLE)
3133             {
3134                 pActiveShell->GetView().GetDocShell()->
3135                         GetDoc()->UnProtectCells( pCnt->GetName());
3136             }
3137             else if(nMode == EDIT_MODE_DELETE)
3138             {
3139                 pActiveShell->StartAction();
3140                 String sTable = SW_RES(STR_TABLE_NAME);
3141                 SwRewriter aRewriterTableName;
3142                 aRewriterTableName.AddRule(UNDO_ARG1, SW_RES(STR_START_QUOTE));
3143                 aRewriterTableName.AddRule(UNDO_ARG2, pCnt->GetName());
3144                 aRewriterTableName.AddRule(UNDO_ARG3, SW_RES(STR_END_QUOTE));
3145                 sTable = aRewriterTableName.Apply(sTable);
3146 
3147                 SwRewriter aRewriter;
3148                 aRewriter.AddRule(UNDO_ARG1, sTable);
3149                 pActiveShell->StartUndo(UNDO_DELETE, &aRewriter);
3150                 pActiveShell->GetView().GetViewFrame()->GetDispatcher()->Execute(FN_TABLE_SELECT_ALL);
3151                 pActiveShell->DeleteRow();
3152                 pActiveShell->EndUndo();
3153                 pActiveShell->EndAction();
3154             }
3155             else if(nMode == EDIT_MODE_RENAME)
3156             {
3157                 uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
3158                 uno::Reference< text::XTextTablesSupplier >  xTables(xModel, uno::UNO_QUERY);
3159                 xNameAccess = xTables->getTextTables();
3160             }
3161             else
3162                 nSlot = FN_FORMAT_TABLE_DLG;
3163         break;
3164 
3165         case CONTENT_TYPE_GRAPHIC   :
3166             if(nMode == EDIT_MODE_DELETE)
3167             {
3168                 pActiveShell->DelRight();
3169             }
3170             else if(nMode == EDIT_MODE_RENAME)
3171             {
3172                 uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
3173                 uno::Reference< text::XTextGraphicObjectsSupplier >  xGraphics(xModel, uno::UNO_QUERY);
3174                 xNameAccess = xGraphics->getGraphicObjects();
3175                 uno::Reference< text::XTextFramesSupplier >  xFrms(xModel, uno::UNO_QUERY);
3176                 xSecond = xFrms->getTextFrames();
3177                 uno::Reference< text::XTextEmbeddedObjectsSupplier >  xObjs(xModel, uno::UNO_QUERY);
3178                 xThird = xObjs->getEmbeddedObjects();
3179             }
3180             else
3181                 nSlot = FN_FORMAT_GRAFIC_DLG;
3182         break;
3183 
3184         case CONTENT_TYPE_FRAME     :
3185         case CONTENT_TYPE_OLE       :
3186             if(nMode == EDIT_MODE_DELETE)
3187             {
3188                 pActiveShell->DelRight();
3189             }
3190             else if(nMode == EDIT_MODE_RENAME)
3191             {
3192                 uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
3193                 uno::Reference< text::XTextFramesSupplier >  xFrms(xModel, uno::UNO_QUERY);
3194                 uno::Reference< text::XTextEmbeddedObjectsSupplier >  xObjs(xModel, uno::UNO_QUERY);
3195                 if(CONTENT_TYPE_FRAME == nType)
3196                 {
3197                     xNameAccess = xFrms->getTextFrames();
3198                     xSecond = xObjs->getEmbeddedObjects();
3199                 }
3200                 else
3201                 {
3202                     xNameAccess = xObjs->getEmbeddedObjects();
3203                     xSecond = xFrms->getTextFrames();
3204                 }
3205                 uno::Reference< text::XTextGraphicObjectsSupplier >  xGraphics(xModel, uno::UNO_QUERY);
3206                 xThird = xGraphics->getGraphicObjects();
3207             }
3208             else
3209                 nSlot = FN_FORMAT_FRAME_DLG;
3210         break;
3211         case CONTENT_TYPE_BOOKMARK  :
3212             if(nMode == EDIT_MODE_DELETE)
3213             {
3214                 IDocumentMarkAccess* const pMarkAccess = pActiveShell->getIDocumentMarkAccess();
3215                 pMarkAccess->deleteMark( pMarkAccess->findMark(pCnt->GetName()) );
3216             }
3217             else if(nMode == EDIT_MODE_RENAME)
3218             {
3219                 uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
3220                 uno::Reference< text::XBookmarksSupplier >  xBkms(xModel, uno::UNO_QUERY);
3221                 xNameAccess = xBkms->getBookmarks();
3222             }
3223             else
3224                 nSlot = FN_INSERT_BOOKMARK;
3225         break;
3226 
3227         case CONTENT_TYPE_REGION    :
3228             if(nMode == EDIT_MODE_RENAME)
3229             {
3230                 uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
3231                 uno::Reference< text::XTextSectionsSupplier >  xSects(xModel, uno::UNO_QUERY);
3232                 xNameAccess = xSects->getTextSections();
3233             }
3234             else
3235                 nSlot = FN_EDIT_REGION;
3236         break;
3237 
3238         case CONTENT_TYPE_URLFIELD:
3239             nSlot = FN_EDIT_HYPERLINK;
3240         break;
3241         case CONTENT_TYPE_REFERENCE:
3242             nSlot = FN_EDIT_FIELD;
3243         break;
3244 
3245         case CONTENT_TYPE_POSTIT:
3246             pActiveShell->GetView().GetPostItMgr()->AssureStdModeAtShell();
3247             if(nMode == EDIT_MODE_DELETE)
3248             {
3249                 if (((SwPostItContent*)pCnt)->IsPostIt())
3250                 {
3251                     pActiveShell->GetView().GetPostItMgr()->SetActiveSidebarWin(0);
3252                     pActiveShell->DelRight();
3253                 }
3254                 /*
3255                 //  this code can be used once we want redline comments in the margin
3256                 else
3257                 {
3258                     SwMarginWin* pComment = pActiveShell->GetView().GetPostItMgr()->GetPostIt(((SwPostItContent*)pCnt)->GetRedline());
3259                     if (pComment)
3260                         pComment->Delete();
3261                 }
3262                 */
3263             }
3264             else
3265             {
3266                 if (((SwPostItContent*)pCnt)->IsPostIt())
3267                     nSlot = FN_POSTIT;
3268                 else
3269                     nSlot = FN_REDLINE_COMMENT;
3270             }
3271         break;
3272         case CONTENT_TYPE_INDEX:
3273         {
3274             const SwTOXBase* pBase = ((SwTOXBaseContent*)pCnt)->GetTOXBase();
3275             switch(nMode)
3276             {
3277                 case EDIT_MODE_EDIT:
3278                     if(pBase)
3279                     {
3280                         SwPtrItem aPtrItem( FN_INSERT_MULTI_TOX, (void*)pBase);
3281                         pActiveShell->GetView().GetViewFrame()->
3282                             GetDispatcher()->Execute(FN_INSERT_MULTI_TOX,
3283                                             SFX_CALLMODE_ASYNCHRON, &aPtrItem, 0L);
3284 
3285                     }
3286                 break;
3287                 case EDIT_MODE_RMV_IDX:
3288                 case EDIT_MODE_DELETE:
3289                 {
3290                     if( pBase )
3291                         pActiveShell->DeleteTOX(*pBase, EDIT_MODE_DELETE == nMode);
3292                 }
3293                 break;
3294                 case EDIT_MODE_UPD_IDX:
3295                 case EDIT_MODE_RENAME:
3296                 {
3297                     Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
3298                     Reference< XDocumentIndexesSupplier >  xIndexes(xModel, UNO_QUERY);
3299                     Reference< XIndexAccess> xIdxAcc(xIndexes->getDocumentIndexes());
3300                     Reference< XNameAccess >xLocalNameAccess(xIdxAcc, UNO_QUERY);
3301                     if(EDIT_MODE_RENAME == nMode)
3302                         xNameAccess = xLocalNameAccess;
3303                     else if(xLocalNameAccess.is() && xLocalNameAccess->hasByName(pBase->GetTOXName()))
3304                     {
3305                         Any aIdx = xLocalNameAccess->getByName(pBase->GetTOXName());
3306                         Reference< XDocumentIndex> xIdx;
3307                         if(aIdx >>= xIdx)
3308                             xIdx->update();
3309                     }
3310                 }
3311                 break;
3312             }
3313         }
3314         break;
3315         case CONTENT_TYPE_DRAWOBJECT :
3316             if(EDIT_MODE_DELETE == nMode)
3317                 nSlot = SID_DELETE;
3318         break;
3319     }
3320     if(nSlot)
3321         pActiveShell->GetView().GetViewFrame()->
3322                     GetDispatcher()->Execute(nSlot, SFX_CALLMODE_ASYNCHRON);
3323     else if(xNameAccess.is())
3324     {
3325         uno::Any aObj = xNameAccess->getByName(pCnt->GetName());
3326         uno::Reference< uno::XInterface >  xTmp;
3327         aObj >>= xTmp;
3328         uno::Reference< container::XNamed >  xNamed(xTmp, uno::UNO_QUERY);
3329         SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
3330         DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
3331 
3332         AbstractSwRenameXNamedDlg* pDlg = pFact->CreateSwRenameXNamedDlg( this, xNamed, xNameAccess, DLG_RENAME_XNAMED );
3333         DBG_ASSERT(pDlg, "Dialogdiet fail!");
3334         if(xSecond.is())
3335             pDlg->SetAlternativeAccess( xSecond, xThird);
3336 
3337         String sForbiddenChars;
3338         if(CONTENT_TYPE_BOOKMARK == nType)
3339         {
3340             sForbiddenChars = C2S("/\\@:*?\";,.#");
3341         }
3342         else if(CONTENT_TYPE_TABLE == nType)
3343         {
3344             sForbiddenChars = C2S(" .<>");
3345         }
3346         pDlg->SetForbiddenChars(sForbiddenChars);
3347         pDlg->Execute();
3348         delete pDlg;
3349     }
3350 }
3351 
3352 /*-----------------14.01.97 16.53-------------------
3353 
3354 --------------------------------------------------*/
3355 
3356 void SwContentTree::GotoContent(SwContent* pCnt)
3357 {
3358     pActiveShell->EnterStdMode();
3359 
3360     sal_Bool bSel = sal_False;
3361     sal_uInt16 nJumpType = pCnt->GetParent()->GetType();
3362     switch(nJumpType)
3363     {
3364         case CONTENT_TYPE_OUTLINE   :
3365         {
3366             pActiveShell->GotoOutline(((SwOutlineContent*)pCnt)->GetPos());
3367         }
3368         break;
3369         case CONTENT_TYPE_TABLE     :
3370         {
3371             pActiveShell->GotoTable(pCnt->GetName());
3372         }
3373         break;
3374         case CONTENT_TYPE_FRAME     :
3375         case CONTENT_TYPE_GRAPHIC   :
3376         case CONTENT_TYPE_OLE       :
3377         {
3378             if(pActiveShell->GotoFly(pCnt->GetName()))
3379                 bSel = sal_True;
3380         }
3381         break;
3382         case CONTENT_TYPE_BOOKMARK:
3383         {
3384             pActiveShell->GotoMark(pCnt->GetName());
3385         }
3386         break;
3387         case CONTENT_TYPE_REGION    :
3388         {
3389             pActiveShell->GotoRegion(pCnt->GetName());
3390         }
3391         break;
3392         case CONTENT_TYPE_URLFIELD:
3393         {
3394             if(pActiveShell->GotoINetAttr(
3395                             *((SwURLFieldContent*)pCnt)->GetINetAttr() ))
3396             {
3397                 pActiveShell->Right( CRSR_SKIP_CHARS, sal_True, 1, sal_False);
3398                 pActiveShell->SwCrsrShell::SelectTxtAttr( RES_TXTATR_INETFMT, sal_True );
3399             }
3400 
3401         }
3402         break;
3403         case CONTENT_TYPE_REFERENCE:
3404         {
3405             pActiveShell->GotoRefMark(pCnt->GetName());
3406         }
3407         break;
3408         case CONTENT_TYPE_INDEX:
3409         {
3410             if (!pActiveShell->GotoNextTOXBase(&pCnt->GetName()))
3411                 pActiveShell->GotoPrevTOXBase(&pCnt->GetName());
3412         }
3413         break;
3414         case CONTENT_TYPE_POSTIT:
3415             pActiveShell->GetView().GetPostItMgr()->AssureStdModeAtShell();
3416             if (((SwPostItContent*)pCnt)->IsPostIt())
3417                 pActiveShell->GotoFld(*((SwPostItContent*)pCnt)->GetPostIt());
3418             else
3419                 pActiveShell->GetView().GetDocShell()->GetWrtShell()->GotoRedline(
3420                         pActiveShell->GetView().GetDocShell()->GetWrtShell()->FindRedlineOfData(((SwPostItContent*)pCnt)->GetRedline()->GetRedlineData()));
3421 
3422         break;
3423         case CONTENT_TYPE_DRAWOBJECT:
3424         {
3425             SdrView* pDrawView = pActiveShell->GetDrawView();
3426             if (pDrawView)
3427             {
3428                 pDrawView->SdrEndTextEdit();
3429                 pDrawView->UnmarkAll();
3430                 SdrModel* _pModel = pActiveShell->getIDocumentDrawModelAccess()->GetDrawModel();
3431                 SdrPage* pPage = _pModel->GetPage(0);
3432                 sal_uInt32 nCount = pPage->GetObjCount();
3433                 for( sal_uInt32 i=0; i< nCount; i++ )
3434                 {
3435                     SdrObject* pTemp = pPage->GetObj(i);
3436                     // --> OD 2006-03-09 #i51726# - all drawing objects can be named now
3437 //                    if(pTemp->ISA(SdrObjGroup) && pTemp->GetName() == pCnt->GetName())
3438                     if ( pTemp->GetName() == pCnt->GetName() )
3439                     // <--
3440                     {
3441                         SdrPageView* pPV = pDrawView->GetSdrPageView();
3442                         if( pPV )
3443                         {
3444                             pDrawView->MarkObj( pTemp, pPV );
3445                         }
3446                     }
3447                 }
3448             }
3449         }
3450         break;
3451     }
3452     if(bSel)
3453     {
3454         pActiveShell->HideCrsr();
3455         pActiveShell->EnterSelFrmMode();
3456     }
3457     SwView& rView = pActiveShell->GetView();
3458     rView.StopShellTimer();
3459     rView.GetPostItMgr()->SetActiveSidebarWin(0);
3460     rView.GetEditWin().GrabFocus();
3461 }
3462 /*-----------------06.02.97 19.14-------------------
3463     Jetzt nochtdie passende text::Bookmark
3464 --------------------------------------------------*/
3465 
3466 NaviContentBookmark::NaviContentBookmark()
3467     :
3468     nDocSh(0),
3469     nDefDrag( REGION_MODE_NONE )
3470 {
3471 }
3472 
3473 /*-----------------06.02.97 20.12-------------------
3474 
3475 --------------------------------------------------*/
3476 
3477 NaviContentBookmark::NaviContentBookmark( const String &rUrl,
3478                     const String& rDesc,
3479                     sal_uInt16 nDragType,
3480                     const SwDocShell* pDocSh ) :
3481     aUrl( rUrl ),
3482     aDescr(rDesc),
3483     nDocSh((long)pDocSh),
3484     nDefDrag( nDragType )
3485 {
3486 }
3487 
3488 void NaviContentBookmark::Copy( TransferDataContainer& rData ) const
3489 {
3490     rtl_TextEncoding eSysCSet = gsl_getSystemTextEncoding();
3491 
3492     ByteString sStr( aUrl, eSysCSet );
3493     sStr += static_cast< char >(NAVI_BOOKMARK_DELIM);
3494     sStr += ByteString( aDescr, eSysCSet );
3495     sStr += static_cast< char >(NAVI_BOOKMARK_DELIM);
3496     sStr += ByteString::CreateFromInt32( nDefDrag );
3497     sStr += static_cast< char >(NAVI_BOOKMARK_DELIM);
3498     sStr += ByteString::CreateFromInt32( nDocSh );
3499     rData.CopyByteString( SOT_FORMATSTR_ID_SONLK, sStr );
3500 }
3501 
3502 sal_Bool NaviContentBookmark::Paste( TransferableDataHelper& rData )
3503 {
3504     String sStr;
3505     sal_Bool bRet = rData.GetString( SOT_FORMATSTR_ID_SONLK, sStr );
3506     if( bRet )
3507     {
3508         xub_StrLen nPos = 0;
3509         aUrl    = sStr.GetToken(0, NAVI_BOOKMARK_DELIM, nPos );
3510         aDescr  = sStr.GetToken(0, NAVI_BOOKMARK_DELIM, nPos );
3511         nDefDrag= (sal_uInt16)sStr.GetToken(0, NAVI_BOOKMARK_DELIM, nPos ).ToInt32();
3512         nDocSh  = sStr.GetToken(0, NAVI_BOOKMARK_DELIM, nPos ).ToInt32();
3513     }
3514     return bRet;
3515 }
3516 
3517 
3518 /* -----------------------------09.12.99 13:50--------------------------------
3519 
3520  ---------------------------------------------------------------------------*/
3521 class SwContentLBoxString : public SvLBoxString
3522 {
3523 public:
3524     SwContentLBoxString( SvLBoxEntry* pEntry, sal_uInt16 nFlags,
3525         const String& rStr ) : SvLBoxString(pEntry,nFlags,rStr) {}
3526 
3527     virtual void Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags,
3528         SvLBoxEntry* pEntry);
3529 };
3530 
3531 /* -----------------------------09.12.99 13:49--------------------------------
3532 
3533  ---------------------------------------------------------------------------*/
3534 void SwContentTree::InitEntry(SvLBoxEntry* pEntry,
3535         const XubString& rStr ,const Image& rImg1,const Image& rImg2,
3536         SvLBoxButtonKind eButtonKind)
3537 {
3538     sal_uInt16 nColToHilite = 1; //0==Bitmap;1=="Spalte1";2=="Spalte2"
3539     SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind );
3540     SvLBoxString* pCol = (SvLBoxString*)pEntry->GetItem( nColToHilite );
3541     SwContentLBoxString* pStr = new SwContentLBoxString( pEntry, 0, pCol->GetText() );
3542     pEntry->ReplaceItem( pStr, nColToHilite );
3543 }
3544 /* -----------------------------09.12.99 13:49--------------------------------
3545 
3546  ---------------------------------------------------------------------------*/
3547 void SwContentLBoxString::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags,
3548     SvLBoxEntry* pEntry )
3549 {
3550     if(lcl_IsContent(pEntry) &&
3551             ((SwContent *)pEntry->GetUserData())->IsInvisible())
3552     {
3553         //* pCont = (SwContent*)pEntry->GetUserData();
3554         Font aOldFont( rDev.GetFont());
3555         Font aFont(aOldFont);
3556         Color aCol( COL_LIGHTGRAY );
3557         aFont.SetColor( aCol );
3558         rDev.SetFont( aFont );
3559         rDev.DrawText( rPos, GetText() );
3560         rDev.SetFont( aOldFont );
3561     }
3562     // IA2 CWS. MT: Removed for now (also in SvLBoxEntry) - only used in Sw/Sd/ScContentLBoxString, they should decide if they need this
3563     /*
3564     else if (pEntry->IsMarked())
3565     {
3566             rDev.DrawText( rPos, GetText() );
3567             XubString str;
3568             str = XubString::CreateFromAscii("*");
3569             Point rPosStar(rPos.X()-6,rPos.Y());
3570             Font aOldFont( rDev.GetFont());
3571             Font aFont(aOldFont);
3572             Color aCol( aOldFont.GetColor() );
3573             aCol.DecreaseLuminance( 200 );
3574             aFont.SetColor( aCol );
3575             rDev.SetFont( aFont );
3576             rDev.DrawText( rPosStar, str);
3577             rDev.SetFont( aOldFont );
3578     }
3579     */
3580     else
3581         SvLBoxString::Paint( rPos, rDev, nFlags, pEntry);
3582 }
3583 /* -----------------------------06.05.2002 10:20------------------------------
3584 
3585  ---------------------------------------------------------------------------*/
3586 void    SwContentTree::DataChanged( const DataChangedEvent& rDCEvt )
3587 {
3588   if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
3589          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
3590     {
3591         sal_uInt16 nResId = GetSettings().GetStyleSettings().GetHighContrastMode() ? IMG_NAVI_ENTRYBMPH : IMG_NAVI_ENTRYBMP;
3592         aEntryImages = ImageList(SW_RES(nResId));
3593         FindActiveTypeAndRemoveUserData();
3594         Display(sal_True);
3595     }
3596     SvTreeListBox::DataChanged( rDCEvt );
3597 }
3598 
3599 
3600 sal_Int32  SwContentTree::GetEntryRealChildsNum( SvLBoxEntry* pParent ) const
3601 {
3602     // ist es ein Inhaltstyp?
3603     if(lcl_IsContentType(pParent))
3604     {
3605         if(!pParent->HasChilds())
3606         {
3607             SwContentType* pCntType = (SwContentType*)pParent->GetUserData();
3608             return pCntType->GetMemberCount();
3609         }
3610     }
3611     return 0;
3612 }
3613