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