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