xref: /AOO41X/main/sd/source/ui/dlg/navigatr.cxx (revision 1193d70da336d3c29892d6465fc19e1bdd59f51e)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 
28 #include <tools/urlobj.hxx>
29 #include <unotools/localfilehelper.hxx>
30 #include <sfx2/imgmgr.hxx>
31 #include <sfx2/fcontnr.hxx>
32 #include <svl/eitem.hxx>
33 #include <svl/stritem.hxx>
34 #include <sfx2/docfilt.hxx>
35 #include <sfx2/docfile.hxx>
36 #include <svl/intitem.hxx>
37 #include <sfx2/dispatch.hxx>
38 #include <svx/svxids.hrc>
39 #include <vcl/menu.hxx>
40 
41 #include <sfx2/viewfrm.hxx>
42 #include <sfx2/dockwin.hxx>
43 #include <sfx2/sfxresid.hxx>
44 
45 #include "pres.hxx"
46 #include "navigatr.hxx"
47 #include "navigatr.hrc"
48 #include "pgjump.hxx"
49 #include "app.hrc"
50 #include "strings.hrc"
51 #include "res_bmp.hrc"
52 #include "drawdoc.hxx"
53 #include "DrawDocShell.hxx"
54 #include "sdresid.hxx"
55 #include "ViewShell.hxx"
56 #include "ViewShellBase.hxx"
57 #include "DrawViewShell.hxx"
58 #include "slideshow.hxx"
59 #include "FrameView.hxx"
60 #include "helpids.h"
61 
62 namespace {
63 static const sal_uInt16 nShowNamedShapesFilter=1;
64 static const sal_uInt16 nShowAllShapesFilter=2;
65 }
66 
67 /*************************************************************************
68 |*  SdNavigatorWin - FloatingWindow
69 \************************************************************************/
70 
71 SdNavigatorWin::SdNavigatorWin(
72     ::Window* pParent,
73     ::sd::NavigatorChildWindow* pChWinCtxt,
74     const SdResId& rSdResId,
75     SfxBindings* pInBindings,
76     const UpdateRequestFunctor& rUpdateRequest)
77     : ::Window( pParent, rSdResId ),
78       maToolbox        ( this, SdResId( 1 ) ),
79       maTlbObjects( this, SdResId( TLB_OBJECTS ) ),
80       maLbDocs         ( this, SdResId( LB_DOCS ) ),
81       mpChildWinContext( pChWinCtxt ),
82       mbDocImported ( sal_False ),
83       // Bei Aenderung des DragTypes: SelectionMode der TLB anpassen!
84       meDragType        ( NAVIGATOR_DRAGTYPE_EMBEDDED ),
85       mpBindings        ( pInBindings ),
86       maImageList       ( SdResId( IL_NAVIGATR ) ),
87       maImageListH  ( SdResId( ILH_NAVIGATR ) )
88 {
89     maTlbObjects.SetViewFrame( mpBindings->GetDispatcher()->GetFrame() );
90 
91     FreeResource();
92 
93     maTlbObjects.SetAccessibleName(String(SdResId(STR_OBJECTS_TREE)));
94 
95     mpNavigatorCtrlItem = new SdNavigatorControllerItem( SID_NAVIGATOR_STATE, this, mpBindings, rUpdateRequest);
96     mpPageNameCtrlItem = new SdPageNameControllerItem( SID_NAVIGATOR_PAGENAME, this, mpBindings, rUpdateRequest);
97     mpDocList = new List();
98 
99     ApplyImageList(); // load images *before* calculating sizes to get something useful !!!
100 
101     Size aTbxSize( maToolbox.CalcWindowSizePixel() );
102     maToolbox.SetOutputSizePixel( aTbxSize );
103     maToolbox.SetSelectHdl( LINK( this, SdNavigatorWin, SelectToolboxHdl ) );
104     maToolbox.SetClickHdl( LINK( this, SdNavigatorWin, ClickToolboxHdl ) );
105     maToolbox.SetDropdownClickHdl( LINK(this, SdNavigatorWin, DropdownClickToolBoxHdl) );
106     maToolbox.SetItemBits( TBI_DRAGTYPE, maToolbox.GetItemBits( TBI_DRAGTYPE ) | TIB_DROPDOWNONLY );
107 
108     // Shape filter drop down menu.
109     maToolbox.SetItemBits(
110         TBI_SHAPE_FILTER,
111         maToolbox.GetItemBits(TBI_SHAPE_FILTER) | TIB_DROPDOWNONLY);
112 
113     // TreeListBox
114     // set position below toolbox
115     long nListboxYPos = maToolbox.GetPosPixel().Y() + maToolbox.GetSizePixel().Height() + 4;
116     maTlbObjects.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y );
117     maTlbObjects.SetDoubleClickHdl( LINK( this, SdNavigatorWin, ClickObjectHdl ) );
118     maTlbObjects.SetSelectionMode( SINGLE_SELECTION );
119     // set focus to listbox, otherwise it is in the toolbox which is only useful
120     // for keyboard navigation
121     maTlbObjects.GrabFocus();
122 
123     // DragTypeListBox
124     maLbDocs.SetSelectHdl( LINK( this, SdNavigatorWin, SelectDocumentHdl ) );
125     // set position below treelistbox
126     nListboxYPos = maTlbObjects.GetPosPixel().Y() + maTlbObjects.GetSizePixel().Height() + 4;
127     maLbDocs.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y );
128 
129     // assure that tool box is at least as wide as the tree list box
130     {
131         const Size aTlbSize( maTlbObjects.GetOutputSizePixel() );
132         if ( aTlbSize.Width() > aTbxSize.Width() )
133         {
134             maToolbox.SetPosSizePixel( 0, 0, aTlbSize.Width(), 0, WINDOW_POSSIZE_WIDTH );
135             aTbxSize = maToolbox.GetOutputSizePixel();
136         }
137     }
138 
139     // set min outputsize after all sizes are known
140     const long nFullHeight = nListboxYPos + maLbDocs.GetSizePixel().Height() + 4;
141     maSize = GetOutputSizePixel();
142     if( maSize.Height() < nFullHeight )
143     {
144         maSize.Height() = nFullHeight;
145         SetOutputSizePixel( maSize );
146     }
147     maMinSize = maSize;
148     const long nMinWidth = 2*maToolbox.GetPosPixel().X() + aTbxSize.Width(); // never clip the toolbox
149     if( nMinWidth > maMinSize.Width() )
150         maMinSize.Width() = nMinWidth;
151     maMinSize.Height() -= 40;
152     SfxDockingWindow* pDockingParent = dynamic_cast<SfxDockingWindow*>(GetParent());
153     if (pDockingParent != NULL)
154         pDockingParent->SetMinOutputSizePixel( maMinSize );
155 
156     // InitTlb; Wird ueber Slot initiiert
157     if (rUpdateRequest)
158         rUpdateRequest();
159 }
160 
161 // -----------------------------------------------------------------------
162 
163 SdNavigatorWin::~SdNavigatorWin()
164 {
165     delete mpNavigatorCtrlItem;
166     delete mpPageNameCtrlItem;
167 
168     // Liste der DocInfos loeschen
169     long nCount = mpDocList->Count();
170     while( nCount-- )
171         delete (NavDocInfo*) mpDocList->Remove( (sal_uLong)0 );
172 
173     delete mpDocList;
174 }
175 
176 // -----------------------------------------------------------------------
177 
178 void SdNavigatorWin::InitTreeLB( const SdDrawDocument* pDoc )
179 {
180     SdDrawDocument* pNonConstDoc = (SdDrawDocument*) pDoc; // const as const can...
181     ::sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
182     String aDocShName( pDocShell->GetName() );
183     ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
184 
185     // Restore the 'ShowAllShapes' flag from the last time (in this session)
186     // that the navigator was shown.
187     if (pViewShell != NULL)
188     {
189         ::sd::FrameView* pFrameView = pViewShell->GetFrameView();
190         if (pFrameView != NULL)
191             maTlbObjects.SetShowAllShapes(pFrameView->IsNavigatorShowingAllShapes(), false);
192     }
193 
194     // Disable the shape filter drop down menu when there is a running slide
195     // show.
196     if (pViewShell!=NULL && sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ))
197         maToolbox.EnableItem(TBI_SHAPE_FILTER, sal_False);
198     else
199         maToolbox.EnableItem(TBI_SHAPE_FILTER);
200 
201     if( !maTlbObjects.IsEqualToDoc( pDoc ) )
202     {
203         String aDocName = pDocShell->GetMedium()->GetName();
204         maTlbObjects.Clear();
205         maTlbObjects.Fill( pDoc, (sal_Bool) sal_False, aDocName ); // Nur normale Seiten
206 
207         RefreshDocumentLB();
208         maLbDocs.SelectEntry( aDocShName );
209     }
210     else
211     {
212         maLbDocs.SetNoSelection();
213         maLbDocs.SelectEntry( aDocShName );
214 
215 // auskommentiert um 30246 zu fixen
216 //        if( maLbDocs.GetSelectEntryCount() == 0 )
217         {
218             RefreshDocumentLB();
219             maLbDocs.SelectEntry( aDocShName );
220         }
221     }
222 
223     SfxViewFrame* pViewFrame = ( ( pViewShell && pViewShell->GetViewFrame() ) ? pViewShell->GetViewFrame() : SfxViewFrame::Current() );
224     if( pViewFrame )
225         pViewFrame->GetBindings().Invalidate(SID_NAVIGATOR_PAGENAME, sal_True, sal_True);
226 }
227 
228 /*************************************************************************
229 |*
230 |* DragType wird in Abhaengigkeit davon gesetzt, ob ein Drag ueberhaupt
231 |* moeglich ist. Graphiken duerfen beispielsweise unter gewissen Umstaenden
232 |* nicht gedragt werden (#31038#).
233 |*
234 \************************************************************************/
235 
236 NavigatorDragType SdNavigatorWin::GetNavigatorDragType()
237 {
238     NavigatorDragType   eDT = meDragType;
239     NavDocInfo*         pInfo = GetDocInfo();
240 
241     if( ( eDT == NAVIGATOR_DRAGTYPE_LINK ) && ( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() ) )
242         eDT = NAVIGATOR_DRAGTYPE_NONE;
243 
244     return( eDT );
245 }
246 
247 // -----------------------------------------------------------------------
248 
249 
250 IMPL_LINK( SdNavigatorWin, SelectToolboxHdl, void *, EMPTYARG )
251 {
252     sal_uInt16 nId = maToolbox.GetCurItemId();
253     sal_uInt16 nSId = 0;
254     PageJump ePage = PAGE_NONE;
255 
256     switch( nId )
257     {
258         case TBI_PEN:
259         {
260             if( nId == TBI_PEN )
261             {
262                 nSId = SID_NAVIGATOR_PEN;
263             }
264 
265             if( nSId > 0 )
266             {
267                 SfxBoolItem aItem( nSId, sal_True );
268                 mpBindings->GetDispatcher()->Execute(
269                     nSId, SFX_CALLMODE_SLOT |SFX_CALLMODE_RECORD, &aItem, 0L );
270             }
271         }
272         break;
273 
274         case TBI_FIRST:
275         case TBI_PREVIOUS:
276         case TBI_NEXT:
277         case TBI_LAST:
278         {
279             if( nId == TBI_FIRST )
280                 ePage = PAGE_FIRST;
281             else if( nId == TBI_PREVIOUS )
282                 ePage = PAGE_PREVIOUS;
283             else if( nId == TBI_NEXT )
284                 ePage = PAGE_NEXT;
285             else if( nId == TBI_LAST )
286                 ePage = PAGE_LAST;
287 
288             if( ePage != PAGE_NONE )
289             {
290                 SfxUInt16Item aItem( SID_NAVIGATOR_PAGE, (sal_uInt16)ePage );
291                 mpBindings->GetDispatcher()->Execute(
292                     SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L );
293             }
294         }
295         break;
296     }
297     return 0;
298 }
299 
300 // -----------------------------------------------------------------------
301 
302 
303 IMPL_LINK( SdNavigatorWin, ClickToolboxHdl, ToolBox*, EMPTYARG )
304 {
305     return 0;
306 }
307 
308 // -----------------------------------------------------------------------
309 
310 IMPL_LINK( SdNavigatorWin, DropdownClickToolBoxHdl, ToolBox*, pBox )
311 {
312     sal_uInt16 nId = maToolbox.GetCurItemId();
313 
314     switch( nId )
315     {
316         case TBI_DRAGTYPE:
317         {
318             // Popup-Menu wird in Abhaengigkeit davon erzeugt, ob Dokument
319             // gespeichert ist oder nicht
320             PopupMenu *pMenu = new PopupMenu;
321 
322             static const char* aHIDs[] =
323             {
324                  HID_SD_NAVIGATOR_MENU1,
325                  HID_SD_NAVIGATOR_MENU2,
326                  HID_SD_NAVIGATOR_MENU3,
327                  0
328             };
329 
330             for( sal_uInt16 nID = NAVIGATOR_DRAGTYPE_URL;
331                  nID < NAVIGATOR_DRAGTYPE_COUNT;
332                  nID++ )
333             {
334                 sal_uInt16 nRId = GetDragTypeSdResId( (NavigatorDragType)nID );
335                 if( nRId > 0 )
336                 {
337                     DBG_ASSERT(aHIDs[nID-NAVIGATOR_DRAGTYPE_URL],"HelpId not added!");
338                     pMenu->InsertItem( nID, String( SdResId( nRId ) ) );
339                     pMenu->SetHelpId( nID, aHIDs[nID - NAVIGATOR_DRAGTYPE_URL] );
340                 }
341 
342             }
343             NavDocInfo* pInfo = GetDocInfo();
344 
345             if( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() )
346             {
347                 pMenu->EnableItem( NAVIGATOR_DRAGTYPE_LINK, sal_False );
348                 pMenu->EnableItem( NAVIGATOR_DRAGTYPE_URL, sal_False );
349                 meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
350             }
351 
352             pMenu->CheckItem( (sal_uInt16)meDragType );
353             pMenu->SetSelectHdl( LINK( this, SdNavigatorWin, MenuSelectHdl ) );
354 
355             pMenu->Execute( this, maToolbox.GetItemRect( nId ), POPUPMENU_EXECUTE_DOWN );
356             pBox->EndSelection();
357             delete pMenu;
358         }
359         break;
360 
361         case TBI_SHAPE_FILTER:
362         {
363             PopupMenu *pMenu = new PopupMenu;
364 
365             pMenu->InsertItem(
366                 nShowNamedShapesFilter,
367                 String(SdResId(STR_NAVIGATOR_SHOW_NAMED_SHAPES)));
368             pMenu->InsertItem(
369                 nShowAllShapesFilter,
370                 String(SdResId(STR_NAVIGATOR_SHOW_ALL_SHAPES)));
371 
372             if (maTlbObjects.GetShowAllShapes())
373                 pMenu->CheckItem(nShowAllShapesFilter);
374             else
375                 pMenu->CheckItem(nShowNamedShapesFilter);
376             pMenu->SetSelectHdl( LINK( this, SdNavigatorWin, ShapeFilterCallback ) );
377 
378             pMenu->Execute( this, maToolbox.GetItemRect( nId ), POPUPMENU_EXECUTE_DOWN );
379             pBox->EndSelection();
380             delete pMenu;
381         }
382         break;
383     }
384     return 0;
385 }
386 
387 // -----------------------------------------------------------------------
388 
389 IMPL_LINK( SdNavigatorWin, ClickObjectHdl, void *, EMPTYARG )
390 {
391     if( !mbDocImported || maLbDocs.GetSelectEntryPos() != 0 )
392     {
393         NavDocInfo* pInfo = GetDocInfo();
394 
395         // Nur wenn es sich um das aktive Fenster handelt, wird
396         // auf die Seite gesprungen
397         if( pInfo && pInfo->IsActive() )
398         {
399             String aStr( maTlbObjects.GetSelectEntry() );
400 
401             if( aStr.Len() > 0 )
402             {
403                 SfxStringItem aItem( SID_NAVIGATOR_OBJECT, aStr );
404                 mpBindings->GetDispatcher()->Execute(
405                     SID_NAVIGATOR_OBJECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L );
406 
407                 // #98821# moved here from SetGetFocusHdl. Reset the
408                 // focus only if something has been selected in the
409                 // document.
410                 SfxViewShell* pCurSh = SfxViewShell::Current();
411 
412                 if ( pCurSh )
413                 {
414                     Window* pShellWnd = pCurSh->GetWindow();
415                     if ( pShellWnd )
416                         pShellWnd->GrabFocus();
417                 }
418             }
419         }
420     }
421     return( 0L );
422 }
423 
424 // -----------------------------------------------------------------------
425 
426 IMPL_LINK( SdNavigatorWin, SelectDocumentHdl, void *, EMPTYARG )
427 {
428     String aStrLb = maLbDocs.GetSelectEntry();
429     long   nPos = maLbDocs.GetSelectEntryPos();
430     sal_Bool   bFound = sal_False;
431     ::sd::DrawDocShell* pDocShell = NULL;
432     NavDocInfo* pInfo = GetDocInfo();
433 
434     // Handelt es sich um ein gedragtes Objekt?
435     if( mbDocImported && nPos == 0 )
436     {
437         // Dokument in TLB aufbauen
438         InsertFile( aStrLb );
439     }
440     else if (pInfo)
441     {
442         pDocShell = pInfo->mpDocShell;
443 
444         bFound = sal_True;
445     }
446 
447     if( bFound )
448     {
449         SdDrawDocument* pDoc = pDocShell->GetDoc();
450         if( !maTlbObjects.IsEqualToDoc( pDoc ) )
451         {
452             SdDrawDocument* pNonConstDoc = (SdDrawDocument*) pDoc; // const as const can...
453             ::sd::DrawDocShell* pNCDocShell = pNonConstDoc->GetDocSh();
454             String aDocName = pNCDocShell->GetMedium()->GetName();
455             maTlbObjects.Clear();
456             maTlbObjects.Fill( pDoc, (sal_Bool) sal_False, aDocName ); // Nur normale Seiten
457         }
458     }
459 
460     // Pruefen, ob Link oder URL moeglich ist
461     if( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() || ( meDragType != NAVIGATOR_DRAGTYPE_EMBEDDED ) )
462     {
463         meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
464         SetDragImage();
465     }
466 
467     return( 0L );
468 }
469 
470 /*************************************************************************
471 |*
472 |* DrageType wird gesetzt und Image wird entspr. gesetzt.
473 |* Sollte Handler mit NULL gerufen werden, so wird der Default (URL) gesetzt.
474 |*
475 \************************************************************************/
476 
477 IMPL_LINK( SdNavigatorWin, MenuSelectHdl, Menu *, pMenu )
478 {
479     sal_uInt16 nMenuId;
480     if( pMenu )
481         nMenuId = pMenu->GetCurItemId();
482     else
483         nMenuId = NAVIGATOR_DRAGTYPE_URL;
484 
485     if( nMenuId != USHRT_MAX ) // Notwendig ?
486     {
487         NavigatorDragType eDT = (NavigatorDragType) nMenuId;
488         if( meDragType != eDT )
489         {
490             meDragType = eDT;
491             SetDragImage();
492 
493             if( meDragType == NAVIGATOR_DRAGTYPE_URL )
494             {
495                 // Fix, um Endlosschleife zu unterbinden
496                 if( maTlbObjects.GetSelectionCount() > 1 )
497                     maTlbObjects.SelectAll( sal_False );
498 
499                 maTlbObjects.SetSelectionMode( SINGLE_SELECTION );
500             }
501             else
502                 maTlbObjects.SetSelectionMode( MULTIPLE_SELECTION );
503         }
504     }
505     return( 0 );
506 }
507 
508 
509 
510 
511 IMPL_LINK( SdNavigatorWin, ShapeFilterCallback, Menu *, pMenu )
512 {
513     if (pMenu != NULL)
514     {
515         bool bShowAllShapes (maTlbObjects.GetShowAllShapes());
516         sal_uInt16 nMenuId (pMenu->GetCurItemId());
517         switch (nMenuId)
518         {
519             case nShowNamedShapesFilter:
520                 bShowAllShapes = false;
521                 break;
522 
523             case nShowAllShapesFilter:
524                 bShowAllShapes = true;
525                 break;
526 
527             default:
528                 OSL_ENSURE(
529                     false, "SdNavigatorWin::ShapeFilterCallback called for unknown menu entry");
530                 break;
531         }
532 
533         maTlbObjects.SetShowAllShapes(bShowAllShapes, true);
534 
535         // Remember the selection in the FrameView.
536         NavDocInfo* pInfo = GetDocInfo();
537         if (pInfo != NULL)
538         {
539             ::sd::DrawDocShell* pDocShell = pInfo->mpDocShell;
540             if (pDocShell != NULL)
541             {
542                 ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
543                 if (pViewShell != NULL)
544                 {
545                     ::sd::FrameView* pFrameView = pViewShell->GetFrameView();
546                     if (pFrameView != NULL)
547                     {
548                         pFrameView->SetIsNavigatorShowingAllShapes(bShowAllShapes);
549                     }
550                 }
551             }
552         }
553     }
554 
555     return 0;
556 }
557 
558 // -----------------------------------------------------------------------
559 
560 void SdNavigatorWin::Resize()
561 {
562     Size aWinSize( GetOutputSizePixel() );
563     if( aWinSize.Height() >= maMinSize.Height() )
564         //aWinSize.Width() >= maMinSize.Width() )
565     {
566         Size aDiffSize;
567         aDiffSize.Width() = aWinSize.Width() - maSize.Width();
568         aDiffSize.Height() = aWinSize.Height() - maSize.Height();
569 
570         // Umgroessern der Toolbox
571         Size aObjSize( maToolbox.GetOutputSizePixel() );
572         aObjSize.Width() += aDiffSize.Width();
573         maToolbox.SetOutputSizePixel( aObjSize );
574 
575         // Umgroessern der TreeLB
576         aObjSize = maTlbObjects.Control::GetOutputSizePixel();
577         aObjSize.Width() += aDiffSize.Width();
578         aObjSize.Height() += aDiffSize.Height();
579         maTlbObjects.SetOutputSizePixel( aObjSize );
580 
581         Point aPt( 0, aDiffSize.Height() );
582 
583         // Verschieben der anderen Controls (DocumentLB)
584         maLbDocs.Hide();
585         aObjSize = maLbDocs.GetOutputSizePixel();
586         aObjSize.Width() += aDiffSize.Width();
587         maLbDocs.SetPosPixel( maLbDocs.GetPosPixel() + aPt );
588         maLbDocs.SetOutputSizePixel( aObjSize );
589         maLbDocs.Show();
590 
591         maSize = aWinSize;
592     }
593     Window::Resize();
594 }
595 
596 // -----------------------------------------------------------------------
597 
598 sal_Bool SdNavigatorWin::InsertFile(const String& rFileName)
599 {
600     INetURLObject   aURL( rFileName );
601     sal_Bool            bReturn = sal_True;
602 
603     if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
604     {
605         String aURLStr;
606         ::utl::LocalFileHelper::ConvertPhysicalNameToURL( rFileName, aURLStr );
607         aURL = INetURLObject( aURLStr );
608     }
609 
610     // get adjusted FileName
611     String aFileName( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
612 
613     if (!aFileName.Len())
614     {
615         /**********************************************************************
616         * Wieder aktuelles Dokument anzeigen
617         **********************************************************************/
618         maDropFileName = aFileName;
619     }
620     else
621     {
622         /**********************************************************************
623         * Hineingedraggtes Dokument anzeigen
624         **********************************************************************/
625         const SfxFilter* pFilter = NULL;
626         ErrCode nErr = 0;
627 
628         if (aFileName != maDropFileName)
629         {
630             SfxMedium aMed(aFileName, (STREAM_READ | STREAM_SHARE_DENYNONE), sal_False);
631             SfxFilterMatcher aMatch( String::CreateFromAscii("simpress") );
632             aMed.UseInteractionHandler( sal_True );
633             nErr = aMatch.GuessFilter(aMed, &pFilter);
634         }
635 
636         if ((pFilter && !nErr) || aFileName == maDropFileName)
637         {
638             // Das Medium muss ggf. mit READ/WRITE geoeffnet werden, daher wird
639             // ersteinmal nachgeschaut, ob es einen Storage enthaelt
640             SfxMedium* pMedium = new SfxMedium( aFileName,
641                                                 STREAM_READ | STREAM_NOCREATE,
642                                                 sal_True);                // Download
643 
644             if (pMedium->IsStorage())
645             {
646                 // Jetzt modusabhaengig:
647                 // maTlbObjects.SetSelectionMode(MULTIPLE_SELECTION);
648                 // Eigentuemeruebergabe von pMedium;
649                 SdDrawDocument* pDropDoc = maTlbObjects.GetBookmarkDoc(pMedium);
650 
651                 if (pDropDoc)
652                 {
653                     maTlbObjects.Clear();
654                     maDropFileName = aFileName;
655 
656                     if( !maTlbObjects.IsEqualToDoc( pDropDoc ) )
657                     {
658                         // Nur normale Seiten
659                         maTlbObjects.Fill(pDropDoc, (sal_Bool) sal_False, maDropFileName);
660                         RefreshDocumentLB( &maDropFileName );
661                     }
662                 }
663             }
664             else
665             {
666                 bReturn = sal_False;
667                 delete pMedium;
668             }
669         }
670         else
671         {
672             bReturn = sal_False;
673         }
674     }
675 
676     return (bReturn);
677 }
678 
679 // -----------------------------------------------------------------------
680 
681 void SdNavigatorWin::RefreshDocumentLB( const String* pDocName )
682 {
683     sal_uInt16 nPos = 0;
684 
685     if( pDocName )
686     {
687         if( mbDocImported )
688             maLbDocs.RemoveEntry( 0 );
689 
690         maLbDocs.InsertEntry( *pDocName, 0 );
691         mbDocImported = sal_True;
692     }
693     else
694     {
695         nPos = maLbDocs.GetSelectEntryPos();
696         if( nPos == LISTBOX_ENTRY_NOTFOUND )
697             nPos = 0;
698 
699         String aStr;
700         if( mbDocImported )
701             aStr = maLbDocs.GetEntry( 0 );
702 
703         maLbDocs.Clear();
704 
705         // Liste der DocInfos loeschen
706         long nCount = mpDocList->Count();
707         while( nCount-- )
708             delete (NavDocInfo*) mpDocList->Remove( (sal_uLong)0 );
709 
710         if( mbDocImported )
711             maLbDocs.InsertEntry( aStr, 0 );
712 
713         ::sd::DrawDocShell* pCurrentDocShell =
714               PTR_CAST(::sd::DrawDocShell, SfxObjectShell::Current() );
715         SfxObjectShell* pSfxDocShell = SfxObjectShell::GetFirst(0, sal_False);
716         while( pSfxDocShell )
717         {
718             ::sd::DrawDocShell* pDocShell = PTR_CAST(::sd::DrawDocShell, pSfxDocShell );
719             if( pDocShell  && !pDocShell->IsInDestruction() && ( pDocShell->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED ) )
720             {
721                 NavDocInfo* pInfo = new NavDocInfo();
722                 pInfo->mpDocShell = pDocShell;
723 
724                 aStr = pDocShell->GetMedium()->GetName();
725                 if( aStr.Len() )
726                     pInfo->SetName();
727                 else
728                     pInfo->SetName( sal_False );
729                 // z.Z. wird wieder der Name der Shell genommen (also ohne Pfad)
730                 // da Koose es als Fehler ansieht, wenn er Pfad in URL-Notation
731                 // angezeigt wird!
732                 aStr = pDocShell->GetName();
733 
734                 maLbDocs.InsertEntry( aStr, LISTBOX_APPEND );
735 
736                 //
737                 if( pDocShell == pCurrentDocShell )
738                     pInfo->SetActive();
739                 else
740                     pInfo->SetActive( sal_False );
741 
742                 mpDocList->Insert( pInfo, LIST_APPEND );
743             }
744             pSfxDocShell = SfxObjectShell::GetNext( *pSfxDocShell, 0 , sal_False );
745         }
746     }
747     maLbDocs.SelectEntryPos( nPos );
748 }
749 
750 //------------------------------------------------------------------------
751 
752 sal_uInt16 SdNavigatorWin::GetDragTypeSdResId( NavigatorDragType eDT, sal_Bool bImage )
753 {
754     switch( eDT )
755     {
756         case NAVIGATOR_DRAGTYPE_NONE:
757                 return( bImage ? 0 : STR_NONE );
758         case NAVIGATOR_DRAGTYPE_URL:
759                 return( bImage ? TBI_HYPERLINK : STR_DRAGTYPE_URL );
760         case NAVIGATOR_DRAGTYPE_EMBEDDED:
761                 return( bImage ? TBI_EMBEDDED : STR_DRAGTYPE_EMBEDDED );
762         case NAVIGATOR_DRAGTYPE_LINK:
763                 return( bImage ? TBI_LINK : STR_DRAGTYPE_LINK );
764         default: DBG_ERROR( "Keine Resource fuer DragType vorhanden!" );
765     }
766     return( 0 );
767 }
768 
769 //------------------------------------------------------------------------
770 
771 NavDocInfo* SdNavigatorWin::GetDocInfo()
772 {
773     long nPos = maLbDocs.GetSelectEntryPos();
774 
775     if( mbDocImported )
776     {
777         if( nPos == 0 )
778         {
779             return( NULL );
780         }
781         nPos--;
782     }
783 
784     NavDocInfo* pInfo = (NavDocInfo*)mpDocList->GetObject( nPos );
785 
786     return( pInfo );
787 }
788 
789 /*************************************************************************
790 |*
791 |* PreNotify
792 |*
793 \************************************************************************/
794 
795 long SdNavigatorWin::Notify(NotifyEvent& rNEvt)
796 {
797     const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
798     long            nOK = sal_False;
799 
800     if( pKEvt )
801     {
802         if( KEY_ESCAPE == pKEvt->GetKeyCode().GetCode() )
803         {
804             if( SdPageObjsTLB::IsInDrag() )
805             {
806                 // during drag'n'drop we just stop the drag but do not close the navigator
807                 nOK = sal_True;
808             }
809             else
810             {
811                 ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
812                 if( pBase )
813                 {
814                     sd::SlideShow::Stop( *pBase );
815                     // Stopping the slide show may result in a synchronous
816                     // deletion of the navigator window.  Calling the
817                     // parents Notify after this is unsafe.  Therefore we
818                     // return now.
819                     return sal_True;
820                 }
821             }
822         }
823     }
824 
825     if( !nOK )
826         nOK = Window::Notify( rNEvt );
827 
828     return( nOK );
829 }
830 
831 
832 /*************************************************************************
833 |*
834 |* KeyInput: ESCAPE abfangen, um Show zu beenden
835 |*
836 \************************************************************************/
837 
838 void SdNavigatorWin::KeyInput( const KeyEvent& rKEvt )
839 {
840     long nOK = sal_False;
841 
842     if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
843     {
844         if( SdPageObjsTLB::IsInDrag() )
845         {
846             // during drag'n'drop we just stop the drag but do not close the navigator
847             nOK = sal_True;
848         }
849         else
850         {
851             ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
852             if(pBase)
853             {
854                 ::sd::SlideShow::Stop( *pBase );
855             }
856         }
857     }
858 
859     if (!nOK)
860     {
861         Window::KeyInput(rKEvt);
862     }
863 }
864 
865 void SdNavigatorWin::DataChanged( const DataChangedEvent& rDCEvt )
866 {
867     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
868             ApplyImageList();
869 
870     Window::DataChanged( rDCEvt );
871 }
872 
873 void SdNavigatorWin::SetDragImage()
874 {
875     maToolbox.SetItemImage( TBI_DRAGTYPE, maToolbox.GetImageList().GetImage( GetDragTypeSdResId( meDragType, sal_True ) ) );
876 }
877 
878 void SdNavigatorWin::ApplyImageList()
879 {
880     const bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
881 
882     maToolbox.SetImageList( bHighContrast ? maImageListH : maImageList );
883 
884     maToolbox.SetItemImage(TBI_SHAPE_FILTER, BitmapEx(SdResId( bHighContrast ? BMP_GRAPHIC_H : BMP_GRAPHIC)));
885 
886     SetDragImage();
887 }
888 
889 
890 
891 /*************************************************************************
892 |*
893 |* ControllerItem fuer Navigator
894 |*
895 \************************************************************************/
896 
897 SdNavigatorControllerItem::SdNavigatorControllerItem(
898     sal_uInt16 _nId,
899     SdNavigatorWin* pNavWin,
900     SfxBindings*    _pBindings,
901     const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
902     : SfxControllerItem( _nId, *_pBindings ),
903       pNavigatorWin( pNavWin ),
904       maUpdateRequest(rUpdateRequest)
905 {
906 }
907 
908 // -----------------------------------------------------------------------
909 
910 void SdNavigatorControllerItem::StateChanged( sal_uInt16 nSId,
911                         SfxItemState eState, const SfxPoolItem* pItem )
912 {
913     if( eState >= SFX_ITEM_AVAILABLE && nSId == SID_NAVIGATOR_STATE )
914     {
915         const SfxUInt32Item* pStateItem = PTR_CAST( SfxUInt32Item, pItem );
916         DBG_ASSERT( pStateItem, "SfxUInt16Item erwartet");
917         sal_uInt32 nState = pStateItem->GetValue();
918 
919         // Stift
920         if( nState & NAVBTN_PEN_ENABLED &&
921             !pNavigatorWin->maToolbox.IsItemEnabled( TBI_PEN ) )
922             pNavigatorWin->maToolbox.EnableItem( TBI_PEN );
923         if( nState & NAVBTN_PEN_DISABLED &&
924             pNavigatorWin->maToolbox.IsItemEnabled( TBI_PEN ) )
925             pNavigatorWin->maToolbox.EnableItem( TBI_PEN, sal_False );
926         if( nState & NAVBTN_PEN_CHECKED &&
927             !pNavigatorWin->maToolbox.IsItemChecked( TBI_PEN ) )
928             pNavigatorWin->maToolbox.CheckItem( TBI_PEN );
929         if( nState & NAVBTN_PEN_UNCHECKED &&
930             pNavigatorWin->maToolbox.IsItemChecked( TBI_PEN ) )
931             pNavigatorWin->maToolbox.CheckItem( TBI_PEN, sal_False );
932 
933         // Nur wenn Doc in LB das Aktive ist
934         NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
935         if( pInfo && pInfo->IsActive() )
936         {
937             // First
938             if( nState & NAVBTN_FIRST_ENABLED &&
939                 !pNavigatorWin->maToolbox.IsItemEnabled( TBI_FIRST ) )
940                 pNavigatorWin->maToolbox.EnableItem( TBI_FIRST );
941             if( nState & NAVBTN_FIRST_DISABLED &&
942                 pNavigatorWin->maToolbox.IsItemEnabled( TBI_FIRST ) )
943                 pNavigatorWin->maToolbox.EnableItem( TBI_FIRST, sal_False );
944 
945             // Prev
946             if( nState & NAVBTN_PREV_ENABLED &&
947                 !pNavigatorWin->maToolbox.IsItemEnabled( TBI_PREVIOUS ) )
948                 pNavigatorWin->maToolbox.EnableItem( TBI_PREVIOUS );
949             if( nState & NAVBTN_PREV_DISABLED &&
950                 pNavigatorWin->maToolbox.IsItemEnabled( TBI_PREVIOUS ) )
951                 pNavigatorWin->maToolbox.EnableItem( TBI_PREVIOUS, sal_False );
952 
953             // Last
954             if( nState & NAVBTN_LAST_ENABLED &&
955                 !pNavigatorWin->maToolbox.IsItemEnabled( TBI_LAST ) )
956                 pNavigatorWin->maToolbox.EnableItem( TBI_LAST );
957             if( nState & NAVBTN_LAST_DISABLED &&
958                 pNavigatorWin->maToolbox.IsItemEnabled( TBI_LAST ) )
959                 pNavigatorWin->maToolbox.EnableItem( TBI_LAST, sal_False );
960 
961             // Next
962             if( nState & NAVBTN_NEXT_ENABLED &&
963                 !pNavigatorWin->maToolbox.IsItemEnabled( TBI_NEXT ) )
964                 pNavigatorWin->maToolbox.EnableItem( TBI_NEXT );
965             if( nState & NAVBTN_NEXT_DISABLED &&
966                 pNavigatorWin->maToolbox.IsItemEnabled( TBI_NEXT ) )
967                 pNavigatorWin->maToolbox.EnableItem( TBI_NEXT, sal_False );
968 
969             if( nState & NAVTLB_UPDATE )
970             {
971                 // InitTlb; Wird ueber Slot initiiert
972                 if (maUpdateRequest)
973                     maUpdateRequest();
974             }
975         }
976     }
977 }
978 
979 /*************************************************************************
980 |*
981 |* ControllerItem fuer Navigator, um die Seite in der TreeLB anzuzeigen
982 |*
983 \************************************************************************/
984 
985 SdPageNameControllerItem::SdPageNameControllerItem(
986     sal_uInt16 _nId,
987     SdNavigatorWin* pNavWin,
988     SfxBindings*    _pBindings,
989     const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
990     : SfxControllerItem( _nId, *_pBindings ),
991       pNavigatorWin( pNavWin ),
992       maUpdateRequest(rUpdateRequest)
993 {
994 }
995 
996 // -----------------------------------------------------------------------
997 
998 void SdPageNameControllerItem::StateChanged( sal_uInt16 nSId,
999                         SfxItemState eState, const SfxPoolItem* pItem )
1000 {
1001     if( eState >= SFX_ITEM_AVAILABLE && nSId == SID_NAVIGATOR_PAGENAME )
1002     {
1003         // Nur wenn Doc in LB das Aktive ist
1004         NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
1005         if( pInfo && pInfo->IsActive() )
1006         {
1007             const SfxStringItem* pStateItem = PTR_CAST( SfxStringItem, pItem );
1008             DBG_ASSERT( pStateItem, "SfxStringItem erwartet");
1009             String aPageName = pStateItem->GetValue();
1010 
1011             if( !pNavigatorWin->maTlbObjects.HasSelectedChilds( aPageName ) )
1012             {
1013                 if( pNavigatorWin->maTlbObjects.GetSelectionMode() == MULTIPLE_SELECTION )
1014                 {
1015                     // Weil sonst immer dazuselektiert wird
1016                     pNavigatorWin->maTlbObjects.SelectAll( sal_False );
1017                 }
1018                 pNavigatorWin->maTlbObjects.SelectEntry( aPageName );
1019             }
1020         }
1021     }
1022 }
1023