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