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