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