LCOV - code coverage report
Current view: top level - sd/source/ui/dlg - navigatr.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 202 449 45.0 %
Date: 2015-06-13 12:38:46 Functions: 19 38 50.0 %
Legend: Lines: hit not hit

          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 <tools/urlobj.hxx>
      21             : #include <unotools/localfilehelper.hxx>
      22             : #include <sfx2/imgmgr.hxx>
      23             : #include <sfx2/fcontnr.hxx>
      24             : #include <svl/eitem.hxx>
      25             : #include <svl/stritem.hxx>
      26             : #include <sfx2/docfilt.hxx>
      27             : #include <sfx2/docfile.hxx>
      28             : #include <svl/intitem.hxx>
      29             : #include <sfx2/dispatch.hxx>
      30             : #include <svx/svxids.hrc>
      31             : 
      32             : #include <vcl/menu.hxx>
      33             : #include <vcl/settings.hxx>
      34             : 
      35             : #include <sfx2/viewfrm.hxx>
      36             : #include <sfx2/dockwin.hxx>
      37             : #include <sfx2/sfxresid.hxx>
      38             : 
      39             : #include "pres.hxx"
      40             : #include "navigatr.hxx"
      41             : #include "navigatr.hrc"
      42             : #include "pgjump.hxx"
      43             : #include "app.hrc"
      44             : #include "strings.hrc"
      45             : #include "res_bmp.hrc"
      46             : #include "drawdoc.hxx"
      47             : #include "DrawDocShell.hxx"
      48             : #include "sdresid.hxx"
      49             : #include "ViewShell.hxx"
      50             : #include "ViewShellBase.hxx"
      51             : #include "DrawViewShell.hxx"
      52             : #include "slideshow.hxx"
      53             : #include "FrameView.hxx"
      54             : #include "helpids.h"
      55             : 
      56             : namespace {
      57             : static const sal_uInt16 nShowNamedShapesFilter=1;
      58             : static const sal_uInt16 nShowAllShapesFilter=2;
      59             : }
      60             : 
      61             : /**
      62             :  * SdNavigatorWin - FloatingWindow
      63             :  */
      64           1 : SdNavigatorWin::SdNavigatorWin(
      65             :     vcl::Window* pParent,
      66             :     ::sd::NavigatorChildWindow* pChWinCtxt,
      67             :     const SdResId& rSdResId,
      68             :     SfxBindings* pInBindings)
      69             :     : vcl::Window( pParent, rSdResId )
      70             :     , maToolbox ( VclPtr<ToolBox>::Create( this, SdResId( 1 ) ) )
      71             :     , maTlbObjects( VclPtr<SdPageObjsTLB>::Create( this, SdResId( TLB_OBJECTS ) ) )
      72             :     , maLbDocs ( VclPtr<ListBox>::Create( this, SdResId( LB_DOCS ) ) )
      73             :     , mpChildWinContext( pChWinCtxt )
      74             :     , mbDocImported ( false )
      75             :       // On changes of the DragType: adjust SelectionMode of TLB!
      76             :     , meDragType ( NAVIGATOR_DRAGTYPE_EMBEDDED )
      77             :     , mpBindings ( pInBindings )
      78             :     , mpNavigatorCtrlItem( 0 )
      79             :     , mpPageNameCtrlItem( 0 )
      80           1 :     , maImageList ( SdResId( IL_NAVIGATR ) )
      81             : {
      82           1 :     maTlbObjects->SetViewFrame( mpBindings->GetDispatcher()->GetFrame() );
      83             : 
      84           1 :     FreeResource();
      85             : 
      86           1 :     maTlbObjects->SetAccessibleName(SD_RESSTR(STR_OBJECTS_TREE));
      87             : 
      88           1 :     ApplyImageList(); // load images *before* calculating sizes to get something useful !!!
      89             : 
      90           1 :     Size aTbxSize( maToolbox->CalcWindowSizePixel() );
      91           1 :     maToolbox->SetOutputSizePixel( aTbxSize );
      92           1 :     maToolbox->SetSelectHdl( LINK( this, SdNavigatorWin, SelectToolboxHdl ) );
      93           1 :     maToolbox->SetDropdownClickHdl( LINK(this, SdNavigatorWin, DropdownClickToolBoxHdl) );
      94           1 :     maToolbox->SetItemBits( TBI_DRAGTYPE, maToolbox->GetItemBits( TBI_DRAGTYPE ) | ToolBoxItemBits::DROPDOWNONLY );
      95             : 
      96             :     // Shape filter drop down menu.
      97             :     maToolbox->SetItemBits(
      98             :         TBI_SHAPE_FILTER,
      99           1 :         maToolbox->GetItemBits(TBI_SHAPE_FILTER) | ToolBoxItemBits::DROPDOWNONLY);
     100             : 
     101             :     // TreeListBox
     102             :     // set position below toolbox
     103           1 :     long nListboxYPos = maToolbox->GetPosPixel().Y() + maToolbox->GetSizePixel().Height() + 4;
     104           1 :     maTlbObjects->setPosSizePixel( 0, nListboxYPos, 0, 0, PosSizeFlags::Y );
     105           1 :     maTlbObjects->SetDoubleClickHdl( LINK( this, SdNavigatorWin, ClickObjectHdl ) );
     106           1 :     maTlbObjects->SetSelectionMode( SINGLE_SELECTION );
     107             :     // set focus to listbox, otherwise it is in the toolbox which is only useful
     108             :     // for keyboard navigation
     109           1 :     maTlbObjects->GrabFocus();
     110           1 :     maTlbObjects->SetSdNavigatorWinFlag(true);
     111             : 
     112             :     // DragTypeListBox
     113           1 :     maLbDocs->SetSelectHdl( LINK( this, SdNavigatorWin, SelectDocumentHdl ) );
     114             :     // set position below treelistbox
     115           1 :     nListboxYPos = maTlbObjects->GetPosPixel().Y() + maTlbObjects->GetSizePixel().Height() + 4;
     116           1 :     maLbDocs->setPosSizePixel( 0, nListboxYPos, 0, 0, PosSizeFlags::Y );
     117             : 
     118             :     // assure that tool box is at least as wide as the tree list box
     119             :     {
     120           1 :         const Size aTlbSize( maTlbObjects->GetOutputSizePixel() );
     121           1 :         if ( aTlbSize.Width() > aTbxSize.Width() )
     122             :         {
     123           0 :             maToolbox->setPosSizePixel( 0, 0, aTlbSize.Width(), 0, PosSizeFlags::Width );
     124           0 :             aTbxSize = maToolbox->GetOutputSizePixel();
     125             :         }
     126             :     }
     127             : 
     128             :     // set min outputsize after all sizes are known
     129           1 :     const long nFullHeight = nListboxYPos + maLbDocs->GetSizePixel().Height() + 4;
     130           1 :     maSize = GetOutputSizePixel();
     131           1 :     if( maSize.Height() < nFullHeight )
     132             :     {
     133           0 :         maSize.Height() = nFullHeight;
     134           0 :         SetOutputSizePixel( maSize );
     135             :     }
     136           1 :     maMinSize = maSize;
     137           1 :     const long nMinWidth = 2*maToolbox->GetPosPixel().X() + aTbxSize.Width(); // never clip the toolbox
     138           1 :     if( nMinWidth > maMinSize.Width() )
     139           0 :         maMinSize.Width() = nMinWidth;
     140           1 :     maMinSize.Height() -= 40;
     141           1 :     SfxDockingWindow* pDockingParent = dynamic_cast<SfxDockingWindow*>(GetParent());
     142           1 :     if (pDockingParent != NULL)
     143           1 :         pDockingParent->SetMinOutputSizePixel( maMinSize );
     144             : 
     145           1 : }
     146             : 
     147           1 : void SdNavigatorWin::SetUpdateRequestFunctor(const UpdateRequestFunctor& rUpdateRequest)
     148             : {
     149           1 :     mpNavigatorCtrlItem = new SdNavigatorControllerItem( SID_NAVIGATOR_STATE, this, mpBindings, rUpdateRequest);
     150           1 :     mpPageNameCtrlItem = new SdPageNameControllerItem( SID_NAVIGATOR_PAGENAME, this, mpBindings, rUpdateRequest);
     151             : 
     152             :     // InitTlb; is initiated over Slot
     153           1 :     if (rUpdateRequest)
     154           1 :         rUpdateRequest();
     155           1 : }
     156             : 
     157           3 : SdNavigatorWin::~SdNavigatorWin()
     158             : {
     159           1 :     disposeOnce();
     160           2 : }
     161             : 
     162           1 : void SdNavigatorWin::dispose()
     163             : {
     164           1 :     DELETEZ( mpNavigatorCtrlItem );
     165           1 :     DELETEZ( mpPageNameCtrlItem );
     166           1 :     maToolbox.disposeAndClear();
     167           1 :     maTlbObjects.disposeAndClear();
     168           1 :     maLbDocs.disposeAndClear();
     169           1 :     vcl::Window::dispose();
     170           1 : }
     171             : 
     172             : //when object is marked , fresh the corresponding entry tree .
     173           0 : void SdNavigatorWin::FreshTree( const SdDrawDocument* pDoc )
     174             : {
     175           0 :     SdDrawDocument* pNonConstDoc = const_cast<SdDrawDocument*>(pDoc); // const as const can...
     176           0 :     sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
     177           0 :     OUString aDocShName( pDocShell->GetName() );
     178           0 :     OUString aDocName = pDocShell->GetMedium()->GetName();
     179           0 :     maTlbObjects->SetSaveTreeItemStateFlag(true); //Added by yanjun for sym2_6385
     180           0 :     maTlbObjects->Clear();
     181           0 :     maTlbObjects->Fill( pDoc, false, aDocName ); // Nur normale Seiten
     182           0 :     maTlbObjects->SetSaveTreeItemStateFlag(false); //Added by yanjun for sym2_6385
     183           0 :     RefreshDocumentLB();
     184           0 :     maLbDocs->SelectEntry( aDocShName );
     185           0 : }
     186             : 
     187           0 : void SdNavigatorWin::FreshEntry( )
     188             : {
     189           0 :     maTlbObjects->FreshCurEntry();
     190           0 : }
     191             : 
     192           4 : void SdNavigatorWin::InitTreeLB( const SdDrawDocument* pDoc )
     193             : {
     194           4 :     SdDrawDocument* pNonConstDoc = const_cast<SdDrawDocument*>(pDoc); // const as const can...
     195           4 :     ::sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
     196           4 :     OUString aDocShName( pDocShell->GetName() );
     197           4 :     ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
     198             : 
     199             :     // Restore the 'ShowAllShapes' flag from the last time (in this session)
     200             :     // that the navigator was shown.
     201           4 :     if (pViewShell != NULL)
     202             :     {
     203           4 :         ::sd::FrameView* pFrameView = pViewShell->GetFrameView();
     204           4 :         if (pFrameView != NULL)
     205           4 :             maTlbObjects->SetShowAllShapes(pFrameView->IsNavigatorShowingAllShapes(), false);
     206             :     }
     207             : 
     208             :     // Disable the shape filter drop down menu when there is a running slide
     209             :     // show.
     210           4 :     if (pViewShell!=NULL && sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ))
     211           0 :         maToolbox->EnableItem(TBI_SHAPE_FILTER, false);
     212             :     else
     213           4 :         maToolbox->EnableItem(TBI_SHAPE_FILTER);
     214             : 
     215           4 :     if( !maTlbObjects->IsEqualToDoc( pDoc ) )
     216             :     {
     217           1 :         OUString aDocName = pDocShell->GetMedium()->GetName();
     218           1 :         maTlbObjects->Clear();
     219           1 :         maTlbObjects->Fill( pDoc, false, aDocName ); // only normal pages
     220             : 
     221           1 :         RefreshDocumentLB();
     222           1 :         maLbDocs->SelectEntry( aDocShName );
     223             :     }
     224             :     else
     225             :     {
     226           3 :         maLbDocs->SetNoSelection();
     227           3 :         maLbDocs->SelectEntry( aDocShName );
     228             : 
     229             : // commented in order to fix 30246
     230             : //        if( maLbDocs->GetSelectEntryCount() == 0 )
     231             :         {
     232           3 :             RefreshDocumentLB();
     233           3 :             maLbDocs->SelectEntry( aDocShName );
     234             :         }
     235             :     }
     236             : 
     237           4 :     SfxViewFrame* pViewFrame = ( ( pViewShell && pViewShell->GetViewFrame() ) ? pViewShell->GetViewFrame() : SfxViewFrame::Current() );
     238           4 :     if( pViewFrame )
     239           4 :         pViewFrame->GetBindings().Invalidate(SID_NAVIGATOR_PAGENAME, true, true);
     240           4 : }
     241             : 
     242             : /**
     243             :  * DragType is set on dependence if a Drag is even possible. For example,
     244             :  * under certain circumstances, it is not allowed to drag graphics (#31038#).
     245             :  */
     246           0 : NavigatorDragType SdNavigatorWin::GetNavigatorDragType()
     247             : {
     248           0 :     NavigatorDragType   eDT = meDragType;
     249           0 :     NavDocInfo*         pInfo = GetDocInfo();
     250             : 
     251           0 :     if( ( eDT == NAVIGATOR_DRAGTYPE_LINK ) && ( ( pInfo && !pInfo->HasName() ) || !maTlbObjects->IsLinkableSelected() ) )
     252           0 :         eDT = NAVIGATOR_DRAGTYPE_NONE;
     253             : 
     254           0 :     return eDT;
     255             : }
     256             : 
     257             : //Get SdDrawDocShell
     258           0 : sd::DrawDocShell* SdNavigatorWin::GetDrawDocShell( const SdDrawDocument* pDoc )
     259             : {
     260           0 :     if( !pDoc )
     261           0 :         return NULL; // const as const can...
     262           0 :     sd::DrawDocShell* pDocShell = pDoc->GetDocSh();
     263           0 :     return pDocShell;
     264             : }
     265             : 
     266           0 : IMPL_LINK_NOARG_TYPED(SdNavigatorWin, SelectToolboxHdl, ToolBox *, void)
     267             : {
     268           0 :     sal_uInt16 nId = maToolbox->GetCurItemId();
     269           0 :     sal_uInt16 nSId = 0;
     270           0 :     PageJump ePage = PAGE_NONE;
     271             : 
     272           0 :     switch( nId )
     273             :     {
     274             :         case TBI_PEN:
     275             :         {
     276           0 :             if( nId == TBI_PEN )
     277             :             {
     278           0 :                 nSId = SID_NAVIGATOR_PEN;
     279             :             }
     280             : 
     281           0 :             if( nSId > 0 )
     282             :             {
     283           0 :                 SfxBoolItem aItem( nSId, true );
     284             :                 mpBindings->GetDispatcher()->Execute(
     285           0 :                     nSId, SfxCallMode::SLOT |SfxCallMode::RECORD, &aItem, 0L );
     286             :             }
     287             :         }
     288           0 :         break;
     289             : 
     290             :         case TBI_FIRST:
     291             :         case TBI_PREVIOUS:
     292             :         case TBI_NEXT:
     293             :         case TBI_LAST:
     294             :         {
     295           0 :             if( nId == TBI_FIRST )
     296           0 :                 ePage = PAGE_FIRST;
     297           0 :             else if( nId == TBI_PREVIOUS )
     298           0 :                 ePage = PAGE_PREVIOUS;
     299           0 :             else if( nId == TBI_NEXT )
     300           0 :                 ePage = PAGE_NEXT;
     301           0 :             else if( nId == TBI_LAST )
     302           0 :                 ePage = PAGE_LAST;
     303             : 
     304           0 :             if( ePage != PAGE_NONE )
     305             :             {
     306           0 :                 SfxUInt16Item aItem( SID_NAVIGATOR_PAGE, (sal_uInt16)ePage );
     307             :                 mpBindings->GetDispatcher()->Execute(
     308           0 :                     SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, &aItem, 0L );
     309             :             }
     310             :         }
     311           0 :         break;
     312             :     }
     313           0 : }
     314             : 
     315           0 : IMPL_LINK_TYPED( SdNavigatorWin, DropdownClickToolBoxHdl, ToolBox*, pBox, void )
     316             : {
     317           0 :     sal_uInt16 nId = maToolbox->GetCurItemId();
     318             : 
     319           0 :     switch( nId )
     320             :     {
     321             :         case TBI_DRAGTYPE:
     322             :         {
     323             :             // Popup menu is created depending if the document is saved or not
     324           0 :             PopupMenu *pMenu = new PopupMenu;
     325             : 
     326             :             static const char* aHIDs[] =
     327             :             {
     328             :                  HID_SD_NAVIGATOR_MENU1,
     329             :                  HID_SD_NAVIGATOR_MENU2,
     330             :                  HID_SD_NAVIGATOR_MENU3,
     331             :                  0
     332             :             };
     333             : 
     334           0 :             for( sal_uInt16 nID = NAVIGATOR_DRAGTYPE_URL;
     335             :                  nID < NAVIGATOR_DRAGTYPE_COUNT;
     336             :                  nID++ )
     337             :             {
     338           0 :                 sal_uInt16 nRId = GetDragTypeSdResId( (NavigatorDragType)nID );
     339           0 :                 if( nRId > 0 )
     340             :                 {
     341             :                     DBG_ASSERT(aHIDs[nID-NAVIGATOR_DRAGTYPE_URL],"HelpId not added!");
     342           0 :                     pMenu->InsertItem( nID, SD_RESSTR( nRId ) );
     343           0 :                     pMenu->SetHelpId( nID, aHIDs[nID - NAVIGATOR_DRAGTYPE_URL] );
     344             :                 }
     345             : 
     346             :             }
     347           0 :             NavDocInfo* pInfo = GetDocInfo();
     348             : 
     349           0 :             if( ( pInfo && !pInfo->HasName() ) || !maTlbObjects->IsLinkableSelected() )
     350             :             {
     351           0 :                 pMenu->EnableItem( NAVIGATOR_DRAGTYPE_LINK, false );
     352           0 :                 pMenu->EnableItem( NAVIGATOR_DRAGTYPE_URL, false );
     353           0 :                 meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
     354             :             }
     355             : 
     356           0 :             pMenu->CheckItem( (sal_uInt16)meDragType );
     357           0 :             pMenu->SetSelectHdl( LINK( this, SdNavigatorWin, MenuSelectHdl ) );
     358             : 
     359           0 :             pMenu->Execute( this, maToolbox->GetItemRect( nId ), PopupMenuFlags::ExecuteDown );
     360           0 :             pBox->EndSelection();
     361           0 :             delete pMenu;
     362             :         }
     363           0 :         break;
     364             : 
     365             :         case TBI_SHAPE_FILTER:
     366             :         {
     367           0 :             PopupMenu *pMenu = new PopupMenu;
     368             : 
     369             :             pMenu->InsertItem(
     370             :                 nShowNamedShapesFilter,
     371           0 :                 SD_RESSTR(STR_NAVIGATOR_SHOW_NAMED_SHAPES));
     372             :             pMenu->InsertItem(
     373             :                 nShowAllShapesFilter,
     374           0 :                 SD_RESSTR(STR_NAVIGATOR_SHOW_ALL_SHAPES));
     375             : 
     376           0 :             if (maTlbObjects->GetShowAllShapes())
     377           0 :                 pMenu->CheckItem(nShowAllShapesFilter);
     378             :             else
     379           0 :                 pMenu->CheckItem(nShowNamedShapesFilter);
     380           0 :             pMenu->SetSelectHdl( LINK( this, SdNavigatorWin, ShapeFilterCallback ) );
     381             : 
     382           0 :             pMenu->Execute( this, maToolbox->GetItemRect( nId ), PopupMenuFlags::ExecuteDown );
     383           0 :             pBox->EndSelection();
     384           0 :             delete pMenu;
     385             :         }
     386           0 :         break;
     387             :     }
     388           0 : }
     389             : 
     390           0 : IMPL_LINK_NOARG(SdNavigatorWin, ClickObjectHdl)
     391             : {
     392           0 :     if( !mbDocImported || maLbDocs->GetSelectEntryPos() != 0 )
     393             :     {
     394           0 :         NavDocInfo* pInfo = GetDocInfo();
     395             : 
     396             :         // if it is the active window, we jump to the page
     397           0 :         if( pInfo && pInfo->IsActive() )
     398             :         {
     399           0 :             OUString aStr( maTlbObjects->GetSelectEntry() );
     400             : 
     401           0 :             if( !aStr.isEmpty() )
     402             :             {
     403           0 :                 SfxStringItem aItem( SID_NAVIGATOR_OBJECT, aStr );
     404             :                 mpBindings->GetDispatcher()->Execute(
     405           0 :                     SID_NAVIGATOR_OBJECT, SfxCallMode::SLOT | SfxCallMode::RECORD, &aItem, 0L );
     406             :                 //set sign variable
     407           0 :                 maTlbObjects->MarkCurEntry(aStr);
     408             : 
     409             :                 // moved here from SetGetFocusHdl. Reset the
     410             :                 // focus only if something has been selected in the
     411             :                 // document.
     412           0 :                 SfxViewShell* pCurSh = SfxViewShell::Current();
     413             : 
     414           0 :                 if ( pCurSh )
     415             :                 {
     416           0 :                     vcl::Window* pShellWnd = pCurSh->GetWindow();
     417           0 :                     if ( pShellWnd )
     418           0 :                         pShellWnd->GrabFocus();
     419           0 :                 }
     420           0 :             }
     421             :         }
     422             :     }
     423           0 :     return 0L;
     424             : }
     425             : 
     426           0 : IMPL_LINK_NOARG(SdNavigatorWin, SelectDocumentHdl)
     427             : {
     428           0 :     OUString aStrLb = maLbDocs->GetSelectEntry();
     429           0 :     long   nPos = maLbDocs->GetSelectEntryPos();
     430           0 :     bool   bFound = false;
     431           0 :     ::sd::DrawDocShell* pDocShell = NULL;
     432           0 :     NavDocInfo* pInfo = GetDocInfo();
     433             : 
     434             :     // is it a dragged object?
     435           0 :     if( mbDocImported && nPos == 0 )
     436             :     {
     437             :         // construct document in TLB
     438           0 :         InsertFile( aStrLb );
     439             :     }
     440           0 :     else if (pInfo)
     441             :     {
     442           0 :         pDocShell = pInfo->mpDocShell;
     443             : 
     444           0 :         bFound = true;
     445             :     }
     446             : 
     447           0 :     if( bFound )
     448             :     {
     449           0 :         SdDrawDocument* pDoc = pDocShell->GetDoc();
     450           0 :         if( !maTlbObjects->IsEqualToDoc( pDoc ) )
     451             :         {
     452           0 :             SdDrawDocument* pNonConstDoc = pDoc; // const as const can...
     453           0 :             ::sd::DrawDocShell* pNCDocShell = pNonConstDoc->GetDocSh();
     454           0 :             OUString aDocName = pNCDocShell->GetMedium()->GetName();
     455           0 :             maTlbObjects->Clear();
     456           0 :             maTlbObjects->Fill( pDoc, false, aDocName ); // only normal pages
     457             :         }
     458             :     }
     459             : 
     460             :     // check if link or url is possible
     461           0 :     if( ( pInfo && !pInfo->HasName() ) || !maTlbObjects->IsLinkableSelected() || ( meDragType != NAVIGATOR_DRAGTYPE_EMBEDDED ) )
     462             :     {
     463           0 :         meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
     464           0 :         SetDragImage();
     465             :     }
     466             : 
     467           0 :     return 0L;
     468             : }
     469             : 
     470             : /**
     471             :  * Set DrageType and set image accordingly to it.
     472             :  * If the handler is called with NULL, the default (URL) is set.
     473             :  */
     474           0 : IMPL_LINK( SdNavigatorWin, MenuSelectHdl, Menu *, pMenu )
     475             : {
     476             :     sal_uInt16 nMenuId;
     477           0 :     if( pMenu )
     478           0 :         nMenuId = pMenu->GetCurItemId();
     479             :     else
     480           0 :         nMenuId = NAVIGATOR_DRAGTYPE_URL;
     481             : 
     482           0 :     if( nMenuId != USHRT_MAX ) // Necessary ?
     483             :     {
     484           0 :         NavigatorDragType eDT = (NavigatorDragType) nMenuId;
     485           0 :         if( meDragType != eDT )
     486             :         {
     487           0 :             meDragType = eDT;
     488           0 :             SetDragImage();
     489             : 
     490           0 :             if( meDragType == NAVIGATOR_DRAGTYPE_URL )
     491             :             {
     492             :                 // patch, prevents endless loop
     493           0 :                 if( maTlbObjects->GetSelectionCount() > 1 )
     494           0 :                     maTlbObjects->SelectAll( false );
     495             : 
     496           0 :                 maTlbObjects->SetSelectionMode( SINGLE_SELECTION );
     497             :             }
     498             :             else
     499           0 :                 maTlbObjects->SetSelectionMode( MULTIPLE_SELECTION );
     500             :         }
     501             :     }
     502           0 :     return 0;
     503             : }
     504             : 
     505           0 : IMPL_LINK( SdNavigatorWin, ShapeFilterCallback, Menu *, pMenu )
     506             : {
     507           0 :     if (pMenu != NULL)
     508             :     {
     509           0 :         bool bShowAllShapes (maTlbObjects->GetShowAllShapes());
     510           0 :         sal_uInt16 nMenuId (pMenu->GetCurItemId());
     511           0 :         switch (nMenuId)
     512             :         {
     513             :             case nShowNamedShapesFilter:
     514           0 :                 bShowAllShapes = false;
     515           0 :                 break;
     516             : 
     517             :             case nShowAllShapesFilter:
     518           0 :                 bShowAllShapes = true;
     519           0 :                 break;
     520             : 
     521             :             default:
     522             :                 OSL_FAIL(
     523             :                     "SdNavigatorWin::ShapeFilterCallback called for unknown menu entry");
     524           0 :                 break;
     525             :         }
     526             : 
     527           0 :         maTlbObjects->SetShowAllShapes(bShowAllShapes, true);
     528             : 
     529             :         // Remember the selection in the FrameView.
     530           0 :         NavDocInfo* pInfo = GetDocInfo();
     531           0 :         if (pInfo != NULL)
     532             :         {
     533           0 :             ::sd::DrawDocShell* pDocShell = pInfo->mpDocShell;
     534           0 :             if (pDocShell != NULL)
     535             :             {
     536           0 :                 ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
     537           0 :                 if (pViewShell != NULL)
     538             :                 {
     539           0 :                     ::sd::FrameView* pFrameView = pViewShell->GetFrameView();
     540           0 :                     if (pFrameView != NULL)
     541             :                     {
     542           0 :                         pFrameView->SetIsNavigatorShowingAllShapes(bShowAllShapes);
     543             :                     }
     544             :                 }
     545             :             }
     546             :         }
     547             :     }
     548             : 
     549           0 :     return 0;
     550             : }
     551             : 
     552           2 : void SdNavigatorWin::Resize()
     553             : {
     554           2 :     Size aWinSize( GetOutputSizePixel() );
     555           2 :     if( aWinSize.Height() >= maMinSize.Height() )
     556             :         //aWinSize.Width() >= maMinSize.Width() )
     557             :     {
     558           2 :         Size aDiffSize;
     559           2 :         aDiffSize.Width() = aWinSize.Width() - maSize.Width();
     560           2 :         aDiffSize.Height() = aWinSize.Height() - maSize.Height();
     561             : 
     562             :         // change size of Toolbox
     563           2 :         Size aObjSize( maToolbox->GetOutputSizePixel() );
     564           2 :         aObjSize.Width() += aDiffSize.Width();
     565           2 :         maToolbox->SetOutputSizePixel( aObjSize );
     566             : 
     567             :         // change size of TreeLB
     568           2 :         aObjSize = maTlbObjects->GetSizePixel();
     569           2 :         aObjSize.Width() += aDiffSize.Width();
     570           6 :         aObjSize.Height() = maLbDocs->GetPosPixel().Y() + aDiffSize.Height() -
     571           4 :             maTlbObjects->GetPosPixel().Y() - 4;
     572           2 :         maTlbObjects->SetSizePixel( aObjSize );
     573             : 
     574           2 :         Point aPt( 0, aDiffSize.Height() );
     575             : 
     576             :         // move other controls (DocumentLB)
     577           2 :         maLbDocs->Hide();
     578           2 :         aObjSize = maLbDocs->GetOutputSizePixel();
     579           2 :         aObjSize.Width() += aDiffSize.Width();
     580           2 :         maLbDocs->SetPosPixel( maLbDocs->GetPosPixel() + aPt );
     581           2 :         maLbDocs->SetOutputSizePixel( aObjSize );
     582           2 :         maLbDocs->Show();
     583             : 
     584           2 :         maSize = aWinSize;
     585             :     }
     586           2 :     Window::Resize();
     587           2 : }
     588             : 
     589           0 : bool SdNavigatorWin::InsertFile(const OUString& rFileName)
     590             : {
     591           0 :     INetURLObject   aURL( rFileName );
     592             : 
     593           0 :     if( aURL.GetProtocol() == INetProtocol::NotValid )
     594             :     {
     595           0 :         OUString aURLStr;
     596           0 :         ::utl::LocalFileHelper::ConvertPhysicalNameToURL( rFileName, aURLStr );
     597           0 :         aURL = INetURLObject( aURLStr );
     598             :     }
     599             : 
     600             :     // get adjusted FileName
     601           0 :     OUString aFileName( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
     602             : 
     603           0 :     if (aFileName.isEmpty())
     604             :     {
     605             :         // show actual document again
     606           0 :         maDropFileName = aFileName;
     607             :     }
     608             :     else
     609             :     {
     610             :         // show dragged-in document
     611           0 :         const SfxFilter* pFilter = NULL;
     612           0 :         ErrCode nErr = 0;
     613             : 
     614           0 :         if (aFileName != maDropFileName)
     615             :         {
     616           0 :             SfxMedium aMed(aFileName, (StreamMode::READ | StreamMode::SHARE_DENYNONE));
     617           0 :             SfxFilterMatcher aMatch( OUString("simpress") );
     618           0 :             aMed.UseInteractionHandler( true );
     619           0 :             nErr = aMatch.GuessFilter(aMed, &pFilter);
     620             :         }
     621             : 
     622           0 :         if ((pFilter && !nErr) || aFileName == maDropFileName)
     623             :         {
     624             :             // The medium may be opened with READ/WRITE. Therefore, we first
     625             :             // check if it contains a Storage.
     626             :             SfxMedium* pMedium = new SfxMedium( aFileName,
     627           0 :                                                 StreamMode::READ | StreamMode::NOCREATE);
     628             : 
     629           0 :             if (pMedium->IsStorage())
     630             :             {
     631             :                 // Now depending on mode:
     632             :                 // maTlbObjects->SetSelectionMode(MULTIPLE_SELECTION);
     633             :                 // handover of ownership of pMedium;
     634           0 :                 SdDrawDocument* pDropDoc = maTlbObjects->GetBookmarkDoc(pMedium);
     635             : 
     636           0 :                 if (pDropDoc)
     637             :                 {
     638           0 :                     maTlbObjects->Clear();
     639           0 :                     maDropFileName = aFileName;
     640             : 
     641           0 :                     if( !maTlbObjects->IsEqualToDoc( pDropDoc ) )
     642             :                     {
     643             :                         // only normal pages
     644           0 :                         maTlbObjects->Fill(pDropDoc, false, maDropFileName);
     645           0 :                         RefreshDocumentLB( &maDropFileName );
     646             :                     }
     647             :                 }
     648             :             }
     649             :             else
     650             :             {
     651           0 :                 delete pMedium;
     652           0 :                 return false;
     653             :             }
     654             :         }
     655             :         else
     656             :         {
     657           0 :             return false;
     658             :         }
     659             :     }
     660             : 
     661           0 :     return true;
     662             : }
     663             : 
     664           4 : void SdNavigatorWin::RefreshDocumentLB( const OUString* pDocName )
     665             : {
     666           4 :     sal_Int32 nPos = 0;
     667             : 
     668           4 :     if( pDocName )
     669             :     {
     670           0 :         if( mbDocImported )
     671           0 :             maLbDocs->RemoveEntry( 0 );
     672             : 
     673           0 :         maLbDocs->InsertEntry( *pDocName, 0 );
     674           0 :         mbDocImported = true;
     675             :     }
     676             :     else
     677             :     {
     678           4 :         nPos = maLbDocs->GetSelectEntryPos();
     679           4 :         if( nPos == LISTBOX_ENTRY_NOTFOUND )
     680           1 :             nPos = 0;
     681             : 
     682           4 :         OUString aStr;
     683           4 :         if( mbDocImported )
     684           0 :             aStr = maLbDocs->GetEntry( 0 );
     685             : 
     686           4 :         maLbDocs->Clear();
     687             : 
     688             :         // delete list of DocInfos
     689           4 :          maDocList.clear();
     690             : 
     691           4 :         if( mbDocImported )
     692           0 :             maLbDocs->InsertEntry( aStr, 0 );
     693             : 
     694             :         ::sd::DrawDocShell* pCurrentDocShell =
     695           4 :               PTR_CAST(::sd::DrawDocShell, SfxObjectShell::Current() );
     696           4 :         SfxObjectShell* pSfxDocShell = SfxObjectShell::GetFirst(0, false);
     697          12 :         while( pSfxDocShell )
     698             :         {
     699           4 :             ::sd::DrawDocShell* pDocShell = PTR_CAST(::sd::DrawDocShell, pSfxDocShell );
     700           4 :             if( pDocShell  && !pDocShell->IsInDestruction() && ( pDocShell->GetCreateMode() != SfxObjectCreateMode::EMBEDDED ) )
     701             :             {
     702           4 :                 NavDocInfo aInfo ;
     703           4 :                 aInfo.mpDocShell = pDocShell;
     704             : 
     705           4 :                 SfxMedium *pMedium = pDocShell->GetMedium();
     706           4 :                 aStr = pMedium ? pMedium->GetName() : OUString();
     707           4 :                 if( !aStr.isEmpty() )
     708           0 :                     aInfo.SetName();
     709             :                 else
     710           4 :                     aInfo.SetName( false );
     711             :                 // at the moment, we use the name of the shell again (i.e.
     712             :                 // without path) since Koose thinks it is an error if the path
     713             :                 // is shown in url notation!
     714           4 :                 aStr = pDocShell->GetName();
     715             : 
     716           4 :                 maLbDocs->InsertEntry( aStr, LISTBOX_APPEND );
     717             : 
     718           4 :                 if( pDocShell == pCurrentDocShell )
     719           4 :                     aInfo.SetActive();
     720             :                 else
     721           0 :                     aInfo.SetActive( false );
     722             : 
     723           4 :                 maDocList.push_back( aInfo );
     724             :             }
     725           4 :             pSfxDocShell = SfxObjectShell::GetNext( *pSfxDocShell, 0, false );
     726           4 :         }
     727             :     }
     728           4 :     maLbDocs->SelectEntryPos( nPos );
     729           4 : }
     730             : 
     731           1 : sal_uInt16 SdNavigatorWin::GetDragTypeSdResId( NavigatorDragType eDT, bool bImage )
     732             : {
     733           1 :     switch( eDT )
     734             :     {
     735             :         case NAVIGATOR_DRAGTYPE_NONE:
     736           0 :                 return( bImage ? 0 : STR_NONE );
     737             :         case NAVIGATOR_DRAGTYPE_URL:
     738           0 :                 return( bImage ? TBI_HYPERLINK : STR_DRAGTYPE_URL );
     739             :         case NAVIGATOR_DRAGTYPE_EMBEDDED:
     740           1 :                 return( bImage ? TBI_EMBEDDED : STR_DRAGTYPE_EMBEDDED );
     741             :         case NAVIGATOR_DRAGTYPE_LINK:
     742           0 :                 return( bImage ? TBI_LINK : STR_DRAGTYPE_LINK );
     743             :         default: OSL_FAIL( "No resource for DragType available!" );
     744             :     }
     745           0 :     return 0;
     746             : }
     747             : 
     748           3 : NavDocInfo* SdNavigatorWin::GetDocInfo()
     749             : {
     750           3 :     sal_uInt32 nPos = maLbDocs->GetSelectEntryPos();
     751             : 
     752           3 :     if( mbDocImported )
     753             :     {
     754           0 :         if( nPos == 0 )
     755             :         {
     756           0 :             return NULL;
     757             :         }
     758           0 :         nPos--;
     759             :     }
     760             : 
     761           3 :     return nPos < maDocList.size() ? &(maDocList[ nPos ]) : NULL;
     762             : }
     763             : 
     764             : /**
     765             :  * PreNotify
     766             :  */
     767          10 : bool SdNavigatorWin::Notify(NotifyEvent& rNEvt)
     768             : {
     769          10 :     const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
     770          10 :     bool            nOK = false;
     771             : 
     772          10 :     if( pKEvt )
     773             :     {
     774           0 :         if( KEY_ESCAPE == pKEvt->GetKeyCode().GetCode() )
     775             :         {
     776           0 :             if( SdPageObjsTLB::IsInDrag() )
     777             :             {
     778             :                 // during drag'n'drop we just stop the drag but do not close the navigator
     779           0 :                 nOK = true;
     780             :             }
     781             :             else
     782             :             {
     783           0 :                 ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
     784           0 :                 if( pBase )
     785             :                 {
     786           0 :                     sd::SlideShow::Stop( *pBase );
     787             :                     // Stopping the slide show may result in a synchronous
     788             :                     // deletion of the navigator window.  Calling the
     789             :                     // parents Notify after this is unsafe.  Therefore we
     790             :                     // return now.
     791           0 :                     return true;
     792             :                 }
     793             :             }
     794             :         }
     795             :     }
     796             : 
     797          10 :     if( !nOK )
     798          10 :         nOK = Window::Notify( rNEvt );
     799             : 
     800          10 :     return nOK;
     801             : }
     802             : 
     803             : /**
     804             :  * catch ESCAPE in order to end show
     805             :  */
     806           0 : void SdNavigatorWin::KeyInput( const KeyEvent& rKEvt )
     807             : {
     808           0 :     bool nOK = false;
     809             : 
     810           0 :     if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
     811             :     {
     812           0 :         if( SdPageObjsTLB::IsInDrag() )
     813             :         {
     814             :             // during drag'n'drop we just stop the drag but do not close the navigator
     815           0 :             nOK = true;
     816             :         }
     817             :         else
     818             :         {
     819           0 :             ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
     820           0 :             if(pBase)
     821             :             {
     822           0 :                 ::sd::SlideShow::Stop( *pBase );
     823             :             }
     824             :         }
     825             :     }
     826             : 
     827           0 :     if (!nOK)
     828             :     {
     829           0 :         Window::KeyInput(rKEvt);
     830             :     }
     831           0 : }
     832             : 
     833           0 : void SdNavigatorWin::DataChanged( const DataChangedEvent& rDCEvt )
     834             : {
     835           0 :     if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     836           0 :             ApplyImageList();
     837             : 
     838           0 :     Window::DataChanged( rDCEvt );
     839           0 : }
     840             : 
     841           1 : void SdNavigatorWin::SetDragImage()
     842             : {
     843           1 :     maToolbox->SetItemImage( TBI_DRAGTYPE, maToolbox->GetImageList().GetImage( GetDragTypeSdResId( meDragType, true ) ) );
     844           1 : }
     845             : 
     846           1 : void SdNavigatorWin::ApplyImageList()
     847             : {
     848             : 
     849           1 :     maToolbox->SetImageList( maImageList );
     850           1 :     maToolbox->SetItemImage(TBI_SHAPE_FILTER, Image(BitmapEx(SdResId(BMP_GRAPHIC))));
     851             : 
     852           1 :     SetDragImage();
     853           1 : }
     854             : 
     855             : /**
     856             :  * ControllerItem for Navigator
     857             :  */
     858           1 : SdNavigatorControllerItem::SdNavigatorControllerItem(
     859             :     sal_uInt16 _nId,
     860             :     SdNavigatorWin* pNavWin,
     861             :     SfxBindings*    _pBindings,
     862             :     const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
     863             :     : SfxControllerItem( _nId, *_pBindings ),
     864             :       pNavigatorWin( pNavWin ),
     865           1 :       maUpdateRequest(rUpdateRequest)
     866             : {
     867           1 : }
     868             : 
     869           1 : void SdNavigatorControllerItem::StateChanged( sal_uInt16 nSId,
     870             :                         SfxItemState eState, const SfxPoolItem* pItem )
     871             : {
     872           1 :     if( eState >= SfxItemState::DEFAULT && nSId == SID_NAVIGATOR_STATE )
     873             :     {
     874           1 :         const SfxUInt32Item* pStateItem = PTR_CAST( SfxUInt32Item, pItem );
     875             :         DBG_ASSERT( pStateItem, "SfxUInt16Item expected");
     876           1 :         sal_uInt32 nState = pStateItem->GetValue();
     877             : 
     878             :         // pen
     879           1 :         if( nState & NAVBTN_PEN_ENABLED &&
     880           0 :             !pNavigatorWin->maToolbox->IsItemEnabled( TBI_PEN ) )
     881           0 :             pNavigatorWin->maToolbox->EnableItem( TBI_PEN );
     882           2 :         if( nState & NAVBTN_PEN_DISABLED &&
     883           1 :             pNavigatorWin->maToolbox->IsItemEnabled( TBI_PEN ) )
     884           1 :             pNavigatorWin->maToolbox->EnableItem( TBI_PEN, false );
     885           1 :         if( nState & NAVBTN_PEN_CHECKED &&
     886           0 :             !pNavigatorWin->maToolbox->IsItemChecked( TBI_PEN ) )
     887           0 :             pNavigatorWin->maToolbox->CheckItem( TBI_PEN );
     888           1 :         if( nState & NAVBTN_PEN_UNCHECKED &&
     889           0 :             pNavigatorWin->maToolbox->IsItemChecked( TBI_PEN ) )
     890           0 :             pNavigatorWin->maToolbox->CheckItem( TBI_PEN, false );
     891             : 
     892             :         // only if doc in LB is the active
     893           1 :         NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
     894           1 :         if( pInfo && pInfo->IsActive() )
     895             :         {
     896             :             // First
     897           1 :             if( nState & NAVBTN_FIRST_ENABLED &&
     898           0 :                 !pNavigatorWin->maToolbox->IsItemEnabled( TBI_FIRST ) )
     899           0 :                 pNavigatorWin->maToolbox->EnableItem( TBI_FIRST );
     900           2 :             if( nState & NAVBTN_FIRST_DISABLED &&
     901           1 :                 pNavigatorWin->maToolbox->IsItemEnabled( TBI_FIRST ) )
     902           1 :                 pNavigatorWin->maToolbox->EnableItem( TBI_FIRST, false );
     903             : 
     904             :             // Prev
     905           1 :             if( nState & NAVBTN_PREV_ENABLED &&
     906           0 :                 !pNavigatorWin->maToolbox->IsItemEnabled( TBI_PREVIOUS ) )
     907           0 :                 pNavigatorWin->maToolbox->EnableItem( TBI_PREVIOUS );
     908           2 :             if( nState & NAVBTN_PREV_DISABLED &&
     909           1 :                 pNavigatorWin->maToolbox->IsItemEnabled( TBI_PREVIOUS ) )
     910           1 :                 pNavigatorWin->maToolbox->EnableItem( TBI_PREVIOUS, false );
     911             : 
     912             :             // Last
     913           1 :             if( nState & NAVBTN_LAST_ENABLED &&
     914           0 :                 !pNavigatorWin->maToolbox->IsItemEnabled( TBI_LAST ) )
     915           0 :                 pNavigatorWin->maToolbox->EnableItem( TBI_LAST );
     916           2 :             if( nState & NAVBTN_LAST_DISABLED &&
     917           1 :                 pNavigatorWin->maToolbox->IsItemEnabled( TBI_LAST ) )
     918           1 :                 pNavigatorWin->maToolbox->EnableItem( TBI_LAST, false );
     919             : 
     920             :             // Next
     921           1 :             if( nState & NAVBTN_NEXT_ENABLED &&
     922           0 :                 !pNavigatorWin->maToolbox->IsItemEnabled( TBI_NEXT ) )
     923           0 :                 pNavigatorWin->maToolbox->EnableItem( TBI_NEXT );
     924           2 :             if( nState & NAVBTN_NEXT_DISABLED &&
     925           1 :                 pNavigatorWin->maToolbox->IsItemEnabled( TBI_NEXT ) )
     926           1 :                 pNavigatorWin->maToolbox->EnableItem( TBI_NEXT, false );
     927             : 
     928           1 :             if( nState & NAVTLB_UPDATE )
     929             :             {
     930             :                 // InitTlb; is initiated by Slot
     931           1 :                 if (maUpdateRequest)
     932           1 :                     maUpdateRequest();
     933             :             }
     934             :         }
     935             :     }
     936           1 : }
     937             : 
     938             : /**
     939             :  * ControllerItem for Navigator to show page in TreeLB
     940             :  */
     941           1 : SdPageNameControllerItem::SdPageNameControllerItem(
     942             :     sal_uInt16 _nId,
     943             :     SdNavigatorWin* pNavWin,
     944             :     SfxBindings*    _pBindings,
     945             :     const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
     946             :     : SfxControllerItem( _nId, *_pBindings ),
     947             :       pNavigatorWin( pNavWin ),
     948           1 :       maUpdateRequest(rUpdateRequest)
     949             : {
     950           1 : }
     951             : 
     952           2 : void SdPageNameControllerItem::StateChanged( sal_uInt16 nSId,
     953             :                         SfxItemState eState, const SfxPoolItem* pItem )
     954             : {
     955           2 :     if( eState >= SfxItemState::DEFAULT && nSId == SID_NAVIGATOR_PAGENAME )
     956             :     {
     957             :         // only if doc in LB is the active
     958           2 :         NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
     959           2 :         if( pInfo && pInfo->IsActive() )
     960             :         {
     961           2 :             const SfxStringItem* pStateItem = PTR_CAST( SfxStringItem, pItem );
     962             :             DBG_ASSERT( pStateItem, "SfxStringItem expected");
     963           2 :             OUString aPageName = pStateItem->GetValue();
     964             : 
     965           2 :             if( !pNavigatorWin->maTlbObjects->HasSelectedChildren( aPageName ) )
     966             :             {
     967           2 :                 if( pNavigatorWin->maTlbObjects->GetSelectionMode() == MULTIPLE_SELECTION )
     968             :                 {
     969             :                     // because otherwise it is always additional select
     970           0 :                     pNavigatorWin->maTlbObjects->SelectAll( false );
     971             :                 }
     972           2 :                 pNavigatorWin->maTlbObjects->SelectEntry( aPageName );
     973           2 :             }
     974             :         }
     975             :     }
     976          68 : }
     977             : 
     978             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11