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