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

Generated by: LCOV version 1.10