LCOV - code coverage report
Current view: top level - sd/source/ui/annotations - annotationmanager.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 104 565 18.4 %
Date: 2015-06-13 12:38:46 Functions: 19 50 38.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 "sddll.hxx"
      21             : 
      22             : #include <com/sun/star/beans/XMultiPropertyStates.hpp>
      23             : #include <com/sun/star/frame/XController.hpp>
      24             : #include <com/sun/star/frame/XModel.hpp>
      25             : #include <com/sun/star/view/XSelectionSupplier.hpp>
      26             : #include <com/sun/star/geometry/RealPoint2D.hpp>
      27             : #include <com/sun/star/text/XText.hpp>
      28             : #include <com/sun/star/document/XEventBroadcaster.hpp>
      29             : #include <comphelper/string.hxx>
      30             : #include <svx/svxids.hrc>
      31             : 
      32             : #include <vcl/settings.hxx>
      33             : #include <vcl/menu.hxx>
      34             : #include <vcl/msgbox.hxx>
      35             : 
      36             : #include <sal/macros.h>
      37             : #include <svl/style.hxx>
      38             : #include <svl/itempool.hxx>
      39             : #include <unotools/useroptions.hxx>
      40             : #include <unotools/syslocale.hxx>
      41             : #include <unotools/saveopt.hxx>
      42             : 
      43             : #include <tools/datetime.hxx>
      44             : 
      45             : #include <sfx2/imagemgr.hxx>
      46             : #include <sfx2/viewfrm.hxx>
      47             : #include <sfx2/bindings.hxx>
      48             : #include <sfx2/app.hxx>
      49             : #include <sfx2/request.hxx>
      50             : #include <sfx2/dispatch.hxx>
      51             : #include <sfx2/objface.hxx>
      52             : 
      53             : #include <editeng/editeng.hxx>
      54             : #include <editeng/eeitem.hxx>
      55             : #include <editeng/fontitem.hxx>
      56             : #include <editeng/fhgtitem.hxx>
      57             : #include <editeng/outlobj.hxx>
      58             : #include <editeng/postitem.hxx>
      59             : #include <editeng/wghtitem.hxx>
      60             : #include <editeng/udlnitem.hxx>
      61             : #include <editeng/crossedoutitem.hxx>
      62             : 
      63             : #include <svx/svdetc.hxx>
      64             : 
      65             : #include "annotationmanager.hxx"
      66             : #include "annotationmanagerimpl.hxx"
      67             : #include "annotationwindow.hxx"
      68             : #include "annotations.hrc"
      69             : 
      70             : #include "ToolBarManager.hxx"
      71             : #include "DrawDocShell.hxx"
      72             : #include "DrawViewShell.hxx"
      73             : #include "DrawController.hxx"
      74             : #include "glob.hrc"
      75             : #include "sdresid.hxx"
      76             : #include "EventMultiplexer.hxx"
      77             : #include "ViewShellManager.hxx"
      78             : #include "helpids.h"
      79             : #include "sdpage.hxx"
      80             : #include "drawdoc.hxx"
      81             : #include "textapi.hxx"
      82             : #include "optsitem.hxx"
      83             : 
      84             : #include <boost/scoped_ptr.hpp>
      85             : 
      86             : using namespace ::com::sun::star;
      87             : using namespace ::com::sun::star::uno;
      88             : using namespace ::com::sun::star::drawing;
      89             : using namespace ::com::sun::star::document;
      90             : using namespace ::com::sun::star::geometry;
      91             : using namespace ::com::sun::star::container;
      92             : using namespace ::com::sun::star::beans;
      93             : using namespace ::com::sun::star::text;
      94             : using namespace ::com::sun::star::view;
      95             : using namespace ::com::sun::star::style;
      96             : using namespace ::com::sun::star::frame;
      97             : using namespace ::com::sun::star::lang;
      98             : using namespace ::com::sun::star::ui;
      99             : using namespace ::com::sun::star::task;
     100             : using namespace ::com::sun::star::office;
     101             : 
     102             : namespace sd {
     103             : 
     104           0 : SfxItemPool* GetAnnotationPool()
     105             : {
     106             :     static SfxItemPool* mpAnnotationPool = 0;
     107           0 :     if( mpAnnotationPool == 0 )
     108             :     {
     109           0 :         mpAnnotationPool = EditEngine::CreatePool( false );
     110           0 :         mpAnnotationPool->SetPoolDefaultItem(SvxFontHeightItem(423,100,EE_CHAR_FONTHEIGHT));
     111             : 
     112           0 :         vcl::Font aAppFont( Application::GetSettings().GetStyleSettings().GetAppFont() );
     113           0 :         mpAnnotationPool->SetPoolDefaultItem(SvxFontItem(aAppFont.GetFamily(),aAppFont.GetName(),"",PITCH_DONTKNOW,RTL_TEXTENCODING_DONTKNOW,EE_CHAR_FONTINFO));
     114             :     }
     115             : 
     116           0 :     return mpAnnotationPool;
     117             : }
     118             : 
     119         169 : static SfxBindings* getBindings( ViewShellBase& rBase )
     120             : {
     121         169 :     if( rBase.GetMainViewShell().get() && rBase.GetMainViewShell()->GetViewFrame() )
     122         169 :         return &rBase.GetMainViewShell()->GetViewFrame()->GetBindings();
     123             : 
     124           0 :     return 0;
     125             : }
     126             : 
     127           0 : static SfxDispatcher* getDispatcher( ViewShellBase& rBase )
     128             : {
     129           0 :     if( rBase.GetMainViewShell().get() && rBase.GetMainViewShell()->GetViewFrame() )
     130           0 :         return rBase.GetMainViewShell()->GetViewFrame()->GetDispatcher();
     131             : 
     132           0 :     return 0;
     133             : }
     134             : 
     135           0 : com::sun::star::util::DateTime getCurrentDateTime()
     136             : {
     137           0 :     DateTime aCurrentDate( DateTime::SYSTEM );
     138           0 :     return com::sun::star::util::DateTime( 0, aCurrentDate.GetSec(),
     139           0 :             aCurrentDate.GetMin(), aCurrentDate.GetHour(),
     140           0 :             aCurrentDate.GetDay(), aCurrentDate.GetMonth(),
     141           0 :             aCurrentDate.GetYear(), false );
     142             : }
     143             : 
     144           0 : OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation )
     145             : {
     146           0 :     OUString sRet;
     147           0 :     if( xAnnotation.is() )
     148             :     {
     149           0 :         const SvtSysLocale aSysLocale;
     150           0 :         const LocaleDataWrapper& rLocalData = aSysLocale.GetLocaleData();
     151             : 
     152           0 :         com::sun::star::util::DateTime aDateTime( xAnnotation->getDateTime() );
     153             : 
     154           0 :         Date aSysDate( Date::SYSTEM );
     155           0 :         Date aDate = Date( aDateTime.Day, aDateTime.Month, aDateTime.Year );
     156           0 :         if (aDate==aSysDate)
     157           0 :             sRet = SdResId(STR_ANNOTATION_TODAY);
     158           0 :         else if (aDate == Date(aSysDate-1))
     159           0 :             sRet = SdResId(STR_ANNOTATION_YESTERDAY);
     160           0 :         else if (aDate.IsValidAndGregorian() )
     161           0 :             sRet = rLocalData.getDate(aDate);
     162             : 
     163           0 :         ::tools::Time aTime( aDateTime );
     164           0 :         if(aTime.GetTime() != 0)
     165           0 :             sRet = sRet + " "  + rLocalData.getTime( aTime,false );
     166             :     }
     167           0 :     return sRet;
     168             : }
     169             : 
     170         133 : AnnotationManagerImpl::AnnotationManagerImpl( ViewShellBase& rViewShellBase )
     171             : : AnnotationManagerImplBase( m_aMutex )
     172             : , mrBase( rViewShellBase )
     173         133 : , mpDoc( rViewShellBase.GetDocument() )
     174             : , mbShowAnnotations( true )
     175         266 : , mnUpdateTagsEvent( 0 )
     176             : {
     177         133 :     SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType());
     178         133 :     if( pOptions )
     179         133 :         mbShowAnnotations = pOptions->IsShowComments();
     180         133 : }
     181             : 
     182         133 : void AnnotationManagerImpl::init()
     183             : {
     184             :     // get current controller and initialize listeners
     185             :     try
     186             :     {
     187         133 :         addListener();
     188         133 :         mxView = Reference< XDrawView >::query(mrBase.GetController());
     189             :     }
     190           0 :     catch( Exception& )
     191             :     {
     192             :         OSL_FAIL( "sd::AnnotationManagerImpl::AnnotationManagerImpl(), Exception caught!" );
     193             :     }
     194             : 
     195             :     try
     196             :     {
     197         133 :         Reference<XEventBroadcaster> xModel (mrBase.GetDocShell()->GetModel(), UNO_QUERY_THROW );
     198         266 :         Reference<XEventListener> xListener( this );
     199         266 :         xModel->addEventListener( xListener );
     200             :     }
     201           0 :     catch( Exception& )
     202             :     {
     203             :     }
     204         133 : }
     205             : 
     206             : // WeakComponentImplHelper1
     207         133 : void SAL_CALL AnnotationManagerImpl::disposing ()
     208             : {
     209             :     try
     210             :     {
     211         133 :         Reference<XEventBroadcaster> xModel (mrBase.GetDocShell()->GetModel(), UNO_QUERY_THROW );
     212         266 :         Reference<XEventListener> xListener( this );
     213         266 :         xModel->removeEventListener( xListener );
     214             :     }
     215           0 :     catch( Exception& )
     216             :     {
     217             :     }
     218             : 
     219         133 :     removeListener();
     220         133 :     DisposeTags();
     221             : 
     222         133 :     if( mnUpdateTagsEvent )
     223             :     {
     224           0 :         Application::RemoveUserEvent( mnUpdateTagsEvent );
     225           0 :         mnUpdateTagsEvent = 0;
     226             :     }
     227             : 
     228         133 :     mxView.clear();
     229         133 :     mxCurrentPage.clear();
     230         133 : }
     231             : 
     232             : // XEventListener
     233        5258 : void SAL_CALL AnnotationManagerImpl::notifyEvent( const ::com::sun::star::document::EventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException, std::exception)
     234             : {
     235        5258 :     if( aEvent.EventName == "OnAnnotationInserted" || aEvent.EventName == "OnAnnotationRemoved" || aEvent.EventName == "OnAnnotationChanged" )
     236             :     {
     237           0 :         UpdateTags();
     238             :     }
     239        5258 : }
     240             : 
     241           0 : void SAL_CALL AnnotationManagerImpl::disposing( const ::com::sun::star::lang::EventObject& /*Source*/ ) throw (::com::sun::star::uno::RuntimeException, std::exception)
     242             : {
     243           0 : }
     244             : 
     245           0 : void AnnotationManagerImpl::ShowAnnotations( bool bShow )
     246             : {
     247             :     // enforce show annotations if a new annotation is inserted
     248           0 :     if( mbShowAnnotations != bShow )
     249             :     {
     250           0 :         mbShowAnnotations = bShow;
     251             : 
     252           0 :         SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType());
     253           0 :         if( pOptions )
     254           0 :             pOptions->SetShowComments( mbShowAnnotations );
     255             : 
     256           0 :         UpdateTags();
     257             :     }
     258           0 : }
     259             : 
     260           0 : void AnnotationManagerImpl::ExecuteAnnotation(SfxRequest& rReq )
     261             : {
     262           0 :     switch( rReq.GetSlot() )
     263             :     {
     264             :     case SID_INSERT_POSTIT:
     265           0 :         ExecuteInsertAnnotation( rReq );
     266           0 :         break;
     267             :     case SID_DELETE_POSTIT:
     268             :     case SID_DELETEALL_POSTIT:
     269             :     case SID_DELETEALLBYAUTHOR_POSTIT:
     270           0 :         ExecuteDeleteAnnotation( rReq );
     271           0 :         break;
     272             :     case SID_PREVIOUS_POSTIT:
     273             :     case SID_NEXT_POSTIT:
     274           0 :         SelectNextAnnotation( rReq.GetSlot() == SID_NEXT_POSTIT );
     275           0 :         break;
     276             :     case SID_REPLYTO_POSTIT:
     277           0 :         ExecuteReplyToAnnotation( rReq );
     278           0 :         break;
     279             :     case SID_SHOW_POSTIT:
     280           0 :         ShowAnnotations( !mbShowAnnotations );
     281           0 :         break;
     282             :     }
     283           0 : }
     284             : 
     285           0 : void AnnotationManagerImpl::ExecuteInsertAnnotation(SfxRequest& /*rReq*/)
     286             : {
     287           0 :     ShowAnnotations(true);
     288           0 :     InsertAnnotation();
     289           0 : }
     290             : 
     291           0 : void AnnotationManagerImpl::ExecuteDeleteAnnotation(SfxRequest& rReq)
     292             : {
     293           0 :     ShowAnnotations( true );
     294             : 
     295           0 :     const SfxItemSet* pArgs = rReq.GetArgs();
     296             : 
     297           0 :     switch( rReq.GetSlot() )
     298             :     {
     299             :     case SID_DELETEALL_POSTIT:
     300           0 :         DeleteAllAnnotations();
     301           0 :         break;
     302             :     case SID_DELETEALLBYAUTHOR_POSTIT:
     303           0 :         if( pArgs )
     304             :         {
     305           0 :             const SfxPoolItem*  pPoolItem = NULL;
     306           0 :             if( SfxItemState::SET == pArgs->GetItemState( SID_DELETEALLBYAUTHOR_POSTIT, true, &pPoolItem ) )
     307             :             {
     308           0 :                 OUString sAuthor( static_cast<const SfxStringItem*>( pPoolItem )->GetValue() );
     309           0 :                 DeleteAnnotationsByAuthor( sAuthor );
     310             :             }
     311             :         }
     312           0 :         break;
     313             :     case SID_DELETE_POSTIT:
     314             :         {
     315           0 :             Reference< XAnnotation > xAnnotation;
     316             : 
     317           0 :             if( rReq.GetSlot() == SID_DELETE_POSTIT )
     318             :             {
     319           0 :                 if( pArgs )
     320             :                 {
     321           0 :                     const SfxPoolItem*  pPoolItem = NULL;
     322           0 :                     if( SfxItemState::SET == pArgs->GetItemState( SID_DELETE_POSTIT, true, &pPoolItem ) )
     323           0 :                         static_cast<const SfxUnoAnyItem*>(pPoolItem)->GetValue() >>= xAnnotation;
     324             :                 }
     325             :             }
     326             : 
     327           0 :             if( !xAnnotation.is() )
     328           0 :                 GetSelectedAnnotation( xAnnotation );
     329             : 
     330           0 :             DeleteAnnotation( xAnnotation );
     331             :         }
     332           0 :         break;
     333             :     }
     334             : 
     335           0 :     UpdateTags();
     336           0 : }
     337             : 
     338           0 : void AnnotationManagerImpl::InsertAnnotation()
     339             : {
     340           0 :     SdPage* pPage = GetCurrentPage();
     341           0 :     if( pPage )
     342             :     {
     343           0 :         if( mpDoc->IsUndoEnabled() )
     344           0 :             mpDoc->BegUndo( SD_RESSTR( STR_ANNOTATION_UNDO_INSERT ) );
     345             : 
     346             :         // find free space for new annotation
     347           0 :         int y = 0, x = 0;
     348             : 
     349           0 :         AnnotationVector aAnnotations( pPage->getAnnotations() );
     350           0 :         if( !aAnnotations.empty() )
     351             :         {
     352           0 :             const int page_width = pPage->GetSize().Width();
     353           0 :             const int width = 1000;
     354           0 :             const int height = 800;
     355           0 :             Rectangle aTagRect;
     356             : 
     357             :             while( true )
     358             :             {
     359           0 :                 Rectangle aNewRect( x, y, x + width - 1, y + height - 1 );
     360           0 :                 bool bFree = true;
     361             : 
     362           0 :                 for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
     363             :                 {
     364           0 :                     RealPoint2D aPoint( (*iter)->getPosition() );
     365           0 :                     aTagRect.Left()   = sal::static_int_cast< long >( aPoint.X * 100.0 );
     366           0 :                     aTagRect.Top()    = sal::static_int_cast< long >( aPoint.Y * 100.0 );
     367           0 :                     aTagRect.Right()  = aTagRect.Left() + width - 1;
     368           0 :                     aTagRect.Bottom() = aTagRect.Top() + height - 1;
     369             : 
     370           0 :                     if( aNewRect.IsOver( aTagRect ) )
     371             :                     {
     372           0 :                         bFree = false;
     373           0 :                         break;
     374             :                     }
     375             :                 }
     376             : 
     377           0 :                 if( !bFree )
     378             :                 {
     379           0 :                     x += width;
     380           0 :                     if( x > page_width )
     381             :                     {
     382           0 :                         x = 0;
     383           0 :                         y += height;
     384             :                     }
     385             :                 }
     386             :                 else
     387             :                 {
     388           0 :                     break;
     389             :                 }
     390           0 :             }
     391             :         }
     392             : 
     393           0 :         Reference< XAnnotation > xAnnotation;
     394           0 :         pPage->createAnnotation( xAnnotation );
     395             : 
     396             :         // set current author to new annotation
     397           0 :         SvtUserOptions aUserOptions;
     398           0 :         xAnnotation->setAuthor( aUserOptions.GetFullName() );
     399             : 
     400             :         // set current time to new annotation
     401           0 :         xAnnotation->setDateTime( getCurrentDateTime() );
     402             : 
     403             :         // set position
     404           0 :         RealPoint2D aPos( ((double)x) / 100.0, ((double)y) / 100.0 );
     405           0 :         xAnnotation->setPosition( aPos );
     406             : 
     407           0 :         if( mpDoc->IsUndoEnabled() )
     408           0 :             mpDoc->EndUndo();
     409             : 
     410           0 :         UpdateTags(true);
     411           0 :         SelectAnnotation( xAnnotation, true );
     412             :     }
     413           0 : }
     414             : 
     415           0 : void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest& rReq )
     416             : {
     417           0 :     Reference< XAnnotation > xAnnotation;
     418           0 :     const SfxItemSet* pArgs = rReq.GetArgs();
     419           0 :     if( pArgs )
     420             :     {
     421           0 :         const SfxPoolItem*  pPoolItem = NULL;
     422           0 :         if( SfxItemState::SET == pArgs->GetItemState( rReq.GetSlot(), true, &pPoolItem ) )
     423           0 :             static_cast<const SfxUnoAnyItem*>( pPoolItem )->GetValue() >>= xAnnotation;
     424             :     }
     425             : 
     426           0 :     TextApiObject* pTextApi = getTextApiObject( xAnnotation );
     427           0 :     if( pTextApi )
     428             :     {
     429           0 :         boost::scoped_ptr< ::Outliner > pOutliner( new ::Outliner(GetAnnotationPool(),OUTLINERMODE_TEXTOBJECT) );
     430             : 
     431           0 :         mpDoc->SetCalcFieldValueHdl( pOutliner.get() );
     432           0 :         pOutliner->SetUpdateMode( true );
     433             : 
     434           0 :         OUString aStr(SD_RESSTR(STR_ANNOTATION_REPLY));
     435           0 :         OUString sAuthor( xAnnotation->getAuthor() );
     436           0 :         if( sAuthor.isEmpty() )
     437           0 :             sAuthor = SD_RESSTR( STR_ANNOTATION_NOAUTHOR );
     438             : 
     439           0 :         aStr = aStr.replaceFirst("%1", sAuthor);
     440             : 
     441           0 :         aStr += " (" + getAnnotationDateTimeString( xAnnotation ) + "): \"";
     442             : 
     443           0 :         OUString sQuote( pTextApi->GetText() );
     444             : 
     445           0 :         if( sQuote.isEmpty() )
     446           0 :             sQuote = "...";
     447           0 :         aStr += sQuote + "\"\n";
     448             : 
     449           0 :         sal_Int32 nParaCount = comphelper::string::getTokenCount(aStr, '\n');
     450           0 :         for( sal_Int32 nPara = 0; nPara < nParaCount; nPara++ )
     451           0 :             pOutliner->Insert( aStr.getToken( nPara, '\n' ), EE_PARA_APPEND, -1 );
     452             : 
     453           0 :         if( pOutliner->GetParagraphCount() > 1 )
     454             :         {
     455           0 :             SfxItemSet aAnswerSet( pOutliner->GetEmptyItemSet() );
     456           0 :             aAnswerSet.Put(SvxPostureItem(ITALIC_NORMAL,EE_CHAR_ITALIC));
     457             : 
     458           0 :             ESelection aSel;
     459           0 :             aSel.nEndPara = pOutliner->GetParagraphCount()-2;
     460           0 :             aSel.nEndPos = pOutliner->GetText( pOutliner->GetParagraph( aSel.nEndPara ) ).getLength();
     461             : 
     462           0 :             pOutliner->QuickSetAttribs( aAnswerSet, aSel );
     463             :         }
     464             : 
     465           0 :         boost::scoped_ptr< OutlinerParaObject > pOPO( pOutliner->CreateParaObject() );
     466           0 :         pTextApi->SetText( *pOPO.get() );
     467             : 
     468           0 :         SvtUserOptions aUserOptions;
     469           0 :         xAnnotation->setAuthor( aUserOptions.GetFullName() );
     470             : 
     471             :         // set current time to reply
     472           0 :         xAnnotation->setDateTime( getCurrentDateTime() );
     473             : 
     474           0 :         UpdateTags(true);
     475           0 :         SelectAnnotation( xAnnotation, true );
     476           0 :     }
     477           0 : }
     478             : 
     479           0 : void AnnotationManagerImpl::DeleteAnnotation( Reference< XAnnotation > xAnnotation )
     480             : {
     481           0 :     SdPage* pPage = GetCurrentPage();
     482             : 
     483           0 :     if( xAnnotation.is() && pPage )
     484             :     {
     485           0 :         if( mpDoc->IsUndoEnabled() )
     486           0 :             mpDoc->BegUndo( SD_RESSTR( STR_ANNOTATION_UNDO_DELETE ) );
     487             : 
     488           0 :         pPage->removeAnnotation( xAnnotation );
     489             : 
     490           0 :         if( mpDoc->IsUndoEnabled() )
     491           0 :             mpDoc->EndUndo();
     492             : 
     493           0 :         UpdateTags();
     494             :     }
     495           0 : }
     496             : 
     497           0 : void AnnotationManagerImpl::DeleteAnnotationsByAuthor( const OUString& sAuthor )
     498             : {
     499           0 :     if( mpDoc->IsUndoEnabled() )
     500           0 :         mpDoc->BegUndo( SD_RESSTR( STR_ANNOTATION_UNDO_DELETE ) );
     501             : 
     502           0 :     SdPage* pPage = 0;
     503           0 :     do
     504             :     {
     505           0 :         pPage = GetNextPage( pPage, true );
     506             : 
     507           0 :         if( pPage && !pPage->getAnnotations().empty() )
     508             :         {
     509           0 :             AnnotationVector aAnnotations( pPage->getAnnotations() );
     510           0 :             for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
     511             :             {
     512           0 :                 Reference< XAnnotation > xAnnotation( *iter );
     513           0 :                 if( xAnnotation->getAuthor() == sAuthor )
     514             :                 {
     515           0 :                     if( mxSelectedAnnotation == xAnnotation )
     516           0 :                         mxSelectedAnnotation.clear();
     517           0 :                     pPage->removeAnnotation( xAnnotation );
     518             :                 }
     519           0 :             }
     520             :         }
     521             :     } while( pPage );
     522             : 
     523           0 :     if( mpDoc->IsUndoEnabled() )
     524           0 :         mpDoc->EndUndo();
     525           0 : }
     526             : 
     527           0 : void AnnotationManagerImpl::DeleteAllAnnotations()
     528             : {
     529           0 :     if( mpDoc->IsUndoEnabled() )
     530           0 :         mpDoc->BegUndo( SD_RESSTR( STR_ANNOTATION_UNDO_DELETE ) );
     531             : 
     532           0 :     SdPage* pPage = 0;
     533           0 :     do
     534             :     {
     535           0 :         pPage = GetNextPage( pPage, true );
     536             : 
     537           0 :         if( pPage && !pPage->getAnnotations().empty() )
     538             :         {
     539             : 
     540           0 :             AnnotationVector aAnnotations( pPage->getAnnotations() );
     541           0 :             for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
     542             :             {
     543           0 :                 pPage->removeAnnotation( (*iter) );
     544           0 :             }
     545             :         }
     546             :     }
     547             :     while( pPage );
     548             : 
     549           0 :     mxSelectedAnnotation.clear();
     550             : 
     551           0 :     if( mpDoc->IsUndoEnabled() )
     552           0 :         mpDoc->EndUndo();
     553           0 : }
     554             : 
     555           0 : void AnnotationManagerImpl::GetAnnotationState(SfxItemSet& rSet)
     556             : {
     557           0 :     SdPage* pCurrentPage = GetCurrentPage();
     558             : 
     559           0 :     const bool bReadOnly = mrBase.GetDocShell()->IsReadOnly();
     560           0 :     const bool bWrongPageKind = (pCurrentPage == 0) || (pCurrentPage->GetPageKind() != PK_STANDARD);
     561             : 
     562           0 :     const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
     563             : 
     564           0 :     if( bReadOnly || bWrongPageKind || (nCurrentODFVersion <= SvtSaveOptions::ODFVER_012) )
     565           0 :         rSet.DisableItem( SID_INSERT_POSTIT );
     566             : 
     567           0 :     rSet.Put(SfxBoolItem(SID_SHOW_POSTIT, mbShowAnnotations));
     568             : 
     569           0 :     Reference< XAnnotation > xAnnotation;
     570           0 :     GetSelectedAnnotation( xAnnotation );
     571             : 
     572           0 :     if( !xAnnotation.is() || bReadOnly )
     573           0 :         rSet.DisableItem( SID_DELETE_POSTIT );
     574             : 
     575           0 :     SdPage* pPage = 0;
     576             : 
     577           0 :     bool bHasAnnotations = false;
     578           0 :     do
     579             :     {
     580           0 :         pPage = GetNextPage( pPage, true );
     581             : 
     582           0 :         if( pPage && !pPage->getAnnotations().empty() )
     583           0 :             bHasAnnotations = true;
     584             :     }
     585           0 :     while( pPage && !bHasAnnotations );
     586             : 
     587           0 :     if( !bHasAnnotations || bReadOnly )
     588             :     {
     589           0 :         rSet.DisableItem( SID_DELETEALL_POSTIT );
     590             :     }
     591             : 
     592           0 :     if( bWrongPageKind || !bHasAnnotations )
     593             :     {
     594           0 :         rSet.DisableItem( SID_PREVIOUS_POSTIT );
     595           0 :         rSet.DisableItem( SID_NEXT_POSTIT );
     596           0 :     }
     597           0 : }
     598             : 
     599           0 : void AnnotationManagerImpl::SelectNextAnnotation(bool bForeward)
     600             : {
     601           0 :     ShowAnnotations( true );
     602             : 
     603           0 :     Reference< XAnnotation > xCurrent;
     604           0 :     GetSelectedAnnotation( xCurrent );
     605           0 :     SdPage* pPage = GetCurrentPage();
     606           0 :     if( !pPage )
     607           0 :         return;
     608             : 
     609           0 :     AnnotationVector aAnnotations( pPage->getAnnotations() );
     610             : 
     611           0 :     if( bForeward )
     612             :     {
     613           0 :         if( xCurrent.is() )
     614             :         {
     615           0 :             for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
     616             :             {
     617           0 :                 if( (*iter) == xCurrent )
     618             :                 {
     619           0 :                     ++iter;
     620           0 :                     if( iter != aAnnotations.end() )
     621             :                     {
     622           0 :                         SelectAnnotation( (*iter) );
     623           0 :                         return;
     624             :                     }
     625           0 :                     break;
     626             :                 }
     627             :             }
     628             :         }
     629           0 :         else if( !aAnnotations.empty() )
     630             :         {
     631           0 :             SelectAnnotation( *(aAnnotations.begin()) );
     632           0 :             return;
     633             :         }
     634             :     }
     635             :     else
     636             :     {
     637           0 :         if( xCurrent.is() )
     638             :         {
     639           0 :             for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
     640             :             {
     641           0 :                 if( (*iter) == xCurrent )
     642             :                 {
     643           0 :                     if( iter != aAnnotations.begin() )
     644             :                     {
     645           0 :                         --iter;
     646           0 :                         SelectAnnotation( (*iter) );
     647           0 :                         return;
     648             :                     }
     649           0 :                     break;
     650             :                 }
     651             :             }
     652             :         }
     653           0 :         else if( !aAnnotations.empty() )
     654             :         {
     655           0 :             AnnotationVector::iterator iter( aAnnotations.end() );
     656           0 :             SelectAnnotation( *(--iter) );
     657           0 :             return;
     658             :         }
     659             :     }
     660             : 
     661           0 :     mxSelectedAnnotation.clear();
     662             :     do
     663             :     {
     664           0 :         do
     665             :         {
     666           0 :             pPage = GetNextPage( pPage, bForeward );
     667             : 
     668           0 :             if( pPage && !pPage->getAnnotations().empty() )
     669             :             {
     670             :                 // switch to next/previous slide with annotations
     671           0 :                 ::boost::shared_ptr<DrawViewShell> pDrawViewShell(::boost::dynamic_pointer_cast<DrawViewShell>(mrBase.GetMainViewShell()));
     672           0 :                 if (pDrawViewShell.get() != NULL)
     673             :                 {
     674           0 :                     pDrawViewShell->ChangeEditMode(pPage->IsMasterPage() ? EM_MASTERPAGE : EM_PAGE, false);
     675           0 :                     pDrawViewShell->SwitchPage((pPage->GetPageNum() - 1) >> 1);
     676             : 
     677           0 :                     SfxDispatcher* pDispatcher = getDispatcher( mrBase );
     678           0 :                     if( pDispatcher )
     679           0 :                         pDispatcher->Execute( bForeward ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT );
     680             : 
     681           0 :                     return;
     682           0 :                 }
     683             :             }
     684             :         }
     685             :         while( pPage );
     686             : 
     687             :         // The question text depends on the search direction.
     688           0 :         bool bImpress = mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS;
     689             :         sal_uInt16 nStringId;
     690           0 :         if(bForeward)
     691           0 :             nStringId = bImpress ? STR_ANNOTATION_WRAP_FORWARD : STR_ANNOTATION_WRAP_FORWARD_DRAW;
     692             :         else
     693           0 :             nStringId = bImpress ? STR_ANNOTATION_WRAP_BACKWARD : STR_ANNOTATION_WRAP_BACKWARD_DRAW;
     694             : 
     695             :         // Pop up question box that asks the user whether to wrap around.
     696             :         // The dialog is made modal with respect to the whole application.
     697           0 :         ScopedVclPtrInstance< QueryBox > aQuestionBox( nullptr, (WB_YES_NO | WB_DEF_YES), SD_RESSTR(nStringId));
     698           0 :         aQuestionBox->SetImage( QueryBox::GetStandardImage() );
     699           0 :         if (aQuestionBox->Execute() != RET_YES)
     700           0 :             break;
     701             :     }
     702           0 :     while( true );
     703             : }
     704             : 
     705           0 : void AnnotationManagerImpl::onTagSelected( AnnotationTag& rTag )
     706             : {
     707           0 :     mxSelectedAnnotation = rTag.GetAnnotation();
     708           0 :     invalidateSlots();
     709           0 : }
     710             : 
     711           0 : void AnnotationManagerImpl::onTagDeselected( AnnotationTag& rTag )
     712             : {
     713           0 :     if( rTag.GetAnnotation() == mxSelectedAnnotation )
     714             :     {
     715           0 :         mxSelectedAnnotation.clear();
     716           0 :         invalidateSlots();
     717             :     }
     718           0 : }
     719             : 
     720           0 : void AnnotationManagerImpl::SelectAnnotation( ::com::sun::star::uno::Reference< ::com::sun::star::office::XAnnotation > xAnnotation, bool bEdit /* = sal_False */ )
     721             : {
     722           0 :     mxSelectedAnnotation = xAnnotation;
     723             : 
     724           0 :     const AnnotationTagVector::const_iterator aEnd( maTagVector.end() );
     725           0 :     for( AnnotationTagVector::const_iterator iter( maTagVector.begin() );
     726             :         iter != aEnd; ++iter)
     727             :     {
     728           0 :         if( (*iter)->GetAnnotation() == xAnnotation )
     729             :         {
     730           0 :             SmartTagReference xTag( (*iter).get() );
     731           0 :             mrBase.GetMainViewShell()->GetView()->getSmartTags().select( xTag );
     732           0 :             (*iter)->OpenPopup( bEdit );
     733           0 :             break;
     734             :         }
     735             :     }
     736           0 : }
     737             : 
     738           0 : void AnnotationManagerImpl::GetSelectedAnnotation( ::com::sun::star::uno::Reference< ::com::sun::star::office::XAnnotation >& xAnnotation )
     739             : {
     740           0 :     xAnnotation = mxSelectedAnnotation;
     741           0 : }
     742             : 
     743         169 : void AnnotationManagerImpl::invalidateSlots()
     744             : {
     745         169 :     SfxBindings* pBindings = getBindings( mrBase );
     746         169 :     if( pBindings )
     747             :     {
     748         169 :         pBindings->Invalidate( SID_INSERT_POSTIT );
     749         169 :         pBindings->Invalidate( SID_DELETE_POSTIT );
     750         169 :         pBindings->Invalidate( SID_DELETEALL_POSTIT );
     751         169 :         pBindings->Invalidate( SID_PREVIOUS_POSTIT );
     752         169 :         pBindings->Invalidate( SID_NEXT_POSTIT );
     753         169 :         pBindings->Invalidate( SID_UNDO );
     754         169 :         pBindings->Invalidate( SID_REDO );
     755             :     }
     756         169 : }
     757             : 
     758         508 : void AnnotationManagerImpl::onSelectionChanged()
     759             : {
     760         508 :     if( mxView.is() && mrBase.GetDrawView() ) try
     761             :     {
     762         189 :         Reference< XAnnotationAccess > xPage( mxView->getCurrentPage(), UNO_QUERY );
     763             : 
     764         189 :         if( xPage != mxCurrentPage )
     765             :         {
     766         169 :             mxCurrentPage = xPage;
     767             : 
     768         169 :             UpdateTags(true);
     769         189 :         }
     770             :     }
     771           0 :     catch( Exception& )
     772             :     {
     773             :         OSL_FAIL( "sd::AnnotationManagerImpl::onSelectionChanged(), exception caught!" );
     774             :     }
     775         508 : }
     776             : 
     777         169 : void AnnotationManagerImpl::UpdateTags( bool bSynchron )
     778             : {
     779         169 :     if( bSynchron )
     780             :     {
     781         169 :         if( mnUpdateTagsEvent )
     782           0 :             Application::RemoveUserEvent( mnUpdateTagsEvent );
     783             : 
     784         169 :         UpdateTagsHdl(0);
     785             :     }
     786             :     else
     787             :     {
     788           0 :         if( !mnUpdateTagsEvent && mxView.is() )
     789           0 :             mnUpdateTagsEvent = Application::PostUserEvent( LINK( this, AnnotationManagerImpl, UpdateTagsHdl ) );
     790             :     }
     791         169 : }
     792             : 
     793         169 : IMPL_LINK_NOARG(AnnotationManagerImpl, UpdateTagsHdl)
     794             : {
     795         169 :     mnUpdateTagsEvent  = 0;
     796         169 :     DisposeTags();
     797             : 
     798         169 :     if( mbShowAnnotations )
     799         169 :         CreateTags();
     800             : 
     801         169 :     if( mrBase.GetDrawView() )
     802         169 :         static_cast< ::sd::View* >( mrBase.GetDrawView() )->updateHandles();
     803             : 
     804         169 :     invalidateSlots();
     805             : 
     806         169 :     return 0;
     807             : }
     808             : 
     809         169 : void AnnotationManagerImpl::CreateTags()
     810             : {
     811             : 
     812         169 :     if( mxCurrentPage.is() && mpDoc ) try
     813             :     {
     814         169 :         int nIndex = 1;
     815         169 :         maFont = Application::GetSettings().GetStyleSettings().GetAppFont();
     816             : 
     817         169 :         rtl::Reference< AnnotationTag > xSelectedTag;
     818             : 
     819         338 :         Reference< XAnnotationEnumeration > xEnum( mxCurrentPage->createAnnotationEnumeration() );
     820         338 :         while( xEnum->hasMoreElements() )
     821             :         {
     822           0 :             Reference< XAnnotation > xAnnotation( xEnum->nextElement() );
     823           0 :             Color aColor( GetColorLight( mpDoc->GetAnnotationAuthorIndex( xAnnotation->getAuthor() ) ) );
     824           0 :             rtl::Reference< AnnotationTag > xTag( new AnnotationTag( *this, *mrBase.GetMainViewShell()->GetView(), xAnnotation, aColor, nIndex++, maFont ) );
     825           0 :             maTagVector.push_back(xTag);
     826             : 
     827           0 :             if( xAnnotation == mxSelectedAnnotation )
     828             :             {
     829           0 :                 xSelectedTag = xTag;
     830             :             }
     831           0 :         }
     832             : 
     833         169 :         if( xSelectedTag.is() )
     834             :         {
     835           0 :             SmartTagReference xTag( xSelectedTag.get() );
     836           0 :             mrBase.GetMainViewShell()->GetView()->getSmartTags().select( xTag );
     837             :         }
     838             :         else
     839             :         {
     840             :             // no tag, no selection!
     841         169 :             mxSelectedAnnotation.clear();
     842         169 :         }
     843             :     }
     844           0 :     catch( Exception& )
     845             :     {
     846             :         OSL_FAIL( "sd::AnnotationManagerImpl::onSelectionChanged(), exception caught!" );
     847             :     }
     848         169 : }
     849             : 
     850         302 : void AnnotationManagerImpl::DisposeTags()
     851             : {
     852         302 :     if( !maTagVector.empty() )
     853             :     {
     854           0 :         AnnotationTagVector::iterator iter = maTagVector.begin();
     855           0 :         do
     856             :         {
     857           0 :             (*iter++)->Dispose();
     858             :         }
     859           0 :         while( iter != maTagVector.end() );
     860             : 
     861           0 :         maTagVector.clear();
     862             :     }
     863         302 : }
     864             : 
     865         133 : void AnnotationManagerImpl::addListener()
     866             : {
     867         133 :     Link<> aLink( LINK(this,AnnotationManagerImpl,EventMultiplexerListener) );
     868             :     mrBase.GetEventMultiplexer()->AddEventListener (
     869             :         aLink,
     870             :         tools::EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION
     871             :         | tools::EventMultiplexerEvent::EID_CURRENT_PAGE
     872             :         | tools::EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED
     873         133 :         | tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED);
     874         133 : }
     875             : 
     876         133 : void AnnotationManagerImpl::removeListener()
     877             : {
     878         133 :     Link<> aLink( LINK(this,AnnotationManagerImpl,EventMultiplexerListener) );
     879         133 :     mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
     880         133 : }
     881             : 
     882       11124 : IMPL_LINK(AnnotationManagerImpl,EventMultiplexerListener,
     883             :     tools::EventMultiplexerEvent*,pEvent)
     884             : {
     885        5562 :     switch (pEvent->meEventId)
     886             :     {
     887             :         case tools::EventMultiplexerEvent::EID_CURRENT_PAGE:
     888             :         case tools::EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION:
     889         226 :             onSelectionChanged();
     890         226 :             break;
     891             : 
     892             :         case tools::EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED:
     893         138 :             mxView.clear();
     894         138 :             onSelectionChanged();
     895         138 :             break;
     896             : 
     897             :         case tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED:
     898         144 :             mxView = Reference<XDrawView>::query( mrBase.GetController() );
     899         144 :             onSelectionChanged();
     900         144 :             break;
     901             :     }
     902        5562 :     return 0;
     903             : }
     904             : 
     905           0 : void AnnotationManagerImpl::ExecuteAnnotationContextMenu( Reference< XAnnotation > xAnnotation, vcl::Window* pParent, const Rectangle& rContextRect, bool bButtonMenu /* = false */ )
     906             : {
     907           0 :     SfxDispatcher* pDispatcher( getDispatcher( mrBase ) );
     908           0 :     if( !pDispatcher )
     909           0 :         return;
     910             : 
     911           0 :     const bool bReadOnly = mrBase.GetDocShell()->IsReadOnly();
     912             : 
     913           0 :     AnnotationWindow* pAnnotationWindow = bButtonMenu ? 0 : dynamic_cast< AnnotationWindow* >( pParent );
     914             : 
     915           0 :     if( bReadOnly && !pAnnotationWindow )
     916           0 :         return;
     917             : 
     918           0 :     boost::scoped_ptr< PopupMenu > pMenu( new PopupMenu( SdResId( pAnnotationWindow ? RID_ANNOTATION_CONTEXTMENU : RID_ANNOTATION_TAG_CONTEXTMENU ) ) );
     919             : 
     920           0 :     SvtUserOptions aUserOptions;
     921           0 :     OUString sCurrentAuthor( aUserOptions.GetFullName() );
     922           0 :     OUString sAuthor( xAnnotation->getAuthor() );
     923             : 
     924           0 :     OUString aStr( pMenu->GetItemText( SID_DELETEALLBYAUTHOR_POSTIT ) );
     925           0 :     OUString aReplace( sAuthor );
     926           0 :     if( aReplace.isEmpty() )
     927           0 :         aReplace = SD_RESSTR( STR_ANNOTATION_NOAUTHOR );
     928           0 :     aStr = aStr.replaceFirst("%1", aReplace);
     929           0 :     pMenu->SetItemText( SID_DELETEALLBYAUTHOR_POSTIT, aStr );
     930           0 :     pMenu->EnableItem( SID_REPLYTO_POSTIT, (sAuthor != sCurrentAuthor) && !bReadOnly );
     931           0 :     pMenu->EnableItem( SID_DELETE_POSTIT, xAnnotation.is() && !bReadOnly );
     932           0 :     pMenu->EnableItem( SID_DELETEALLBYAUTHOR_POSTIT, !bReadOnly );
     933           0 :     pMenu->EnableItem( SID_DELETEALL_POSTIT, !bReadOnly );
     934             : 
     935           0 :     if( pAnnotationWindow )
     936             :     {
     937           0 :         if( pAnnotationWindow->IsProtected() || bReadOnly )
     938             :         {
     939           0 :             pMenu->EnableItem( SID_ATTR_CHAR_WEIGHT, false );
     940           0 :             pMenu->EnableItem( SID_ATTR_CHAR_POSTURE, false );
     941           0 :             pMenu->EnableItem( SID_ATTR_CHAR_UNDERLINE, false );
     942           0 :             pMenu->EnableItem( SID_ATTR_CHAR_STRIKEOUT, false );
     943           0 :             pMenu->EnableItem( SID_PASTE, false );
     944             :         }
     945             :         else
     946             :         {
     947           0 :             SfxItemSet aSet(pAnnotationWindow->getView()->GetAttribs());
     948             : 
     949           0 :             if ( aSet.GetItemState( EE_CHAR_WEIGHT ) == SfxItemState::SET )
     950             :             {
     951           0 :                 if( static_cast<const SvxWeightItem&>(aSet.Get( EE_CHAR_WEIGHT )).GetWeight() == WEIGHT_BOLD )
     952           0 :                     pMenu->CheckItem( SID_ATTR_CHAR_WEIGHT );
     953             :             }
     954             : 
     955           0 :             if ( aSet.GetItemState( EE_CHAR_ITALIC ) == SfxItemState::SET )
     956             :             {
     957           0 :                 if( static_cast<const SvxPostureItem&>(aSet.Get( EE_CHAR_ITALIC )).GetPosture() != ITALIC_NONE )
     958           0 :                     pMenu->CheckItem( SID_ATTR_CHAR_POSTURE );
     959             : 
     960             :             }
     961           0 :             if ( aSet.GetItemState( EE_CHAR_UNDERLINE ) == SfxItemState::SET )
     962             :             {
     963           0 :                 if( static_cast<const SvxUnderlineItem&>(aSet.Get( EE_CHAR_UNDERLINE )).GetLineStyle() != UNDERLINE_NONE )
     964           0 :                     pMenu->CheckItem( SID_ATTR_CHAR_UNDERLINE );
     965             :             }
     966             : 
     967           0 :             if ( aSet.GetItemState( EE_CHAR_STRIKEOUT ) == SfxItemState::SET )
     968             :             {
     969           0 :                 if( static_cast<const SvxCrossedOutItem&>(aSet.Get( EE_CHAR_STRIKEOUT )).GetStrikeout() != STRIKEOUT_NONE )
     970           0 :                     pMenu->CheckItem( SID_ATTR_CHAR_STRIKEOUT );
     971             :             }
     972           0 :             TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pAnnotationWindow ) );
     973           0 :             pMenu->EnableItem( SID_PASTE, aDataHelper.GetFormatCount() != 0 );
     974             :         }
     975             : 
     976           0 :         pMenu->EnableItem( SID_COPY, pAnnotationWindow->getView()->HasSelection() );
     977             :     }
     978             : 
     979           0 :     sal_uInt16 nId = 0;
     980             : 
     981             :     // set slot images
     982           0 :     Reference< ::com::sun::star::frame::XFrame > xFrame( mrBase.GetMainViewShell()->GetViewFrame()->GetFrame().GetFrameInterface() );
     983           0 :     if( xFrame.is() )
     984             :     {
     985           0 :         for( sal_uInt16 nPos = 0; nPos < pMenu->GetItemCount(); nPos++ )
     986             :         {
     987           0 :             nId = pMenu->GetItemId( nPos );
     988           0 :             if( pMenu->IsItemEnabled( nId ) )
     989             :             {
     990           0 :                 OUString sSlotURL( "slot:" );
     991           0 :                 sSlotURL += OUString::number( nId);
     992             : 
     993           0 :                 Image aImage( GetImage( xFrame, sSlotURL, false ) );
     994           0 :                 if( !!aImage )
     995           0 :                     pMenu->SetItemImage( nId, aImage );
     996             :             }
     997             :         }
     998             :     }
     999             : 
    1000           0 :     nId = pMenu->Execute( pParent, rContextRect, PopupMenuFlags::ExecuteDown|PopupMenuFlags::NoMouseUpClose );
    1001           0 :     switch( nId )
    1002             :     {
    1003             :     case SID_REPLYTO_POSTIT:
    1004             :     {
    1005           0 :         const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( xAnnotation ) );
    1006           0 :         pDispatcher->Execute( SID_REPLYTO_POSTIT, SfxCallMode::ASYNCHRON, &aItem, 0 );
    1007           0 :         break;
    1008             :     }
    1009             :     case SID_DELETE_POSTIT:
    1010             :     {
    1011           0 :         const SfxUnoAnyItem aItem( SID_DELETE_POSTIT, Any( xAnnotation ) );
    1012           0 :         pDispatcher->Execute( SID_DELETE_POSTIT, SfxCallMode::ASYNCHRON, &aItem, 0 );
    1013           0 :         break;
    1014             :     }
    1015             :     case SID_DELETEALLBYAUTHOR_POSTIT:
    1016             :     {
    1017           0 :         const SfxStringItem aItem( SID_DELETEALLBYAUTHOR_POSTIT, sAuthor );
    1018           0 :         pDispatcher->Execute( SID_DELETEALLBYAUTHOR_POSTIT, SfxCallMode::ASYNCHRON, &aItem, 0 );
    1019           0 :         break;
    1020             :     }
    1021             :     case SID_DELETEALL_POSTIT:
    1022           0 :         pDispatcher->Execute( SID_DELETEALL_POSTIT );
    1023           0 :         break;
    1024             :     case SID_COPY:
    1025             :     case SID_PASTE:
    1026             :     case SID_ATTR_CHAR_WEIGHT:
    1027             :     case SID_ATTR_CHAR_POSTURE:
    1028             :     case SID_ATTR_CHAR_UNDERLINE:
    1029             :     case SID_ATTR_CHAR_STRIKEOUT:
    1030           0 :         if( pAnnotationWindow )
    1031           0 :             pAnnotationWindow->ExecuteSlot( nId );
    1032           0 :         break;
    1033           0 :     }
    1034             : }
    1035             : 
    1036           0 : Color AnnotationManagerImpl::GetColor(sal_uInt16 aAuthorIndex)
    1037             : {
    1038           0 :     if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
    1039             :     {
    1040             :         static const Color aArrayNormal[] = {
    1041             :             COL_AUTHOR1_NORMAL,     COL_AUTHOR2_NORMAL,     COL_AUTHOR3_NORMAL,
    1042             :             COL_AUTHOR4_NORMAL,     COL_AUTHOR5_NORMAL,     COL_AUTHOR6_NORMAL,
    1043           0 :             COL_AUTHOR7_NORMAL,     COL_AUTHOR8_NORMAL,     COL_AUTHOR9_NORMAL };
    1044             : 
    1045           0 :         return Color( aArrayNormal[ aAuthorIndex % (sizeof( aArrayNormal )/ sizeof( aArrayNormal[0] ))]);
    1046             :     }
    1047             : 
    1048           0 :     return Color(COL_WHITE);
    1049             : }
    1050             : 
    1051           0 : Color AnnotationManagerImpl::GetColorLight(sal_uInt16 aAuthorIndex)
    1052             : {
    1053           0 :     if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
    1054             :     {
    1055             :         static const Color aArrayLight[] = {
    1056             :             COL_AUTHOR1_LIGHT,      COL_AUTHOR2_LIGHT,      COL_AUTHOR3_LIGHT,
    1057             :             COL_AUTHOR4_LIGHT,      COL_AUTHOR5_LIGHT,      COL_AUTHOR6_LIGHT,
    1058           0 :             COL_AUTHOR7_LIGHT,      COL_AUTHOR8_LIGHT,      COL_AUTHOR9_LIGHT };
    1059             : 
    1060           0 :         return Color( aArrayLight[ aAuthorIndex % (sizeof( aArrayLight )/ sizeof( aArrayLight[0] ))]);
    1061             :     }
    1062             : 
    1063           0 :     return Color(COL_WHITE);
    1064             : }
    1065             : 
    1066           0 : Color AnnotationManagerImpl::GetColorDark(sal_uInt16 aAuthorIndex)
    1067             : {
    1068           0 :     if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
    1069             :     {
    1070             :         static const Color aArrayAnkor[] = {
    1071             :             COL_AUTHOR1_DARK,       COL_AUTHOR2_DARK,       COL_AUTHOR3_DARK,
    1072             :             COL_AUTHOR4_DARK,       COL_AUTHOR5_DARK,       COL_AUTHOR6_DARK,
    1073           0 :             COL_AUTHOR7_DARK,       COL_AUTHOR8_DARK,       COL_AUTHOR9_DARK };
    1074             : 
    1075           0 :         return Color( aArrayAnkor[  aAuthorIndex % (sizeof( aArrayAnkor )   / sizeof( aArrayAnkor[0] ))]);
    1076             :     }
    1077             : 
    1078           0 :     return Color(COL_WHITE);
    1079             : }
    1080             : 
    1081           0 : SdPage* AnnotationManagerImpl::GetNextPage( SdPage* pPage, bool bForeward )
    1082             : {
    1083           0 :     if( pPage == 0 )
    1084           0 :         return bForeward ? GetFirstPage() : GetLastPage();
    1085             : 
    1086           0 :     sal_uInt16 nPageNum = (pPage->GetPageNum() - 1) >> 1;
    1087             : 
    1088             :     // first all non master pages
    1089           0 :     if( !pPage->IsMasterPage() )
    1090             :     {
    1091           0 :         if( bForeward )
    1092             :         {
    1093           0 :             if( nPageNum >= mpDoc->GetSdPageCount(PK_STANDARD)-1 )
    1094             :             {
    1095             :                 // we reached end of draw pages, start with master pages (skip handout master for draw)
    1096           0 :                 return mpDoc->GetMasterSdPage( (mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) ? 0 : 1, PK_STANDARD );
    1097             :             }
    1098           0 :             nPageNum++;
    1099             :         }
    1100             :         else
    1101             :         {
    1102           0 :             if( nPageNum == 0 )
    1103           0 :                 return 0; // we are already on the first draw page, finished
    1104             : 
    1105           0 :             nPageNum--;
    1106             :         }
    1107           0 :         return mpDoc->GetSdPage(nPageNum, PK_STANDARD);
    1108             :     }
    1109             :     else
    1110             :     {
    1111           0 :         if( bForeward )
    1112             :         {
    1113           0 :             if( nPageNum >= mpDoc->GetMasterSdPageCount(PK_STANDARD)-1 )
    1114             :             {
    1115           0 :                 return 0;   // we reached the end, there is nothing more to see here
    1116             :             }
    1117           0 :             nPageNum++;
    1118             :         }
    1119             :         else
    1120             :         {
    1121           0 :             if( nPageNum == (mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS ? 0 : 1) )
    1122             :             {
    1123             :                 // we reached beginning of master pages, start with end if pages
    1124           0 :                 return mpDoc->GetSdPage( mpDoc->GetSdPageCount(PK_STANDARD)-1, PK_STANDARD );
    1125             :             }
    1126             : 
    1127           0 :             nPageNum--;
    1128             :         }
    1129           0 :         return mpDoc->GetMasterSdPage(nPageNum,PK_STANDARD);
    1130             :     }
    1131             : }
    1132             : 
    1133           0 : SdPage* AnnotationManagerImpl::GetFirstPage()
    1134             : {
    1135             :     // return first drawing page
    1136           0 :     return mpDoc->GetSdPage(0, PK_STANDARD );
    1137             : }
    1138             : 
    1139           0 : SdPage* AnnotationManagerImpl::GetLastPage()
    1140             : {
    1141           0 :     return mpDoc->GetMasterSdPage( mpDoc->GetMasterSdPageCount(PK_STANDARD) - 1, PK_STANDARD );
    1142             : }
    1143             : 
    1144           0 : SdPage* AnnotationManagerImpl::GetCurrentPage()
    1145             : {
    1146           0 :     return mrBase.GetMainViewShell()->getCurrentPage();
    1147             : }
    1148             : 
    1149         133 : AnnotationManager::AnnotationManager( ViewShellBase& rViewShellBase )
    1150         133 : : mxImpl( new AnnotationManagerImpl( rViewShellBase ) )
    1151             : {
    1152         133 :     mxImpl->init();
    1153         133 : }
    1154             : 
    1155         266 : AnnotationManager::~AnnotationManager()
    1156             : {
    1157         133 :     mxImpl->dispose();
    1158         133 : }
    1159             : 
    1160           0 : void AnnotationManager::ExecuteAnnotation(SfxRequest& rRequest)
    1161             : {
    1162           0 :     mxImpl->ExecuteAnnotation( rRequest );
    1163           0 : }
    1164             : 
    1165           0 : void AnnotationManager::GetAnnotationState(SfxItemSet& rItemSet)
    1166             : {
    1167           0 :     mxImpl->GetAnnotationState(rItemSet);
    1168           0 : }
    1169             : 
    1170          66 : }
    1171             : 
    1172             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11