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