xref: /aoo41x/main/sd/source/ui/dlg/sdtreelb.cxx (revision 79aad27f)
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_sd.hxx"
26 
27 #include <sal/types.h>
28 #include <sot/formats.hxx>
29 #include <sot/storage.hxx>
30 #include <vcl/msgbox.hxx>
31 #include <svl/urihelper.hxx>
32 #include <svx/svditer.hxx>
33 #include <sfx2/docfile.hxx>
34 #include <svx/svdoole2.hxx>
35 #include <vcl/svapp.hxx>
36 #include "cusshow.hxx"
37 #include <sfx2/childwin.hxx>
38 
39 #include <sfx2/viewfrm.hxx>
40 
41 #include "strmname.h"
42 #include "sdtreelb.hxx"
43 #include "DrawDocShell.hxx"
44 #include "drawdoc.hxx"
45 #include "sdpage.hxx"
46 #include "sdresid.hxx"
47 #include "navigatr.hxx"
48 #ifndef _SD_CFGID_HXX
49 #include "strings.hrc"
50 #endif
51 #include "res_bmp.hrc"
52 #include "ViewShell.hxx"
53 #include "DrawController.hxx"
54 #include "ViewShellBase.hxx"
55 
56 #include <com/sun/star/embed/XEmbedPersist.hpp>
57 #include <com/sun/star/frame/XDesktop.hpp>
58 #include <com/sun/star/frame/XFramesSupplier.hpp>
59 #include <svtools/embedtransfer.hxx>
60 #include <comphelper/processfactory.hxx>
61 #include <tools/diagnose_ex.h>
62 
63 using namespace com::sun::star;
64 
65 class SdPageObjsTLB::IconProvider
66 {
67 public:
68     IconProvider (void);
69 
70     // Regular icons.
71     Image maImgPage;
72     Image maImgPageExcl;
73     Image maImgPageObjsExcl;
74     Image maImgPageObjs;
75     Image maImgObjects;
76     Image maImgGroup;
77 
78     // High contrast icons.
79     Image maImgPageH;
80     Image maImgPageExclH;
81     Image maImgPageObjsExclH;
82     Image maImgPageObjsH;
83     Image maImgObjectsH;
84     Image maImgGroupH;
85 };
86 
87 
88 sal_Bool SD_DLLPRIVATE SdPageObjsTLB::bIsInDrag = sal_False;
89 
90 sal_Bool SdPageObjsTLB::IsInDrag()
91 {
92 	return bIsInDrag;
93 }
94 
95 sal_uInt32 SdPageObjsTLB::SdPageObjsTransferable::mnListBoxDropFormatId = SAL_MAX_UINT32;
96 
97 // -----------------------------------------
98 // - SdPageObjsTLB::SdPageObjsTransferable -
99 // -----------------------------------------
100 
101 SdPageObjsTLB::SdPageObjsTransferable::SdPageObjsTransferable(
102     SdPageObjsTLB& rParent,
103         const INetBookmark& rBookmark,
104     ::sd::DrawDocShell& rDocShell,
105     NavigatorDragType eDragType,
106     const ::com::sun::star::uno::Any& rTreeListBoxData )
107     : SdTransferable(rDocShell.GetDoc(), NULL, sal_True),
108       mrParent( rParent ),
109       maBookmark( rBookmark ),
110       mrDocShell( rDocShell ),
111       meDragType( eDragType ),
112       maTreeListBoxData( rTreeListBoxData )
113 {
114 }
115 
116 
117 
118 
119 SdPageObjsTLB::SdPageObjsTransferable::~SdPageObjsTransferable()
120 {
121 }
122 
123 // -----------------------------------------------------------------------------
124 
125 void SdPageObjsTLB::SdPageObjsTransferable::AddSupportedFormats()
126 {
127     AddFormat(SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK);
128     AddFormat(SOT_FORMATSTR_ID_TREELISTBOX);
129     AddFormat(GetListBoxDropFormatId());
130 }
131 
132 // -----------------------------------------------------------------------------
133 
134 sal_Bool SdPageObjsTLB::SdPageObjsTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor )
135 {
136 	sal_uLong nFormatId = SotExchange::GetFormat( rFlavor );
137     switch (nFormatId)
138     {
139         case SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK:
140             SetINetBookmark( maBookmark, rFlavor );
141             return sal_True;
142 
143         case SOT_FORMATSTR_ID_TREELISTBOX:
144             SetAny(maTreeListBoxData, rFlavor);
145             return sal_True;
146 
147         default:
148             return sal_False;
149     }
150 }
151 
152 // -----------------------------------------------------------------------------
153 
154 void SdPageObjsTLB::SdPageObjsTransferable::DragFinished( sal_Int8 nDropAction )
155 {
156 	mrParent.OnDragFinished( nDropAction );
157     SdTransferable::DragFinished(nDropAction);
158 }
159 
160 // -----------------------------------------------------------------------------
161 
162 ::sd::DrawDocShell& SdPageObjsTLB::SdPageObjsTransferable::GetDocShell() const
163 {
164     return mrDocShell;
165 }
166 
167 // -----------------------------------------------------------------------------
168 
169 NavigatorDragType SdPageObjsTLB::SdPageObjsTransferable::GetDragType() const
170 {
171     return meDragType;
172 }
173 
174 // -----------------------------------------------------------------------------
175 
176 sal_Int64 SAL_CALL SdPageObjsTLB::SdPageObjsTransferable::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw( ::com::sun::star::uno::RuntimeException )
177 {
178     sal_Int64 nRet;
179 
180     if( ( rId.getLength() == 16 ) &&
181         ( 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) )
182     {
183         nRet = (sal_Int64)(sal_IntPtr)this;
184     }
185     else
186         nRet = SdTransferable::getSomething(rId);
187 
188 	return nRet;
189 }
190 
191 // -----------------------------------------------------------------------------
192 
193 const ::com::sun::star::uno::Sequence< sal_Int8 >& SdPageObjsTLB::SdPageObjsTransferable::getUnoTunnelId()
194 {
195     static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq;
196 
197 	if( !aSeq.getLength() )
198 	{
199 		static osl::Mutex   aCreateMutex;
200     	osl::MutexGuard     aGuard( aCreateMutex );
201 
202 		aSeq.realloc( 16 );
203     	rtl_createUuid( reinterpret_cast< sal_uInt8* >( aSeq.getArray() ), 0, sal_True );
204 	}
205 
206     return aSeq;
207 }
208 
209 // -----------------------------------------------------------------------------
210 
211 SdPageObjsTLB::SdPageObjsTransferable* SdPageObjsTLB::SdPageObjsTransferable::getImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxData )
212     throw()
213 {
214     try
215     {
216 	    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUnoTunnel( rxData, ::com::sun::star::uno::UNO_QUERY_THROW );
217 
218 		return reinterpret_cast<SdPageObjsTLB::SdPageObjsTransferable*>(
219 				sal::static_int_cast<sal_uIntPtr>(
220 					xUnoTunnel->getSomething( SdPageObjsTLB::SdPageObjsTransferable::getUnoTunnelId()) ) );
221     }
222     catch( const ::com::sun::star::uno::Exception& )
223 	{
224 	}
225 	return 0;
226 }
227 
228 
229 sal_uInt32 SdPageObjsTLB::SdPageObjsTransferable::GetListBoxDropFormatId (void)
230 {
231     if (mnListBoxDropFormatId == SAL_MAX_UINT32)
232         mnListBoxDropFormatId = SotExchange::RegisterFormatMimeType(
233             ::rtl::OUString::createFromAscii(
234                 "application/x-openoffice-treelistbox-moveonly;"
235                     "windows_formatname=\"SV_LBOX_DD_FORMAT_MOVE\""));
236     return mnListBoxDropFormatId;
237 }
238 
239 
240 
241 
242 /*************************************************************************
243 |*
244 |* Ctor1 SdPageObjsTLB
245 |*
246 \************************************************************************/
247 
248 SdPageObjsTLB::SdPageObjsTLB( Window* pParentWin, const SdResId& rSdResId )
249 :	SvTreeListBox       ( pParentWin, rSdResId )
250 ,	mpParent 		    ( pParentWin )
251 ,	mpDoc			    ( NULL )
252 ,	mpBookmarkDoc	    ( NULL )
253 ,	mpMedium 	    	( NULL )
254 ,	mpOwnMedium		    ( NULL )
255 ,	maImgOle             ( BitmapEx( SdResId( BMP_OLE ) ) )
256 ,	maImgGraphic         ( BitmapEx( SdResId( BMP_GRAPHIC ) ) )
257 ,	maImgOleH            ( BitmapEx( SdResId( BMP_OLE_H ) ) )
258 ,	maImgGraphicH        ( BitmapEx( SdResId( BMP_GRAPHIC_H ) ) )
259 ,	mbLinkableSelected  ( sal_False )
260 ,	mpDropNavWin		( NULL )
261 ,   mbShowAllShapes     ( false )
262 ,   mbShowAllPages      ( false )
263 
264 {
265 	// Tree-ListBox mit Linien versehen
266 	SetStyle( GetStyle() | WB_TABSTOP | WB_BORDER | WB_HASLINES |
267 						   WB_HASBUTTONS | // WB_HASLINESATROOT |
268 						   WB_HSCROLL | // #31562#
269 						   WB_HASBUTTONSATROOT |
270                            WB_QUICK_SEARCH /* i31275 */ );
271 	SetNodeBitmaps( Bitmap( SdResId( BMP_EXPAND ) ),
272 					Bitmap( SdResId( BMP_COLLAPSE ) ) );
273 
274 	SetNodeBitmaps( Bitmap( SdResId( BMP_EXPAND_H ) ),
275 					Bitmap( SdResId( BMP_COLLAPSE_H ) ),
276 					BMP_COLOR_HIGHCONTRAST );
277 
278     SetDragDropMode(
279  		SV_DRAGDROP_CTRL_MOVE | SV_DRAGDROP_CTRL_COPY |
280             SV_DRAGDROP_APP_MOVE  | SV_DRAGDROP_APP_COPY  | SV_DRAGDROP_APP_DROP );
281 }
282 
283 /*************************************************************************
284 |*
285 |* Dtor SdPageObjsTLB
286 |*
287 \************************************************************************/
288 
289 SdPageObjsTLB::~SdPageObjsTLB()
290 {
291     if ( mpBookmarkDoc )
292         CloseBookmarkDoc();
293     else
294         // no document was created from mpMedium, so this object is still the owner of it
295         delete mpMedium;
296 }
297 
298 /*************************************************************************
299 |*
300 |* return name of object
301 |*
302 \************************************************************************/
303 
304 String SdPageObjsTLB::GetObjectName(
305     const SdrObject* pObject,
306     const bool bCreate) const
307 {
308     String aRet;
309 
310     if ( pObject )
311     {
312         aRet = pObject->GetName();
313 
314         if( !aRet.Len() && pObject->ISA( SdrOle2Obj ) )
315             aRet = static_cast< const SdrOle2Obj* >( pObject )->GetPersistName();
316     }
317 
318     if (bCreate
319         && mbShowAllShapes
320         && aRet.Len() == 0
321         && pObject!=NULL)
322     {
323         aRet = SdResId(STR_NAVIGATOR_SHAPE_BASE_NAME);
324         aRet.SearchAndReplaceAscii("%1", String::CreateFromInt32(pObject->GetOrdNum() + 1));
325     }
326 
327     return aRet;
328 }
329 
330 /*************************************************************************
331 |*
332 |* In TreeLB Eintrag selektieren
333 |*
334 \************************************************************************/
335 
336 sal_Bool SdPageObjsTLB::SelectEntry( const String& rName )
337 {
338 	sal_Bool bFound = sal_False;
339 
340 	if( rName.Len() )
341 	{
342 		SvLBoxEntry* pEntry = NULL;
343 		String aTmp;
344 
345 		for( pEntry = First(); pEntry && !bFound; pEntry = Next( pEntry ) )
346 		{
347 			aTmp = GetEntryText( pEntry );
348 			if( aTmp == rName )
349 			{
350 				bFound = sal_True;
351 				SetCurEntry( pEntry );
352 			}
353 		}
354 	}
355 	return( bFound );
356 }
357 
358 /*************************************************************************
359 |*
360 |* Gibt zurueck, ob Childs des uebergebenen Strings selektiert sind
361 |*
362 \************************************************************************/
363 
364 sal_Bool SdPageObjsTLB::HasSelectedChilds( const String& rName )
365 {
366 	sal_Bool bFound  = sal_False;
367 	sal_Bool bChilds = sal_False;
368 
369 	if( rName.Len() )
370 	{
371 		SvLBoxEntry* pEntry = NULL;
372 		String aTmp;
373 
374 		for( pEntry = First(); pEntry && !bFound; pEntry = Next( pEntry ) )
375 		{
376 			aTmp = GetEntryText( pEntry );
377 			if( aTmp == rName )
378 			{
379 				bFound = sal_True;
380 				sal_Bool bExpanded = IsExpanded( pEntry );
381 				long nCount = GetChildSelectionCount( pEntry );
382 				if( bExpanded && nCount > 0 )
383 					bChilds = sal_True;
384 			}
385 		}
386 	}
387 	return( bChilds );
388 }
389 
390 
391 /*************************************************************************
392 |*
393 |* TreeLB mit Seiten und Objekten fuellen
394 |*
395 \************************************************************************/
396 
397 void SdPageObjsTLB::Fill( const SdDrawDocument* pInDoc, sal_Bool bAllPages,
398 						  const String& rDocName)
399 {
400 	String aSelection;
401 	if( GetSelectionCount() > 0 )
402 	{
403 		aSelection = GetSelectEntry();
404 		Clear();
405 	}
406 
407 	mpDoc = pInDoc;
408 	maDocName = rDocName;
409     mbShowAllPages = (bAllPages == sal_True);
410 	mpMedium = NULL;
411 
412 	SdPage* 	 pPage = NULL;
413 
414     IconProvider aIconProvider;
415 
416 	// first insert all pages including objects
417 	sal_uInt16 nPage = 0;
418 	const sal_uInt16 nMaxPages = mpDoc->GetPageCount();
419 
420 	while( nPage < nMaxPages )
421 	{
422 		pPage = (SdPage*) mpDoc->GetPage( nPage );
423 		if(  (mbShowAllPages || pPage->GetPageKind() == PK_STANDARD)
424 		     && !(pPage->GetPageKind()==PK_HANDOUT)   ) //#94954# never list the normal handout page ( handout-masterpage is used instead )
425 		{
426 			sal_Bool bPageExluded = pPage->IsExcluded();
427 
428             bool bPageBelongsToShow = PageBelongsToCurrentShow (pPage);
429             bPageExluded |= !bPageBelongsToShow;
430 
431             AddShapeList(*pPage, NULL, pPage->GetName(), bPageExluded, NULL, aIconProvider);
432 		}
433 		nPage++;
434 	}
435 
436 	// dann alle MasterPages incl. Objekte einfuegen
437 	if( mbShowAllPages )
438 	{
439 		nPage = 0;
440 		const sal_uInt16 nMaxMasterPages = mpDoc->GetMasterPageCount();
441 
442 		while( nPage < nMaxMasterPages )
443 		{
444 			pPage = (SdPage*) mpDoc->GetMasterPage( nPage );
445             AddShapeList(*pPage, NULL, pPage->GetName(), false, NULL, aIconProvider);
446 			nPage++;
447 		}
448 	}
449 	if( aSelection.Len() )
450 		SelectEntry( aSelection );
451 }
452 
453 /*************************************************************************
454 |*
455 |* Es wird nur der erste Eintrag eingefuegt. Childs werden OnDemand erzeugt
456 |*
457 \************************************************************************/
458 
459 void SdPageObjsTLB::Fill( const SdDrawDocument* pInDoc, SfxMedium* pInMedium,
460 						  const String& rDocName )
461 {
462 	mpDoc = pInDoc;
463 
464     // this object now owns the Medium
465 	mpMedium = pInMedium;
466 	maDocName = rDocName;
467 
468 	Image aImgDocOpen=Image( BitmapEx( SdResId( BMP_DOC_OPEN ) ) );
469 	Image aImgDocClosed=Image( BitmapEx( SdResId( BMP_DOC_CLOSED ) ) );
470 	Image aImgDocOpenH=Image( BitmapEx( SdResId( BMP_DOC_OPEN_H ) ) );
471 	Image aImgDocClosedH=Image( BitmapEx( SdResId( BMP_DOC_CLOSED_H ) ) );
472 
473 	// Dokumentnamen einfuegen
474 	SvLBoxEntry* pFileEntry = InsertEntry( maDocName,
475 	                          aImgDocOpen,
476 	                          aImgDocClosed,
477 	                          NULL,
478 	                          sal_True,
479 							  LIST_APPEND,
480 							  reinterpret_cast< void* >( 1 ) );
481 
482 	SetExpandedEntryBmp( pFileEntry, aImgDocOpenH, BMP_COLOR_HIGHCONTRAST );
483 	SetCollapsedEntryBmp( pFileEntry, aImgDocClosedH, BMP_COLOR_HIGHCONTRAST );
484 }
485 
486 
487 
488 
489 void SdPageObjsTLB::AddShapeList (
490     const SdrObjList& rList,
491     SdrObject* pShape,
492     const ::rtl::OUString& rsName,
493     const bool bIsExcluded,
494     SvLBoxEntry* pParentEntry,
495     const IconProvider& rIconProvider)
496 {
497     Image aIcon (rIconProvider.maImgPage);
498     if (bIsExcluded)
499         aIcon = rIconProvider.maImgPageExcl;
500     else if (pShape != NULL)
501         aIcon = rIconProvider.maImgGroup;
502 
503     void* pUserData (reinterpret_cast<void*>(1));
504     if (pShape != NULL)
505         pUserData = pShape;
506 
507 	SvLBoxEntry* pEntry = InsertEntry(
508         rsName,
509         aIcon,
510         aIcon,
511         pParentEntry,
512         sal_False,
513         LIST_APPEND,
514         pUserData);
515 
516     SetExpandedEntryBmp(
517         pEntry,
518         bIsExcluded ? rIconProvider.maImgPageExclH : rIconProvider.maImgPageH,
519         BMP_COLOR_HIGHCONTRAST );
520     SetCollapsedEntryBmp(
521         pEntry,
522         bIsExcluded ? rIconProvider.maImgPageExclH : rIconProvider.maImgPageH,
523         BMP_COLOR_HIGHCONTRAST );
524 
525     SdrObjListIter aIter(
526         rList,
527         !rList.HasObjectNavigationOrder() /* use navigation order, if available */,
528         IM_FLAT,
529         sal_False /*not reverse*/);
530 
531     while( aIter.IsMore() )
532     {
533         SdrObject* pObj = aIter.Next();
534         OSL_ASSERT(pObj!=NULL);
535 
536         // Get the shape name.
537         String aStr (GetObjectName( pObj ) );
538 
539         if( aStr.Len() )
540         {
541             if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_OLE2 )
542             {
543                 SvLBoxEntry* pNewEntry = InsertEntry( aStr, maImgOle, maImgOle, pEntry,
544                     sal_False, LIST_APPEND, pObj);
545 
546                 SetExpandedEntryBmp( pNewEntry, maImgOleH, BMP_COLOR_HIGHCONTRAST );
547                 SetCollapsedEntryBmp( pNewEntry, maImgOleH, BMP_COLOR_HIGHCONTRAST );
548             }
549             else if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_GRAF )
550             {
551                 SvLBoxEntry* pNewEntry = InsertEntry( aStr, maImgGraphic, maImgGraphic, pEntry,
552                     sal_False, LIST_APPEND, pObj );
553 
554                 SetExpandedEntryBmp( pNewEntry, maImgGraphicH, BMP_COLOR_HIGHCONTRAST );
555                 SetCollapsedEntryBmp( pNewEntry, maImgGraphicH, BMP_COLOR_HIGHCONTRAST );
556             }
557             else if (pObj->IsGroupObject())
558             {
559                 AddShapeList(
560                     *pObj->GetSubList(),
561                     pObj,
562                     aStr,
563                     false,
564                     pEntry,
565                     rIconProvider);
566             }
567             else
568             {
569                 SvLBoxEntry* pNewEntry = InsertEntry( aStr, rIconProvider.maImgObjects, rIconProvider.maImgObjects, pEntry,
570                     sal_False, LIST_APPEND, pObj );
571 
572                 SetExpandedEntryBmp( pNewEntry, rIconProvider.maImgObjectsH, BMP_COLOR_HIGHCONTRAST );
573                 SetCollapsedEntryBmp( pNewEntry, rIconProvider.maImgObjectsH, BMP_COLOR_HIGHCONTRAST );
574             }
575         }
576     }
577 
578     if( pEntry->HasChilds() )
579     {
580         SetExpandedEntryBmp(
581             pEntry,
582             bIsExcluded ? rIconProvider.maImgPageObjsExcl : rIconProvider.maImgPageObjs);
583         SetCollapsedEntryBmp(
584             pEntry,
585             bIsExcluded ? rIconProvider.maImgPageObjsExcl : rIconProvider.maImgPageObjs);
586         SetExpandedEntryBmp(
587             pEntry,
588             bIsExcluded ? rIconProvider.maImgPageObjsExclH : rIconProvider.maImgPageObjsH,
589             BMP_COLOR_HIGHCONTRAST);
590         SetCollapsedEntryBmp(
591             pEntry,
592             bIsExcluded ? rIconProvider.maImgPageObjsExclH : rIconProvider.maImgPageObjsH,
593             BMP_COLOR_HIGHCONTRAST);
594     }
595 }
596 
597 
598 
599 
600 void SdPageObjsTLB::SetShowAllShapes (
601     const bool bShowAllShapes,
602     const bool bFillList)
603 {
604     mbShowAllShapes = bShowAllShapes;
605     if (bFillList)
606     {
607         if (mpMedium == NULL)
608             Fill(mpDoc, mbShowAllPages, maDocName);
609         else
610             Fill(mpDoc, mpMedium, maDocName);
611     }
612 }
613 
614 
615 
616 
617 bool SdPageObjsTLB::GetShowAllShapes (void) const
618 {
619     return mbShowAllShapes;
620 }
621 
622 
623 
624 
625 /*************************************************************************
626 |*
627 |* Prueft, ob die Seiten (PK_STANDARD) und die darauf befindlichen Objekte
628 |* des Docs und der TreeLB identisch sind.
629 |* Wird ein Doc uebergeben, wird dieses zum aktuellem Doc (Wichtig bei
630 |* mehreren Documenten).
631 |*
632 \************************************************************************/
633 
634 sal_Bool SdPageObjsTLB::IsEqualToDoc( const SdDrawDocument* pInDoc )
635 {
636 	if( pInDoc )
637 		mpDoc = pInDoc;
638 
639 	if( !mpDoc )
640 		return( sal_False );
641 
642 	SdrObject*	 pObj = NULL;
643 	SdPage* 	 pPage = NULL;
644 	SvLBoxEntry* pEntry = First();
645 	String		 aName;
646 
647 	// Alle Pages incl. Objekte vergleichen
648 	sal_uInt16 nPage = 0;
649 	const sal_uInt16 nMaxPages = mpDoc->GetPageCount();
650 
651 	while( nPage < nMaxPages )
652 	{
653 		pPage = (SdPage*) mpDoc->GetPage( nPage );
654 		if( pPage->GetPageKind() == PK_STANDARD )
655 		{
656 			if( !pEntry )
657 				return( sal_False );
658 			aName = GetEntryText( pEntry );
659 
660 			if( pPage->GetName() != aName )
661 				return( sal_False );
662 
663 			pEntry = Next( pEntry );
664 
665 			SdrObjListIter aIter(
666                 *pPage,
667                 !pPage->HasObjectNavigationOrder() /* use navigation order, if available */,
668                 IM_DEEPWITHGROUPS );
669 
670 			while( aIter.IsMore() )
671 			{
672 				pObj = aIter.Next();
673 
674                 const String aObjectName( GetObjectName( pObj ) );
675 
676 				if( aObjectName.Len() )
677 				{
678 					if( !pEntry )
679 						return( sal_False );
680 
681                 	aName = GetEntryText( pEntry );
682 
683 					if( aObjectName != aName )
684 						return( sal_False );
685 
686 					pEntry = Next( pEntry );
687 				}
688 			}
689 		}
690 		nPage++;
691 	}
692 	// Wenn noch Eintraege in der Listbox vorhanden sind, wurden
693 	// Objekte (mit Namen) oder Seiten geloescht
694 	return( !pEntry );
695 }
696 
697 /*************************************************************************
698 |*
699 |* Selectierten String zurueckgeben
700 |*
701 \************************************************************************/
702 
703 String SdPageObjsTLB::GetSelectEntry()
704 {
705 	return( GetEntryText( GetCurEntry() ) );
706 }
707 
708 /*************************************************************************
709 |*
710 |* Selektierte Eintrage zurueckgeben
711 |* nDepth == 0 -> Seiten
712 |* nDepth == 1 -> Objekte
713 |*
714 \************************************************************************/
715 
716 List* SdPageObjsTLB::GetSelectEntryList( sal_uInt16 nDepth )
717 {
718 	List*		 pList	= NULL;
719 	SvLBoxEntry* pEntry = FirstSelected();
720 
721 	while( pEntry )
722 	{
723 		sal_uInt16 nListDepth = GetModel()->GetDepth( pEntry );
724 		if( nListDepth == nDepth )
725 		{
726 			if( !pList )
727 				pList = new List();
728 
729 			const String aEntryText( GetEntryText( pEntry ) );
730 			pList->Insert( new String( aEntryText ), LIST_APPEND );
731 		}
732 		pEntry = NextSelected( pEntry );
733 	}
734 
735 	return( pList );
736 }
737 
738 /*************************************************************************
739 |*
740 |* Eintraege werden erst auf Anforderung (Doppelklick) eingefuegt
741 |*
742 \************************************************************************/
743 
744 void SdPageObjsTLB::RequestingChilds( SvLBoxEntry* pFileEntry )
745 {
746 	if( !pFileEntry->HasChilds() )
747 	{
748 		if( GetBookmarkDoc() )
749 		{
750 			SdrObject*	 pObj = NULL;
751 			SdPage* 	 pPage = NULL;
752 			SvLBoxEntry* pPageEntry = NULL;
753 
754 			Image aImgPage=Image( BitmapEx( SdResId( BMP_PAGE ) ) );
755 			Image aImgPageObjs=Image( BitmapEx( SdResId( BMP_PAGEOBJS ) ) );
756 			Image aImgObjects=Image( BitmapEx( SdResId( BMP_OBJECTS ) ) );
757 			Image aImgPageH=Image( BitmapEx( SdResId( BMP_PAGE_H ) ) );
758 			Image aImgPageObjsH=Image( BitmapEx( SdResId( BMP_PAGEOBJS_H ) ) );
759 			Image aImgObjectsH=Image( BitmapEx( SdResId( BMP_OBJECTS_H ) ) );
760 
761 			// document name already inserted
762 
763 			// only insert all "normal" ? slides with objects
764 			sal_uInt16 nPage = 0;
765 			const sal_uInt16 nMaxPages = mpBookmarkDoc->GetPageCount();
766 
767 			while( nPage < nMaxPages )
768 			{
769 				pPage = (SdPage*) mpBookmarkDoc->GetPage( nPage );
770 				if( pPage->GetPageKind() == PK_STANDARD )
771 				{
772 					pPageEntry = InsertEntry( pPage->GetName(),
773 					                          aImgPage,
774 					                          aImgPage,
775 					                          pFileEntry,
776 							                  sal_False,
777 								              LIST_APPEND,
778 								              reinterpret_cast< void* >( 1 ) );
779 
780 					SetExpandedEntryBmp( pPageEntry, aImgPageH, BMP_COLOR_HIGHCONTRAST );
781 					SetCollapsedEntryBmp( pPageEntry, aImgPageH, BMP_COLOR_HIGHCONTRAST );
782 
783 					SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
784 
785 					while( aIter.IsMore() )
786 					{
787 						pObj = aIter.Next();
788 						String aStr( GetObjectName( pObj ) );
789 						if( aStr.Len() )
790 						{
791 							if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_OLE2 )
792 							{
793 								SvLBoxEntry* pNewEntry = InsertEntry(aStr, maImgOle, maImgOle, pPageEntry);
794 
795 
796 								SetExpandedEntryBmp( pNewEntry, maImgOleH, BMP_COLOR_HIGHCONTRAST );
797 								SetCollapsedEntryBmp( pNewEntry, maImgOleH, BMP_COLOR_HIGHCONTRAST );
798 							}
799 							else if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_GRAF )
800 							{
801 								SvLBoxEntry* pNewEntry = InsertEntry(aStr, maImgGraphic, maImgGraphic, pPageEntry);
802 
803 								SetExpandedEntryBmp( pNewEntry, maImgGraphicH, BMP_COLOR_HIGHCONTRAST );
804 								SetCollapsedEntryBmp( pNewEntry, maImgGraphicH, BMP_COLOR_HIGHCONTRAST );
805 							}
806 							else
807 							{
808 								SvLBoxEntry* pNewEntry = InsertEntry(aStr, aImgObjects, aImgObjects, pPageEntry);
809 
810 								SetExpandedEntryBmp( pNewEntry, aImgObjectsH, BMP_COLOR_HIGHCONTRAST );
811 								SetCollapsedEntryBmp( pNewEntry, aImgObjectsH, BMP_COLOR_HIGHCONTRAST );
812 							}
813 						}
814 					}
815 					if( pPageEntry->HasChilds() )
816 					{
817 						SetExpandedEntryBmp( pPageEntry, aImgPageObjs );
818 						SetCollapsedEntryBmp( pPageEntry, aImgPageObjs );
819 						SetExpandedEntryBmp( pPageEntry, aImgPageObjsH, BMP_COLOR_HIGHCONTRAST );
820 						SetCollapsedEntryBmp( pPageEntry, aImgPageObjsH, BMP_COLOR_HIGHCONTRAST );
821 					}
822 				}
823 				nPage++;
824 			}
825 		}
826 	}
827 	else
828 		SvTreeListBox::RequestingChilds( pFileEntry );
829 }
830 
831 /*************************************************************************
832 |*
833 |*	Prueft, ob es sich um eine Draw-Datei handelt und oeffnet anhand des
834 |*	uebergebenen Docs das BookmarkDoc
835 |*
836 \************************************************************************/
837 
838 SdDrawDocument* SdPageObjsTLB::GetBookmarkDoc(SfxMedium* pMed)
839 {
840 	if (
841        !mpBookmarkDoc ||
842 		 (pMed && (!mpOwnMedium || mpOwnMedium->GetName() != pMed->GetName()))
843       )
844 	{
845         // create a new BookmarkDoc if now one exists or if a new Medium is provided
846         if (mpOwnMedium != pMed)
847 		{
848 			CloseBookmarkDoc();
849 		}
850 
851 		if (pMed)
852 		{
853             // it looks that it is undefined if a Medium was set by Fill() allready
854             DBG_ASSERT( !mpMedium, "SfxMedium confusion!" );
855             delete mpMedium;
856             mpMedium = NULL;
857 
858             // take over this Medium (currently used only be Navigator)
859 			mpOwnMedium = pMed;
860         }
861 
862         DBG_ASSERT( mpMedium || pMed, "No SfxMedium provided!" );
863 
864         if( pMed )
865         {
866             // in this mode the document is also owned and controlled by this instance
867             mxBookmarkDocShRef = new ::sd::DrawDocShell(SFX_CREATE_MODE_STANDARD, sal_True);
868             if (mxBookmarkDocShRef->DoLoad(pMed))
869                 mpBookmarkDoc = mxBookmarkDocShRef->GetDoc();
870             else
871                 mpBookmarkDoc = NULL;
872         }
873         else if ( mpMedium )
874             // in this mode the document is owned and controlled by the SdDrawDocument
875             // it can be released by calling the corresponding CloseBookmarkDoc method
876             // successfull creation of a document makes this the owner of the medium
877             mpBookmarkDoc = ((SdDrawDocument*) mpDoc)->OpenBookmarkDoc(*mpMedium);
878 
879         if ( !mpBookmarkDoc )
880 		{
881 			ErrorBox aErrorBox( this, WB_OK, String( SdResId( STR_READ_DATA_ERROR ) ) );
882 			aErrorBox.Execute();
883             mpMedium = 0; //On failure the SfxMedium is invalid
884 		}
885 	}
886 
887 	return( mpBookmarkDoc );
888 }
889 
890 /*************************************************************************
891 |*
892 |* Bookmark-Dokument schlie�en und loeschen
893 |*
894 \************************************************************************/
895 
896 void SdPageObjsTLB::CloseBookmarkDoc()
897 {
898 	if (mxBookmarkDocShRef.Is())
899 	{
900 		mxBookmarkDocShRef->DoClose();
901         mxBookmarkDocShRef.Clear();
902 
903         // Medium is owned by document, so it's destroyed already
904         mpOwnMedium = 0;
905 	}
906     else if ( mpBookmarkDoc )
907 	{
908         DBG_ASSERT( !mpOwnMedium, "SfxMedium confusion!" );
909         if ( mpDoc )
910         {
911             // The document owns the Medium, so the Medium will be invalid after closing the document
912 			((SdDrawDocument*) mpDoc)->CloseBookmarkDoc();
913             mpMedium = 0;
914         }
915 	}
916     else
917     {
918         // perhaps mpOwnMedium provided, but no successfull creation of BookmarkDoc
919         delete mpOwnMedium;
920         mpOwnMedium = NULL;
921     }
922 
923 	mpBookmarkDoc = NULL;
924 }
925 
926 /*************************************************************************
927 |*
928 |*
929 |*
930 \************************************************************************/
931 
932 void SdPageObjsTLB::SelectHdl()
933 {
934 	SvLBoxEntry* pEntry = FirstSelected();
935 
936 	mbLinkableSelected = sal_True;
937 
938 	while( pEntry && mbLinkableSelected )
939 	{
940 	    if( NULL == pEntry->GetUserData() )
941 	        mbLinkableSelected = sal_False;
942 
943 		pEntry = NextSelected( pEntry );
944 	}
945 
946 	SvTreeListBox::SelectHdl();
947 }
948 
949 /*************************************************************************
950 |*
951 |* Ueberlaedt RETURN mit der Funktionsweise von DoubleClick
952 |*
953 \************************************************************************/
954 
955 void SdPageObjsTLB::KeyInput( const KeyEvent& rKEvt )
956 {
957 	if( rKEvt.GetKeyCode().GetCode() == KEY_RETURN )
958 	{
959 		// Auskommentierter Code aus svtools/source/contnr/svimpbox.cxx
960 		SvLBoxEntry* pCursor = GetCurEntry();
961 		if( pCursor->HasChilds() || pCursor->HasChildsOnDemand() )
962 		{
963 			if( IsExpanded( pCursor ) )
964 				Collapse( pCursor );
965 			else
966 				Expand( pCursor );
967 		}
968 
969 		DoubleClickHdl();
970 	}
971 	else
972 		SvTreeListBox::KeyInput( rKEvt );
973 }
974 
975 /*************************************************************************
976 |*
977 |* StartDrag-Request
978 |*
979 \************************************************************************/
980 
981 void SdPageObjsTLB::StartDrag( sal_Int8 nAction, const Point& rPosPixel)
982 {
983     (void)nAction;
984     (void)rPosPixel;
985 
986 	SdNavigatorWin* pNavWin = NULL;
987     SvLBoxEntry* pEntry = GetEntry(rPosPixel);
988 
989 	if( mpFrame->HasChildWindow( SID_NAVIGATOR ) )
990 		pNavWin = (SdNavigatorWin*) ( mpFrame->GetChildWindow( SID_NAVIGATOR )->GetContextWindow( SD_MOD() ) );
991 
992 	if (pEntry != NULL
993         && pNavWin !=NULL
994         && pNavWin == mpParent
995         && pNavWin->GetNavigatorDragType() != NAVIGATOR_DRAGTYPE_NONE )
996 	{
997         // Mark only the children of the page under the mouse as drop
998         // targets.  This prevents moving shapes from one page to another.
999 
1000         // Select all entries and disable them as drop targets.
1001         SetSelectionMode(MULTIPLE_SELECTION);
1002         SetCursor(NULL, sal_False);
1003         SelectAll(sal_True, sal_False);
1004         EnableSelectionAsDropTarget(sal_False, sal_True);
1005 
1006         // Enable only the entries as drop targets that are children of the
1007         // page under the mouse.
1008         SvLBoxEntry* pParent = GetRootLevelParent(pEntry);
1009         if (pParent != NULL)
1010         {
1011             SelectAll(sal_False, sal_False);
1012             Select(pParent, sal_True);
1013             //            for (SvLBoxEntry*pChild=FirstChild(pParent); pChild!=NULL; pChild=NextSibling(pChild))
1014             //                Select(pChild, sal_True);
1015             EnableSelectionAsDropTarget(sal_True, sal_True);//sal_False);
1016         }
1017 
1018         // Set selection back to the entry under the mouse.
1019         SelectAll(sal_False,sal_False);
1020         SetSelectionMode(SINGLE_SELECTION);
1021         Select(pEntry, sal_True);
1022 
1023 		//  Aus dem ExecuteDrag heraus kann der Navigator geloescht werden
1024 		//  (beim Umschalten auf einen anderen Dokument-Typ), das wuerde aber
1025 		//  den StarView MouseMove-Handler, der Command() aufruft, umbringen.
1026 		//  Deshalb Drag&Drop asynchron:
1027         Application::PostUserEvent( STATIC_LINK( this, SdPageObjsTLB, ExecDragHdl ) );
1028 	}
1029 }
1030 
1031 /*************************************************************************
1032 |*
1033 |* Begin drag
1034 |*
1035 \************************************************************************/
1036 
1037 void SdPageObjsTLB::DoDrag()
1038 {
1039 	mpDropNavWin = ( mpFrame->HasChildWindow( SID_NAVIGATOR ) ) ?
1040 				  (SdNavigatorWin*)( mpFrame->GetChildWindow( SID_NAVIGATOR )->GetContextWindow( SD_MOD() ) ) :
1041 				  NULL;
1042 
1043 	if( mpDropNavWin )
1044 	{
1045 		::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh();
1046         String aURL = INetURLObject( pDocShell->GetMedium()->GetPhysicalName(), INET_PROT_FILE ).GetMainURL( INetURLObject::NO_DECODE );
1047 		NavigatorDragType	eDragType = mpDropNavWin->GetNavigatorDragType();
1048 
1049 		aURL.Append( '#' );
1050 		aURL.Append( GetSelectEntry() );
1051 
1052 		INetBookmark	aBookmark( aURL, GetSelectEntry() );
1053 		sal_Int8		nDNDActions = DND_ACTION_COPYMOVE;
1054 
1055 		if( eDragType == NAVIGATOR_DRAGTYPE_LINK )
1056 			nDNDActions = DND_ACTION_LINK;	// #93240# Either COPY *or* LINK, never both!
1057         else if (mpDoc->GetSdPageCount(PK_STANDARD) == 1)
1058         {
1059             // Can not move away the last slide in a document.
1060             nDNDActions = DND_ACTION_COPY;
1061         }
1062 
1063 		SvTreeListBox::ReleaseMouse();
1064 
1065 		bIsInDrag = sal_True;
1066 
1067         SvLBoxDDInfo aDDInfo;
1068         memset(&aDDInfo,0,sizeof(SvLBoxDDInfo));
1069         aDDInfo.pApp = GetpApp();
1070         aDDInfo.pSource = this;
1071         //            aDDInfo.pDDStartEntry = pEntry;
1072 		::com::sun::star::uno::Sequence<sal_Int8> aSequence (sizeof(SvLBoxDDInfo));
1073 		memcpy(aSequence.getArray(), (sal_Char*)&aDDInfo, sizeof(SvLBoxDDInfo));
1074 		::com::sun::star::uno::Any aTreeListBoxData (aSequence);
1075 
1076 		// object is destroyed by internal reference mechanism
1077 		SdTransferable* pTransferable = new SdPageObjsTLB::SdPageObjsTransferable(
1078             *this, aBookmark, *pDocShell, eDragType, aTreeListBoxData);
1079 
1080         // Get the view.
1081         ::sd::ViewShell* pViewShell = GetViewShellForDocShell(*pDocShell);
1082         if (pViewShell == NULL)
1083         {
1084             OSL_ASSERT(pViewShell!=NULL);
1085             return;
1086         }
1087         sd::View* pView = pViewShell->GetView();
1088         if (pView == NULL)
1089         {
1090             OSL_ASSERT(pView!=NULL);
1091             return;
1092         }
1093 
1094         SdrObject* pObject = NULL;
1095         void* pUserData = GetCurEntry()->GetUserData();
1096         if (pUserData != NULL && pUserData != (void*)1)
1097             pObject = reinterpret_cast<SdrObject*>(pUserData);
1098         if (pObject != NULL)
1099         {
1100             // For shapes without a user supplied name (the automatically
1101             // created name does not count), a different drag and drop technique
1102             // is used.
1103             if (GetObjectName(pObject, false).Len() == 0)
1104             {
1105                 AddShapeToTransferable(*pTransferable, *pObject);
1106                 pTransferable->SetView(pView);
1107                 SD_MOD()->pTransferDrag = pTransferable;
1108             }
1109 
1110             // Unnamed shapes have to be selected to be recognized by the
1111             // current drop implementation.  In order to have a consistent
1112             // behaviour for all shapes, every shape that is to be dragged is
1113             // selected first.
1114             SdrPageView* pPageView = pView->GetSdrPageView();
1115             pView->UnmarkAllObj(pPageView);
1116             pView->MarkObj(pObject, pPageView);
1117         }
1118         else
1119         {
1120             pTransferable->SetView(pView);
1121             SD_MOD()->pTransferDrag = pTransferable;
1122         }
1123 
1124         pTransferable->StartDrag( this, nDNDActions );
1125 	}
1126 }
1127 
1128 /*************************************************************************
1129 |*
1130 |* Drag finished
1131 |*
1132 \************************************************************************/
1133 
1134 void SdPageObjsTLB::OnDragFinished( sal_uInt8 )
1135 {
1136 	if( mpFrame->HasChildWindow( SID_NAVIGATOR ) )
1137 	{
1138 		SdNavigatorWin* pNewNavWin = (SdNavigatorWin*) ( mpFrame->GetChildWindow( SID_NAVIGATOR )->GetContextWindow( SD_MOD() ) );
1139 
1140 		if( mpDropNavWin == pNewNavWin)
1141 		{
1142 			MouseEvent aMEvt( mpDropNavWin->GetPointerPosPixel() );
1143 			SvTreeListBox::MouseButtonUp( aMEvt );
1144 		}
1145 	}
1146 
1147 	mpDropNavWin = NULL;
1148 	bIsInDrag = sal_False;
1149 }
1150 
1151 /*************************************************************************
1152 |*
1153 |* AcceptDrop-Event
1154 |*
1155 \************************************************************************/
1156 
1157 sal_Int8 SdPageObjsTLB::AcceptDrop (const AcceptDropEvent& rEvent)
1158 {
1159     sal_Int8 nResult (DND_ACTION_NONE);
1160 
1161 	if ( !bIsInDrag && IsDropFormatSupported( FORMAT_FILE ) )
1162     {
1163         nResult = rEvent.mnAction;
1164     }
1165     else
1166     {
1167         SvLBoxEntry* pEntry = GetDropTarget(rEvent.maPosPixel);
1168         if (rEvent.mbLeaving || !CheckDragAndDropMode( this, rEvent.mnAction ))
1169         {
1170             ImplShowTargetEmphasis( pTargetEntry, sal_False );
1171         }
1172         else if( !nDragDropMode )
1173         {
1174             DBG_ERRORFILE( "SdPageObjsTLB::AcceptDrop(): no target" );
1175         }
1176         else if (IsDropAllowed(pEntry))
1177         {
1178             nResult = DND_ACTION_MOVE;
1179 
1180             // Draw emphasis.
1181             if (pEntry != pTargetEntry || !(nImpFlags & SVLBOX_TARGEMPH_VIS))
1182             {
1183                 ImplShowTargetEmphasis( pTargetEntry, sal_False );
1184                 pTargetEntry = pEntry;
1185                 ImplShowTargetEmphasis( pTargetEntry, sal_True );
1186             }
1187         }
1188     }
1189 
1190     // Hide emphasis when there is no valid drop action.
1191     if (nResult == DND_ACTION_NONE)
1192         ImplShowTargetEmphasis(pTargetEntry, sal_False);
1193 
1194     return nResult;
1195 }
1196 
1197 /*************************************************************************
1198 |*
1199 |* ExecuteDrop-Event
1200 |*
1201 \************************************************************************/
1202 
1203 sal_Int8 SdPageObjsTLB::ExecuteDrop( const ExecuteDropEvent& rEvt )
1204 {
1205 	sal_Int8 nRet = DND_ACTION_NONE;
1206 
1207     try
1208     {
1209         if( !bIsInDrag )
1210         {
1211             SdNavigatorWin* pNavWin = NULL;
1212             sal_uInt16			nId = SID_NAVIGATOR;
1213 
1214             if( mpFrame->HasChildWindow( nId ) )
1215                 pNavWin = (SdNavigatorWin*)( mpFrame->GetChildWindow( nId )->GetContextWindow( SD_MOD() ) );
1216 
1217             if( pNavWin && ( pNavWin == mpParent ) )
1218             {
1219                 TransferableDataHelper	aDataHelper( rEvt.maDropEvent.Transferable );
1220                 String					aFile;
1221 
1222                 if( aDataHelper.GetString( FORMAT_FILE, aFile ) &&
1223                     ( (SdNavigatorWin*) mpParent)->InsertFile( aFile ) )
1224                 {
1225                     nRet = rEvt.mnAction;
1226                 }
1227             }
1228         }
1229     }
1230     catch (com::sun::star::uno::Exception&)
1231     {
1232         DBG_UNHANDLED_EXCEPTION();
1233     }
1234 
1235     if (nRet == DND_ACTION_NONE)
1236         SvTreeListBox::ExecuteDrop(rEvt, this);
1237 
1238 
1239 	return nRet;
1240 }
1241 
1242 /*************************************************************************
1243 |*
1244 |* Handler fuers Dragging
1245 |*
1246 \************************************************************************/
1247 
1248 IMPL_STATIC_LINK(SdPageObjsTLB, ExecDragHdl, void*, EMPTYARG)
1249 {
1250 	//	als Link, damit asynchron ohne ImpMouseMoveMsg auf dem Stack auch der
1251 	//	Navigator geloescht werden darf
1252 	pThis->DoDrag();
1253 	return 0;
1254 }
1255 
1256 
1257 bool SdPageObjsTLB::PageBelongsToCurrentShow (const SdPage* pPage) const
1258 {
1259     // Return <TRUE/> as default when there is no custom show or when none
1260     // is used.  The page does then belong to the standard show.
1261     bool bBelongsToShow = true;
1262 
1263     if (mpDoc->getPresentationSettings().mbCustomShow)
1264     {
1265         // Get the current custom show.
1266         SdCustomShow* pCustomShow = NULL;
1267         List* pShowList = const_cast<SdDrawDocument*>(mpDoc)->GetCustomShowList();
1268         if (pShowList != NULL)
1269         {
1270             sal_uLong nCurrentShowIndex = pShowList->GetCurPos();
1271             void* pObject = pShowList->GetObject(nCurrentShowIndex);
1272             pCustomShow = static_cast<SdCustomShow*>(pObject);
1273         }
1274 
1275         // Check whether the given page is part of that custom show.
1276         if (pCustomShow != NULL)
1277         {
1278             bBelongsToShow = false;
1279             sal_uLong nPageCount = pCustomShow->Count();
1280             for (sal_uInt16 i=0; i<nPageCount && !bBelongsToShow; i++)
1281                 if (pPage == static_cast<SdPage*>(pCustomShow->GetObject (i)))
1282                     bBelongsToShow = true;
1283         }
1284     }
1285 
1286     return bBelongsToShow;
1287 }
1288 
1289 
1290 
1291 
1292 sal_Bool SdPageObjsTLB::NotifyMoving(
1293     SvLBoxEntry* pTarget,
1294     SvLBoxEntry* pEntry,
1295     SvLBoxEntry*& rpNewParent,
1296     sal_uLong& rNewChildPos)
1297 {
1298     SvLBoxEntry* pDestination = pTarget;
1299     while (GetParent(pDestination) != NULL && GetParent(GetParent(pDestination)) != NULL)
1300         pDestination = GetParent(pDestination);
1301 
1302     SdrObject* pTargetObject = reinterpret_cast<SdrObject*>(pDestination->GetUserData());
1303     SdrObject* pSourceObject = reinterpret_cast<SdrObject*>(pEntry->GetUserData());
1304     if (pSourceObject == reinterpret_cast<SdrObject*>(1))
1305         pSourceObject = NULL;
1306 
1307     if (pTargetObject != NULL && pSourceObject != NULL)
1308     {
1309         SdrPage* pObjectList = pSourceObject->GetPage();
1310         if (pObjectList != NULL)
1311         {
1312             sal_uInt32 nNewPosition;
1313             if (pTargetObject == reinterpret_cast<SdrObject*>(1))
1314                 nNewPosition = 0;
1315             else
1316                 nNewPosition = pTargetObject->GetNavigationPosition() + 1;
1317             pObjectList->SetObjectNavigationPosition(*pSourceObject, nNewPosition);
1318         }
1319 
1320         // Update the tree list.
1321         if (pTarget == NULL)
1322         {
1323             rpNewParent = 0;
1324             rNewChildPos = 0;
1325             return sal_True;
1326         }
1327         else if (GetParent(pDestination) == NULL)
1328         {
1329             rpNewParent = pDestination;
1330             rNewChildPos = 0;
1331         }
1332         else
1333         {
1334             rpNewParent = GetParent(pDestination);
1335             rNewChildPos = pModel->GetRelPos(pDestination) + 1;
1336             rNewChildPos += nCurEntrySelPos;
1337             nCurEntrySelPos++;
1338         }
1339         return sal_True;
1340     }
1341     else
1342         return sal_False;
1343 }
1344 
1345 
1346 
1347 
1348 SvLBoxEntry* SdPageObjsTLB::GetDropTarget (const Point& rLocation)
1349 {
1350     SvLBoxEntry* pEntry = SvTreeListBox::GetDropTarget(rLocation);
1351     if (pEntry == NULL)
1352         return NULL;
1353 
1354     if (GetParent(pEntry) == NULL)
1355     {
1356         // Use page entry as insertion position.
1357     }
1358     else
1359     {
1360         // Go to second hierarchy level, i.e. top level shapes,
1361         // i.e. children of pages.
1362         while (GetParent(pEntry) != NULL && GetParent(GetParent(pEntry)) != NULL)
1363             pEntry = GetParent(pEntry);
1364 
1365         // Advance to next sibling.
1366         SvLBoxEntry* pNext;
1367         sal_uInt16 nDepth (0);
1368         while (pEntry != NULL)
1369         {
1370             pNext = dynamic_cast<SvLBoxEntry*>(NextVisible(pEntry, &nDepth));
1371             if (pNext != NULL && nDepth > 0 && nDepth!=0xffff)
1372                 pEntry = pNext;
1373             else
1374                 break;
1375         }
1376     }
1377 
1378     return pEntry;
1379 }
1380 
1381 
1382 
1383 
1384 bool SdPageObjsTLB::IsDropAllowed (SvLBoxEntry* pEntry)
1385 {
1386     if (pEntry == NULL)
1387         return false;
1388 
1389     if ( ! IsDropFormatSupported(SdPageObjsTransferable::GetListBoxDropFormatId()))
1390         return false;
1391 
1392     if ((pEntry->GetFlags() & SV_ENTRYFLAG_DISABLE_DROP) != 0)
1393         return false;
1394 
1395     return true;
1396 }
1397 
1398 
1399 
1400 
1401 void SdPageObjsTLB::AddShapeToTransferable (
1402     SdTransferable& rTransferable,
1403     SdrObject& rObject) const
1404 {
1405 	TransferableObjectDescriptor aObjectDescriptor;
1406     bool bIsDescriptorFillingPending (true);
1407 
1408     const SdrOle2Obj* pOleObject = dynamic_cast<const SdrOle2Obj*>(&rObject);
1409     if (pOleObject != NULL && pOleObject->GetObjRef().is())
1410     {
1411         // If object has no persistence it must be copied as part of the document
1412         try
1413         {
1414             uno::Reference< embed::XEmbedPersist > xPersObj (pOleObject->GetObjRef(), uno::UNO_QUERY );
1415             if (xPersObj.is() && xPersObj->hasEntry())
1416             {
1417                 SvEmbedTransferHelper::FillTransferableObjectDescriptor(
1418                     aObjectDescriptor,
1419                     pOleObject->GetObjRef(),
1420                     pOleObject->GetGraphic(),
1421                     pOleObject->GetAspect());
1422                 bIsDescriptorFillingPending = false;
1423             }
1424         }
1425         catch( uno::Exception& )
1426         {
1427         }
1428 	}
1429 
1430     ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh();
1431 	if (bIsDescriptorFillingPending && pDocShell!=NULL)
1432     {
1433         bIsDescriptorFillingPending = false;
1434         pDocShell->FillTransferableObjectDescriptor(aObjectDescriptor);
1435     }
1436 
1437     Point aDragPos (rObject.GetCurrentBoundRect().Center());
1438     //Point aDragPos (0,0);
1439 	aObjectDescriptor.maDragStartPos = aDragPos;
1440     //	aObjectDescriptor.maSize = GetAllMarkedRect().GetSize();
1441     if (pDocShell != NULL)
1442         aObjectDescriptor.maDisplayName = pDocShell->GetMedium()->GetURLObject().GetURLNoPass();
1443     else
1444         aObjectDescriptor.maDisplayName = String();
1445 	aObjectDescriptor.mbCanLink = sal_False;
1446 
1447 	rTransferable.SetStartPos(aDragPos);
1448 	rTransferable.SetObjectDescriptor( aObjectDescriptor );
1449 }
1450 
1451 
1452 
1453 
1454 ::sd::ViewShell* SdPageObjsTLB::GetViewShellForDocShell (::sd::DrawDocShell& rDocShell)
1455 {
1456     {
1457         ::sd::ViewShell* pViewShell = rDocShell.GetViewShell();
1458         if (pViewShell != NULL)
1459             return pViewShell;
1460     }
1461 
1462     try
1463     {
1464         // Get a component enumeration from the desktop and search it for documents.
1465         uno::Reference<lang::XMultiServiceFactory> xFactory (
1466             ::comphelper::getProcessServiceFactory ());
1467         if ( ! xFactory.is())
1468             return NULL;
1469 
1470         uno::Reference<frame::XDesktop> xDesktop (xFactory->createInstance (
1471                 ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop")), uno::UNO_QUERY);
1472         if ( ! xDesktop.is())
1473             return NULL;
1474 
1475         uno::Reference<frame::XFramesSupplier> xFrameSupplier (xDesktop, uno::UNO_QUERY);
1476         if ( ! xFrameSupplier.is())
1477             return NULL;
1478 
1479         uno::Reference<container::XIndexAccess> xFrameAccess (xFrameSupplier->getFrames(), uno::UNO_QUERY);
1480         if ( ! xFrameAccess.is())
1481             return NULL;
1482 
1483         for (sal_Int32 nIndex=0,nCount=xFrameAccess->getCount(); nIndex<nCount; ++nIndex)
1484         {
1485             uno::Reference<frame::XFrame> xFrame;
1486             if ( ! (xFrameAccess->getByIndex(nIndex) >>= xFrame))
1487                 continue;
1488 
1489             ::sd::DrawController* pController = dynamic_cast<sd::DrawController*>(xFrame->getController().get());
1490             if (pController == NULL)
1491                 continue;
1492             ::sd::ViewShellBase* pBase = pController->GetViewShellBase();
1493             if (pBase == NULL)
1494                 continue;
1495             if (pBase->GetDocShell() != &rDocShell)
1496                 continue;
1497 
1498             const ::boost::shared_ptr<sd::ViewShell> pViewShell (pBase->GetMainViewShell());
1499             if (pViewShell)
1500                 return pViewShell.get();
1501         }
1502     }
1503     catch (uno::Exception e)
1504     {
1505         // When there is an exception then simply use the default value of
1506         // bIsEnabled and disable the controls.
1507     }
1508     return NULL;
1509 }
1510 
1511 
1512 
1513 
1514 //===== IconProvider ==========================================================
1515 
1516 SdPageObjsTLB::IconProvider::IconProvider (void)
1517     : maImgPage( BitmapEx( SdResId( BMP_PAGE ) ) ),
1518       maImgPageExcl( BitmapEx( SdResId( BMP_PAGE_EXCLUDED ) ) ),
1519       maImgPageObjsExcl( BitmapEx( SdResId( BMP_PAGEOBJS_EXCLUDED ) ) ),
1520       maImgPageObjs( BitmapEx( SdResId( BMP_PAGEOBJS ) ) ),
1521       maImgObjects( BitmapEx( SdResId( BMP_OBJECTS ) ) ),
1522       maImgGroup( BitmapEx( SdResId( BMP_GROUP ) ) ),
1523 
1524       maImgPageH( BitmapEx( SdResId( BMP_PAGE_H ) ) ),
1525       maImgPageExclH( BitmapEx( SdResId( BMP_PAGE_EXCLUDED_H ) ) ),
1526       maImgPageObjsExclH( BitmapEx( SdResId( BMP_PAGEOBJS_EXCLUDED_H ) ) ),
1527       maImgPageObjsH( BitmapEx( SdResId( BMP_PAGEOBJS_H ) ) ),
1528       maImgObjectsH( BitmapEx( SdResId( BMP_OBJECTS_H ) ) ),
1529       maImgGroupH( BitmapEx( SdResId( BMP_GROUP_H ) ) )
1530 {
1531 }
1532