LCOV - code coverage report
Current view: top level - libreoffice/sd/source/ui/view - viewoverlaymanager.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 224 0.0 %
Date: 2012-12-27 Functions: 0 37 0.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             : 
      21             : #include "sddll.hxx"
      22             : 
      23             : #include <com/sun/star/frame/XFrame.hpp>
      24             : #include <sfx2/imagemgr.hxx>
      25             : #include <sfx2/viewfrm.hxx>
      26             : #include <sfx2/bindings.hxx>
      27             : #include <sfx2/app.hxx>
      28             : #include <sfx2/request.hxx>
      29             : #include <sfx2/dispatch.hxx>
      30             : 
      31             : #include <tools/rcid.h>
      32             : 
      33             : #include <vcl/help.hxx>
      34             : #include <vcl/lazydelete.hxx>
      35             : 
      36             : #include <svx/sdrpagewindow.hxx>
      37             : #include <svx/sdrpaintwindow.hxx>
      38             : #include <svx/sdr/overlay/overlayanimatedbitmapex.hxx>
      39             : #include <svx/sdr/overlay/overlaybitmapex.hxx>
      40             : #include <svx/sdr/overlay/overlaymanager.hxx>
      41             : #include <svx/svxids.hrc>
      42             : 
      43             : #include "view/viewoverlaymanager.hxx"
      44             : 
      45             : #include "res_bmp.hrc"
      46             : #include "DrawDocShell.hxx"
      47             : #include "DrawViewShell.hxx"
      48             : #include "DrawController.hxx"
      49             : #include "glob.hrc"
      50             : #include "strings.hrc"
      51             : #include "sdresid.hxx"
      52             : #include "EventMultiplexer.hxx"
      53             : #include "ViewShellManager.hxx"
      54             : #include "helpids.h"
      55             : #include "sdpage.hxx"
      56             : #include "drawdoc.hxx"
      57             : #include "smarttag.hxx"
      58             : 
      59             : using ::rtl::OUString;
      60             : using namespace ::com::sun::star::uno;
      61             : using namespace ::com::sun::star::frame;
      62             : 
      63             : namespace sd {
      64             : 
      65             : class ImageButtonHdl;
      66             : 
      67             : // --------------------------------------------------------------------
      68             : 
      69             : static sal_uInt16 gButtonSlots[] = { SID_INSERT_TABLE, SID_INSERT_DIAGRAM, SID_INSERT_GRAPHIC, SID_INSERT_AVMEDIA };
      70             : static sal_uInt16 gButtonToolTips[] = { STR_INSERT_TABLE, STR_INSERT_CHART, STR_INSERT_PICTURE, STR_INSERT_MOVIE };
      71             : 
      72             : // --------------------------------------------------------------------
      73             : 
      74           0 : static BitmapEx loadImageResource( sal_uInt16 nId )
      75             : {
      76           0 :     SdResId aResId( nId );
      77           0 :     aResId.SetRT( RSC_BITMAP );
      78             : 
      79           0 :     return BitmapEx( aResId );
      80             : }
      81             : 
      82             : // --------------------------------------------------------------------
      83             : 
      84           0 : static BitmapEx* getButtonImage( int index, bool large )
      85             : {
      86           0 :     static vcl::DeleteOnDeinit< BitmapEx > gSmallButtonImages[BMP_PLACEHOLDER_SMALL_END - BMP_PLACEHOLDER_SMALL_START] = { 0, 0, 0, 0, 0, 0, 0, 0 };
      87           0 :     static vcl::DeleteOnDeinit< BitmapEx > gLargeButtonImages[BMP_PLACEHOLDER_LARGE_END - BMP_PLACEHOLDER_LARGE_START] = { 0, 0, 0, 0, 0, 0, 0, 0 };
      88             : 
      89           0 :     if( !gSmallButtonImages[0].get() )
      90             :     {
      91           0 :         for( sal_uInt16 i = 0; i < (BMP_PLACEHOLDER_SMALL_END-BMP_PLACEHOLDER_SMALL_START); i++ )
      92             :         {
      93           0 :             gSmallButtonImages[i].set( new BitmapEx( loadImageResource( BMP_PLACEHOLDER_SMALL_START + i ) ) );
      94           0 :             gLargeButtonImages[i].set( new BitmapEx( loadImageResource( BMP_PLACEHOLDER_LARGE_START + i ) ) );
      95             :         }
      96             :     }
      97             : 
      98           0 :     if( large )
      99             :     {
     100           0 :         return gLargeButtonImages[index].get();
     101             :     }
     102             :     else
     103             :     {
     104           0 :         return gSmallButtonImages[index].get();
     105             :     }
     106             : }
     107             : 
     108             : // --------------------------------------------------------------------
     109             : 
     110             : const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32;
     111             : 
     112             : class ChangePlaceholderTag : public SmartTag
     113             : {
     114             :     friend class ImageButtonHdl;
     115             : public:
     116             :     ChangePlaceholderTag( ::sd::View& rView, SdrObject& rPlaceholderObj );
     117             :     virtual ~ChangePlaceholderTag();
     118             : 
     119             :     /** returns true if the SmartTag handled the event. */
     120             :     virtual bool MouseButtonDown( const MouseEvent&, SmartHdl& );
     121             : 
     122             :     /** returns true if the SmartTag consumes this event. */
     123             :     virtual bool KeyInput( const KeyEvent& rKEvt );
     124             : 
     125             :     BitmapEx createOverlayImage( int nHighlight = -1 );
     126             : 
     127             : protected:
     128             :     virtual void addCustomHandles( SdrHdlList& rHandlerList );
     129             :     virtual void disposing();
     130             :     virtual void select();
     131             :     virtual void deselect();
     132             : 
     133             : private:
     134             :     SdrObjectWeakRef    mxPlaceholderObj;
     135             : };
     136             : 
     137             : class ImageButtonHdl : public SmartHdl
     138             : {
     139             : public:
     140             :     ImageButtonHdl( const SmartTagReference& xTag, /* sal_uInt16 nSID, const Image& rImage, const Image& rImageMO, */ const Point& rPnt );
     141             :     virtual ~ImageButtonHdl();
     142             :     virtual void CreateB2dIAObject();
     143             :     virtual sal_Bool IsFocusHdl() const;
     144             :     virtual Pointer GetPointer() const;
     145             :     virtual bool isMarkable() const;
     146             : 
     147             :     virtual void onMouseEnter(const MouseEvent& rMEvt);
     148             :     virtual void onMouseLeave();
     149             : 
     150           0 :     int getHighlightId() const { return mnHighlightId; }
     151             : 
     152             :     void HideTip();
     153             : 
     154             : private:
     155             :     rtl::Reference< ChangePlaceholderTag > mxTag;
     156             : 
     157             :     int mnHighlightId;
     158             :     Size maImageSize;
     159             :     sal_uLong mnTip;
     160             : };
     161             : 
     162             : // --------------------------------------------------------------------
     163             : 
     164           0 : ImageButtonHdl::ImageButtonHdl( const SmartTagReference& xTag /*, sal_uInt16 nSID, const Image& rImage, const Image& rImageMO*/, const Point& rPnt )
     165             : : SmartHdl( xTag, rPnt )
     166           0 : , mxTag( dynamic_cast< ChangePlaceholderTag* >( xTag.get() ) )
     167             : , mnHighlightId( -1 )
     168             : , maImageSize( 42, 42 )
     169           0 : , mnTip( 0 )
     170             : {
     171           0 : }
     172             : 
     173             : // --------------------------------------------------------------------
     174             : 
     175           0 : ImageButtonHdl::~ImageButtonHdl()
     176             : {
     177           0 :     HideTip();
     178           0 : }
     179             : 
     180             : // --------------------------------------------------------------------
     181             : 
     182           0 : void ImageButtonHdl::HideTip()
     183             : {
     184           0 :     if( mnTip )
     185             :     {
     186           0 :         Help::HideTip( mnTip );
     187           0 :         mnTip = 0;
     188             :     }
     189           0 : }
     190             : 
     191             : // --------------------------------------------------------------------
     192             : 
     193             : extern ::rtl::OUString ImplRetrieveLabelFromCommand( const Reference< XFrame >& xFrame, const OUString& aCmdURL );
     194             : 
     195           0 : void ImageButtonHdl::onMouseEnter(const MouseEvent& rMEvt)
     196             : {
     197             : 
     198           0 :     if( pHdlList && pHdlList->GetView())
     199             :     {
     200           0 :         int nHighlightId = 0;
     201           0 :         OutputDevice* pDev = pHdlList->GetView()->GetFirstOutputDevice();
     202           0 :         if( pDev == 0 )
     203           0 :             pDev = Application::GetDefaultDevice();
     204             : 
     205           0 :         Point aMDPos( rMEvt.GetPosPixel() );
     206           0 :         aMDPos -= pDev->LogicToPixel( GetPos() );
     207             : 
     208           0 :         nHighlightId += aMDPos.X() > maImageSize.Width() ? 1 : 0;
     209           0 :         nHighlightId += aMDPos.Y() > maImageSize.Height() ? 2 : 0;
     210             : 
     211           0 :         if( mnHighlightId != nHighlightId )
     212             :         {
     213           0 :             HideTip();
     214             : 
     215           0 :             mnHighlightId = nHighlightId;
     216             : 
     217           0 :             if( pHdlList )
     218             :             {
     219           0 :                 SdResId aResId( gButtonToolTips[mnHighlightId] );
     220           0 :                 aResId.SetRT( RSC_STRING );
     221             : 
     222           0 :                 String aHelpText( aResId );
     223           0 :                 Rectangle aScreenRect( pDev->LogicToPixel( GetPos() ), maImageSize );
     224           0 :                 mnTip = Help::ShowTip( static_cast< ::Window* >( pHdlList->GetView()->GetFirstOutputDevice() ), aScreenRect, aHelpText, 0 ) ;
     225             :             }
     226           0 :             Touch();
     227             :         }
     228             :     }
     229           0 : }
     230             : 
     231             : // --------------------------------------------------------------------
     232             : 
     233           0 : void ImageButtonHdl::onMouseLeave()
     234             : {
     235           0 :     mnHighlightId = -1;
     236           0 :     HideTip();
     237           0 :     Touch();
     238           0 : }
     239             : 
     240             : // --------------------------------------------------------------------
     241             : 
     242           0 : void ImageButtonHdl::CreateB2dIAObject()
     243             : {
     244             :     // first throw away old one
     245           0 :     GetRidOfIAObject();
     246             : 
     247           0 :     const Point aTagPos( GetPos() );
     248           0 :     basegfx::B2DPoint aPosition( aTagPos.X(), aTagPos.Y() );
     249             : 
     250           0 :     BitmapEx aBitmapEx( mxTag->createOverlayImage( mnHighlightId ) ); // maImageMO.GetBitmapEx() : maImage.GetBitmapEx() );
     251           0 :     maImageSize = aBitmapEx.GetSizePixel();
     252           0 :     maImageSize.Width() >>= 1;
     253           0 :     maImageSize.Height() >>= 1;
     254             : 
     255           0 :     if(pHdlList)
     256             :     {
     257           0 :         SdrMarkView* pView = pHdlList->GetView();
     258             : 
     259           0 :         if(pView && !pView->areMarkHandlesHidden())
     260             :         {
     261           0 :             SdrPageView* pPageView = pView->GetSdrPageView();
     262             : 
     263           0 :             if(pPageView)
     264             :             {
     265           0 :                 for(sal_uInt32 b = 0; b < pPageView->PageWindowCount(); b++)
     266             :                 {
     267           0 :                     const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
     268             : 
     269           0 :                     SdrPaintWindow& rPaintWindow = rPageWindow.GetPaintWindow();
     270           0 :                     rtl::Reference< ::sdr::overlay::OverlayManager > xManager = rPageWindow.GetOverlayManager();
     271           0 :                     if(rPaintWindow.OutputToWindow() && xManager.is() )
     272             :                     {
     273           0 :                         ::sdr::overlay::OverlayObject* pOverlayObject = 0;
     274             : 
     275           0 :                         pOverlayObject = new ::sdr::overlay::OverlayBitmapEx( aPosition, aBitmapEx, 0, 0 );
     276           0 :                         xManager->add(*pOverlayObject);
     277           0 :                         maOverlayGroup.append(*pOverlayObject);
     278             :                     }
     279           0 :                 }
     280             :             }
     281             :         }
     282           0 :     }
     283           0 : }
     284             : 
     285             : // --------------------------------------------------------------------
     286             : 
     287           0 : sal_Bool ImageButtonHdl::IsFocusHdl() const
     288             : {
     289           0 :     return false;
     290             : }
     291             : 
     292             : // --------------------------------------------------------------------
     293             : 
     294           0 : bool ImageButtonHdl::isMarkable() const
     295             : {
     296           0 :     return false;
     297             : }
     298             : 
     299             : // --------------------------------------------------------------------
     300             : 
     301           0 : Pointer ImageButtonHdl::GetPointer() const
     302             : {
     303           0 :     return Pointer( POINTER_ARROW );
     304             : }
     305             : 
     306             : // ====================================================================
     307             : 
     308           0 : ChangePlaceholderTag::ChangePlaceholderTag( ::sd::View& rView, SdrObject& rPlaceholderObj )
     309             : : SmartTag( rView )
     310           0 : , mxPlaceholderObj( &rPlaceholderObj )
     311             : {
     312           0 : }
     313             : 
     314             : // --------------------------------------------------------------------
     315             : 
     316           0 : ChangePlaceholderTag::~ChangePlaceholderTag()
     317             : {
     318           0 : }
     319             : 
     320             : // --------------------------------------------------------------------
     321             : 
     322             : /** returns true if the ChangePlaceholderTag handled the event. */
     323           0 : bool ChangePlaceholderTag::MouseButtonDown( const MouseEvent& /*rMEvt*/, SmartHdl& rHdl )
     324             : {
     325           0 :     int nHighlightId = static_cast< ImageButtonHdl& >(rHdl).getHighlightId();
     326           0 :     if( nHighlightId >= 0 )
     327             :     {
     328           0 :         sal_uInt16 nSID = gButtonSlots[nHighlightId];
     329             : 
     330           0 :         if( mxPlaceholderObj.get() )
     331             :         {
     332             :             // mark placeholder if it is not currently marked (or if also others are marked)
     333           0 :             if( !mrView.IsObjMarked( mxPlaceholderObj.get() ) || (mrView.GetMarkedObjectList().GetMarkCount() != 1) )
     334             :             {
     335           0 :                 SdrPageView* pPV = mrView.GetSdrPageView();
     336           0 :                 mrView.UnmarkAllObj(pPV );
     337           0 :                 mrView.MarkObj(mxPlaceholderObj.get(), pPV, sal_False);
     338             :             }
     339             :         }
     340             : 
     341           0 :         mrView.GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( nSID, SFX_CALLMODE_ASYNCHRON);
     342             :     }
     343           0 :     return false;
     344             : }
     345             : 
     346             : // --------------------------------------------------------------------
     347             : 
     348             : /** returns true if the SmartTag consumes this event. */
     349           0 : bool ChangePlaceholderTag::KeyInput( const KeyEvent& rKEvt )
     350             : {
     351           0 :     sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
     352           0 :     switch( nCode )
     353             :     {
     354             :     case KEY_DOWN:
     355             :     case KEY_UP:
     356             :     case KEY_LEFT:
     357             :     case KEY_RIGHT:
     358             :     case KEY_ESCAPE:
     359             :     case KEY_TAB:
     360             :     case KEY_RETURN:
     361             :        case KEY_SPACE:
     362             :     default:
     363           0 :         return false;
     364             :     }
     365             : }
     366             : 
     367             : // --------------------------------------------------------------------
     368             : 
     369           0 : BitmapEx ChangePlaceholderTag::createOverlayImage( int nHighlight )
     370             : {
     371           0 :     BitmapEx aRet;
     372           0 :     if( mxPlaceholderObj.is() )
     373             :     {
     374           0 :         SdrObject* pPlaceholder = mxPlaceholderObj.get();
     375           0 :         SmartTagReference xThis( this );
     376           0 :         const Rectangle& rSnapRect = pPlaceholder->GetSnapRect();
     377           0 :         const Point aPoint;
     378             : 
     379           0 :         OutputDevice* pDev = mrView.GetFirstOutputDevice();
     380           0 :         if( pDev == 0 )
     381           0 :             pDev = Application::GetDefaultDevice();
     382             : 
     383           0 :         Size aShapeSizePix = pDev->LogicToPixel(rSnapRect.GetSize());
     384           0 :         long nShapeSizePix = std::min(aShapeSizePix.Width(),aShapeSizePix.Height());
     385             : 
     386           0 :         bool bLarge = nShapeSizePix > 250;
     387             : 
     388           0 :         Size aSize( getButtonImage( 0, bLarge )->GetSizePixel() );
     389             : 
     390           0 :         aRet.SetSizePixel( Size( aSize.Width() << 1, aSize.Height() << 1 ) );
     391             : 
     392           0 :         const Rectangle aRectSrc( Point( 0, 0 ), aSize );
     393             : 
     394           0 :         aRet = *(getButtonImage((nHighlight == 0) ? 4 : 0, bLarge));
     395           0 :         aRet.Expand( aSize.Width(), aSize.Height(), NULL, sal_True );
     396             : 
     397           0 :         aRet.CopyPixel( Rectangle( Point( aSize.Width(), 0              ), aSize ), aRectSrc, getButtonImage((nHighlight == 1) ? 5 : 1, bLarge) );
     398           0 :         aRet.CopyPixel( Rectangle( Point( 0,             aSize.Height() ), aSize ), aRectSrc, getButtonImage((nHighlight == 2) ? 6 : 2, bLarge) );
     399           0 :         aRet.CopyPixel( Rectangle( Point( aSize.Width(), aSize.Height() ), aSize ), aRectSrc, getButtonImage((nHighlight == 3) ? 7 : 3, bLarge) );
     400             :     }
     401             : 
     402           0 :     return aRet;
     403             : }
     404             : 
     405           0 : void ChangePlaceholderTag::addCustomHandles( SdrHdlList& rHandlerList )
     406             : {
     407           0 :     if( mxPlaceholderObj.is() )
     408             :     {
     409           0 :         SdrObject* pPlaceholder = mxPlaceholderObj.get();
     410           0 :         SmartTagReference xThis( this );
     411           0 :         const Rectangle& rSnapRect = pPlaceholder->GetSnapRect();
     412           0 :         const Point aPoint;
     413             : 
     414           0 :         OutputDevice* pDev = mrView.GetFirstOutputDevice();
     415           0 :         if( pDev == 0 )
     416           0 :             pDev = Application::GetDefaultDevice();
     417             : 
     418           0 :         Size aShapeSizePix = pDev->LogicToPixel(rSnapRect.GetSize());
     419           0 :         long nShapeSizePix = std::min(aShapeSizePix.Width(),aShapeSizePix.Height());
     420           0 :         if( 50 > nShapeSizePix )
     421           0 :             return;
     422             : 
     423           0 :         bool bLarge = nShapeSizePix > 250;
     424             : 
     425           0 :         Size aButtonSize( pDev->PixelToLogic( getButtonImage(0, bLarge )->GetSizePixel()) );
     426             : 
     427           0 :         const int nColumns = 2;
     428           0 :         const int nRows = 2;
     429             : 
     430           0 :         long all_width = nColumns * aButtonSize.Width();
     431           0 :         long all_height = nRows * aButtonSize.Height();
     432             : 
     433           0 :         Point aPos( rSnapRect.Center() );
     434           0 :         aPos.X() -= all_width >> 1;
     435           0 :         aPos.Y() -= all_height >> 1;
     436             : 
     437           0 :         ImageButtonHdl* pHdl = new ImageButtonHdl( xThis, aPoint );
     438           0 :         pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM );
     439           0 :         pHdl->SetPageView( mrView.GetSdrPageView() );
     440             : 
     441           0 :         pHdl->SetPos( aPos );
     442             : 
     443           0 :         rHandlerList.AddHdl( pHdl );
     444             :     }
     445             : }
     446             : 
     447             : // --------------------------------------------------------------------
     448             : 
     449           0 : void ChangePlaceholderTag::disposing()
     450             : {
     451           0 :     SmartTag::disposing();
     452           0 : }
     453             : 
     454             : // --------------------------------------------------------------------
     455             : 
     456           0 : void ChangePlaceholderTag::select()
     457             : {
     458           0 :     SmartTag::select();
     459           0 : }
     460             : 
     461             : // --------------------------------------------------------------------
     462             : 
     463           0 : void ChangePlaceholderTag::deselect()
     464             : {
     465           0 :     SmartTag::deselect();
     466           0 : }
     467             : 
     468             : // --------------------------------------------------------------------
     469             : 
     470           0 : ViewOverlayManager::ViewOverlayManager( ViewShellBase& rViewShellBase )
     471             : : mrBase( rViewShellBase )
     472           0 : , mnUpdateTagsEvent( 0 )
     473             : {
     474           0 :     Link aLink( LINK(this,ViewOverlayManager,EventMultiplexerListener) );
     475             :     mrBase.GetEventMultiplexer()->AddEventListener(aLink, tools::EventMultiplexerEvent::EID_CURRENT_PAGE
     476             :         | tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED
     477             :         | tools::EventMultiplexerEvent::EID_VIEW_ADDED
     478             :         | tools::EventMultiplexerEvent::EID_BEGIN_TEXT_EDIT
     479           0 :         | tools::EventMultiplexerEvent::EID_END_TEXT_EDIT );
     480             : 
     481           0 :     StartListening( *mrBase.GetDocShell() );
     482           0 : }
     483             : 
     484             : // --------------------------------------------------------------------
     485             : 
     486           0 : ViewOverlayManager::~ViewOverlayManager()
     487             : {
     488           0 :     Link aLink( LINK(this,ViewOverlayManager,EventMultiplexerListener) );
     489           0 :     mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
     490             : 
     491           0 :     if( mnUpdateTagsEvent )
     492             :     {
     493           0 :         Application::RemoveUserEvent( mnUpdateTagsEvent );
     494           0 :         mnUpdateTagsEvent = 0;
     495             :     }
     496             : 
     497           0 :     DisposeTags();
     498           0 : }
     499             : 
     500             : // --------------------------------------------------------------------
     501             : 
     502           0 : void ViewOverlayManager::Notify(SfxBroadcaster&, const SfxHint& rHint)
     503             : {
     504           0 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
     505           0 :     if (pSimpleHint != NULL)
     506             :     {
     507           0 :         if (pSimpleHint->GetId() == SFX_HINT_DOCCHANGED)
     508             :         {
     509           0 :             UpdateTags();
     510             :         }
     511             :     }
     512           0 : }
     513             : 
     514           0 : void ViewOverlayManager::onZoomChanged()
     515             : {
     516           0 :     if( !maTagVector.empty() )
     517             :     {
     518           0 :         UpdateTags();
     519             :     }
     520           0 : }
     521             : 
     522           0 : void ViewOverlayManager::UpdateTags()
     523             : {
     524           0 :     if( !mnUpdateTagsEvent )
     525           0 :         mnUpdateTagsEvent = Application::PostUserEvent( LINK( this, ViewOverlayManager, UpdateTagsHdl ) );
     526           0 : }
     527             : 
     528           0 : IMPL_LINK_NOARG(ViewOverlayManager, UpdateTagsHdl)
     529             : {
     530             :     OSL_TRACE("ViewOverlayManager::UpdateTagsHdl");
     531             : 
     532           0 :     mnUpdateTagsEvent  = 0;
     533           0 :     bool bChanges = DisposeTags();
     534           0 :     bChanges |= CreateTags();
     535             : 
     536           0 :     if( bChanges && mrBase.GetDrawView() )
     537           0 :         static_cast< ::sd::View* >( mrBase.GetDrawView() )->updateHandles();
     538           0 :     return 0;
     539             : }
     540             : 
     541           0 : bool ViewOverlayManager::CreateTags()
     542             : {
     543           0 :     bool bChanges = false;
     544             : 
     545           0 :     ::boost::shared_ptr<ViewShell> aMainShell = mrBase.GetMainViewShell();
     546             : 
     547           0 :     SdPage* pPage = aMainShell.get() ? aMainShell->getCurrentPage() : NULL;
     548             : 
     549           0 :     if( pPage && !pPage->IsMasterPage() && (pPage->GetPageKind() == PK_STANDARD) )
     550             :     {
     551           0 :         const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList();
     552             : 
     553           0 :         for( std::list< SdrObject* >::const_iterator iter( rShapes.begin() ); iter != rShapes.end(); ++iter )
     554             :         {
     555           0 :             if( (*iter)->IsEmptyPresObj() && ((*iter)->GetObjIdentifier() == OBJ_OUTLINETEXT) && (mrBase.GetDrawView()->GetTextEditObject() != (*iter)) )
     556             :             {
     557           0 :                 rtl::Reference< SmartTag > xTag( new ChangePlaceholderTag( *mrBase.GetMainViewShell()->GetView(), *(*iter) ) );
     558           0 :                 maTagVector.push_back(xTag);
     559           0 :                 bChanges = true;
     560             :             }
     561             :         }
     562             :     }
     563             : 
     564           0 :     return bChanges;
     565             : }
     566             : 
     567             : // --------------------------------------------------------------------
     568             : 
     569           0 : bool ViewOverlayManager::DisposeTags()
     570             : {
     571           0 :     if( !maTagVector.empty() )
     572             :     {
     573           0 :         ViewTagVector vec;
     574           0 :         vec.swap( maTagVector );
     575             : 
     576           0 :         ViewTagVector::iterator iter = vec.begin();
     577           0 :         do
     578             :         {
     579           0 :             (*iter++)->Dispose();
     580             :         }
     581           0 :         while( iter != vec.end() );
     582           0 :         return true;
     583             :     }
     584             : 
     585           0 :     return false;
     586             : }
     587             : 
     588             : // --------------------------------------------------------------------
     589             : 
     590           0 : IMPL_LINK(ViewOverlayManager,EventMultiplexerListener,
     591             :     tools::EventMultiplexerEvent*,pEvent)
     592             : {
     593           0 :     switch (pEvent->meEventId)
     594             :     {
     595             :         case tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED:
     596             :         case tools::EventMultiplexerEvent::EID_VIEW_ADDED:
     597             :         case tools::EventMultiplexerEvent::EID_BEGIN_TEXT_EDIT:
     598             :         case tools::EventMultiplexerEvent::EID_END_TEXT_EDIT:
     599             :         case tools::EventMultiplexerEvent::EID_CURRENT_PAGE:
     600           0 :             UpdateTags();
     601           0 :             break;
     602             :     }
     603           0 :     return 0;
     604             : }
     605             : 
     606             : }
     607             : 
     608             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10