summaryrefslogtreecommitdiff
path: root/sd/source/ui/annotations/annotationmanager.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/annotations/annotationmanager.cxx')
-rw-r--r--sd/source/ui/annotations/annotationmanager.cxx1246
1 files changed, 0 insertions, 1246 deletions
diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx
deleted file mode 100644
index 241b4d9cc..000000000
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ /dev/null
@@ -1,1246 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sd.hxx"
-
-#include "sddll.hxx"
-
-#include <com/sun/star/beans/XMultiPropertyStates.hpp>
-#include <com/sun/star/frame/XController.hpp>
-#include <com/sun/star/frame/XModel.hpp>
-#include <com/sun/star/view/XSelectionSupplier.hpp>
-#include <com/sun/star/geometry/RealPoint2D.hpp>
-#include <com/sun/star/text/XText.hpp>
-#include <com/sun/star/document/XEventBroadcaster.hpp>
-#include <svx/svxids.hrc>
-#include <vcl/menu.hxx>
-#include <vcl/msgbox.hxx>
-
-#include <sal/macros.h>
-#include <svl/style.hxx>
-#include <svl/itempool.hxx>
-#include <unotools/useroptions.hxx>
-#include <unotools/syslocale.hxx>
-#include <unotools/saveopt.hxx>
-
-#include <sfx2/imagemgr.hxx>
-#include <sfx2/viewfrm.hxx>
-#include <sfx2/bindings.hxx>
-#include <sfx2/app.hxx>
-#include <sfx2/request.hxx>
-#include <sfx2/dispatch.hxx>
-#include <sfx2/objface.hxx>
-#include <sfx2/imagemgr.hxx>
-
-#include <editeng/editeng.hxx>
-#include <editeng/eeitem.hxx>
-#include <editeng/fontitem.hxx>
-#include <editeng/fhgtitem.hxx>
-#include <editeng/outlobj.hxx>
-#include <editeng/postitem.hxx>
-#include <editeng/wghtitem.hxx>
-#include <editeng/udlnitem.hxx>
-#include <editeng/crsditem.hxx>
-
-#include <svx/svdetc.hxx>
-
-#include "annotationmanager.hxx"
-#include "annotationmanagerimpl.hxx"
-#include "annotationwindow.hxx"
-#include "annotations.hrc"
-
-#include "ToolBarManager.hxx"
-#include "DrawDocShell.hxx"
-#include "DrawViewShell.hxx"
-#include "DrawController.hxx"
-#include "glob.hrc"
-#include "sdresid.hxx"
-#include "EventMultiplexer.hxx"
-#include "ViewShellManager.hxx"
-#include "helpids.h"
-#include "sdpage.hxx"
-#include "drawdoc.hxx"
-#include "textapi.hxx"
-#include "optsitem.hxx"
-
-#define C2U(x) OUString( RTL_CONSTASCII_USTRINGPARAM( x ) )
-using ::rtl::OUString;
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::drawing;
-using namespace ::com::sun::star::document;
-using namespace ::com::sun::star::geometry;
-using namespace ::com::sun::star::container;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::text;
-using namespace ::com::sun::star::view;
-using namespace ::com::sun::star::style;
-using namespace ::com::sun::star::frame;
-using namespace ::com::sun::star::lang;
-using namespace ::com::sun::star::ui;
-using namespace ::com::sun::star::task;
-using namespace ::com::sun::star::office;
-
-namespace sd {
-
-// --------------------------------------------------------------------
-
-extern TextApiObject* getTextApiObject( const Reference< XAnnotation >& xAnnotation );
-
-// --------------------------------------------------------------------
-
-SfxItemPool* GetAnnotationPool()
-{
- static SfxItemPool* mpAnnotationPool = 0;
- if( mpAnnotationPool == 0 )
- {
- mpAnnotationPool = EditEngine::CreatePool( sal_False );
- mpAnnotationPool->SetPoolDefaultItem(SvxFontHeightItem(423,100,EE_CHAR_FONTHEIGHT));
-
- Font aAppFont( Application::GetSettings().GetStyleSettings().GetAppFont() );
- String EMPTYSTRING;
- mpAnnotationPool->SetPoolDefaultItem(SvxFontItem(aAppFont.GetFamily(),aAppFont.GetName(), EMPTYSTRING,PITCH_DONTKNOW,RTL_TEXTENCODING_DONTKNOW,EE_CHAR_FONTINFO));
- }
-
- return mpAnnotationPool;
-}
-
-// --------------------------------------------------------------------
-
-static SfxBindings* getBindings( ViewShellBase& rBase )
-{
- if( rBase.GetMainViewShell().get() && rBase.GetMainViewShell()->GetViewFrame() )
- return &rBase.GetMainViewShell()->GetViewFrame()->GetBindings();
- else
- return 0;
-}
-
-// --------------------------------------------------------------------
-
-static SfxDispatcher* getDispatcher( ViewShellBase& rBase )
-{
- if( rBase.GetMainViewShell().get() && rBase.GetMainViewShell()->GetViewFrame() )
- return rBase.GetMainViewShell()->GetViewFrame()->GetDispatcher();
- else
- return 0;
-}
-
-com::sun::star::util::DateTime getCurrentDateTime()
-{
- TimeValue osltime;
- osl_getSystemTime( &osltime );
- oslDateTime osldt;
- osl_getDateTimeFromTimeValue( &osltime, &osldt );
- return com::sun::star::util::DateTime( 0, osldt.Seconds, osldt.Minutes, osldt.Hours, osldt.Day, osldt.Month, osldt.Year );
-}
-
-OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation )
-{
- OUString sRet;
- if( xAnnotation.is() )
- {
- const SvtSysLocale aSysLocale;
- const LocaleDataWrapper& rLocalData = aSysLocale.GetLocaleData();
-
- com::sun::star::util::DateTime aDateTime( xAnnotation->getDateTime() );
-
- Date aDate = Date( aDateTime.Day, aDateTime.Month, aDateTime.Year );
- if (aDate==Date())
- sRet = sRet + String(SdResId(STR_ANNOTATION_TODAY));
- else
- if (aDate == Date(Date()-1))
- sRet = sRet + String(SdResId(STR_ANNOTATION_YESTERDAY));
- else
- if (aDate.IsValid() )
- sRet = sRet + rLocalData.getDate(aDate);
-
- Time aTime( aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.HundredthSeconds );
- if(aTime.GetTime() != 0)
- sRet = sRet + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" ")) + rLocalData.getTime( aTime,false );
- }
- return sRet;
-}
-
-// --------------------------------------------------------------------
-
-AnnotationManagerImpl::AnnotationManagerImpl( ViewShellBase& rViewShellBase )
-: AnnotationManagerImplBase( m_aMutex )
-, mrBase( rViewShellBase )
-, mpDoc( rViewShellBase.GetDocument() )
-, mbShowAnnotations( true )
-, mnUpdateTagsEvent( 0 )
-{
- SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType());
- if( pOptions )
- mbShowAnnotations = pOptions->IsShowComments() == sal_True;
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::init()
-{
- // get current controller and initialize listeners
- try
- {
- addListener();
- mxView = Reference< XDrawView >::query(mrBase.GetController());
- }
- catch( Exception& e )
- {
- (void)e;
- OSL_FAIL( "sd::AnnotationManagerImpl::AnnotationManagerImpl(), Exception caught!" );
- }
-
- try
- {
- Reference<XEventBroadcaster> xModel (mrBase.GetDocShell()->GetModel(), UNO_QUERY_THROW );
- Reference<XEventListener> xListener( this );
- xModel->addEventListener( xListener );
- }
- catch( Exception& )
- {
- }
-}
-
-// --------------------------------------------------------------------
-
-// WeakComponentImplHelper1
-void SAL_CALL AnnotationManagerImpl::disposing ()
-{
- try
- {
- Reference<XEventBroadcaster> xModel (mrBase.GetDocShell()->GetModel(), UNO_QUERY_THROW );
- Reference<XEventListener> xListener( this );
- xModel->removeEventListener( xListener );
- }
- catch( Exception& )
- {
- }
-
- removeListener();
- DisposeTags();
-
- if( mnUpdateTagsEvent )
- {
- Application::RemoveUserEvent( mnUpdateTagsEvent );
- mnUpdateTagsEvent = 0;
- }
-
- mxView.clear();
- mxCurrentPage.clear();
-}
-
-// --------------------------------------------------------------------
-
-// XEventListener
-void SAL_CALL AnnotationManagerImpl::notifyEvent( const ::com::sun::star::document::EventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException)
-{
- if( aEvent.EventName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OnAnnotationInserted") ) ||
- aEvent.EventName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OnAnnotationRemoved") ) ||
- aEvent.EventName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OnAnnotationChanged" )) )
- {
- UpdateTags();
- }
-}
-
-void SAL_CALL AnnotationManagerImpl::disposing( const ::com::sun::star::lang::EventObject& /*Source*/ ) throw (::com::sun::star::uno::RuntimeException)
-{
-}
-
-void AnnotationManagerImpl::ShowAnnotations( bool bShow )
-{
- // enforce show annotations if a new annotation is inserted
- if( mbShowAnnotations != bShow )
- {
- mbShowAnnotations = bShow;
-
- SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType());
- if( pOptions )
- pOptions->SetShowComments( mbShowAnnotations ? sal_True : sal_False );
-
- UpdateTags();
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::ExecuteAnnotation(SfxRequest& rReq )
-{
- switch( rReq.GetSlot() )
- {
- case SID_INSERT_POSTIT:
- ExecuteInsertAnnotation( rReq );
- break;
- case SID_DELETE_POSTIT:
- case SID_DELETEALL_POSTIT:
- case SID_DELETEALLBYAUTHOR_POSTIT:
- ExecuteDeleteAnnotation( rReq );
- break;
- case SID_PREVIOUS_POSTIT:
- case SID_NEXT_POSTIT:
- SelectNextAnnotation( rReq.GetSlot() == SID_NEXT_POSTIT );
- break;
- case SID_REPLYTO_POSTIT:
- ExecuteReplyToAnnotation( rReq );
- break;
- case SID_SHOW_POSTIT:
- ShowAnnotations( !mbShowAnnotations );
- break;
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::ExecuteInsertAnnotation(SfxRequest& /*rReq*/)
-{
- ShowAnnotations(true);
- InsertAnnotation();
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::ExecuteDeleteAnnotation(SfxRequest& rReq)
-{
- ShowAnnotations( true );
-
- const SfxItemSet* pArgs = rReq.GetArgs();
-
- switch( rReq.GetSlot() )
- {
- case SID_DELETEALL_POSTIT:
- DeleteAllAnnotations();
- break;
- case SID_DELETEALLBYAUTHOR_POSTIT:
- if( pArgs )
- {
- const SfxPoolItem* pPoolItem = NULL;
- if( SFX_ITEM_SET == pArgs->GetItemState( SID_DELETEALLBYAUTHOR_POSTIT, sal_True, &pPoolItem ) )
- {
- OUString sAuthor( (( const SfxStringItem* ) pPoolItem )->GetValue() );
- DeleteAnnotationsByAuthor( sAuthor );
- }
- }
- break;
- case SID_DELETE_POSTIT:
- {
- Reference< XAnnotation > xAnnotation;
-
- if( rReq.GetSlot() == SID_DELETE_POSTIT )
- {
- if( pArgs )
- {
- const SfxPoolItem* pPoolItem = NULL;
- if( SFX_ITEM_SET == pArgs->GetItemState( SID_DELETE_POSTIT, sal_True, &pPoolItem ) )
- ( ( const SfxUnoAnyItem* ) pPoolItem )->GetValue() >>= xAnnotation;
- }
- }
-
- if( !xAnnotation.is() )
- GetSelectedAnnotation( xAnnotation );
-
- DeleteAnnotation( xAnnotation );
- }
- break;
- }
-
- UpdateTags();
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::InsertAnnotation()
-{
- SdPage* pPage = GetCurrentPage();
- if( pPage )
- {
- if( mpDoc->IsUndoEnabled() )
- mpDoc->BegUndo( String( SdResId( STR_ANNOTATION_UNDO_INSERT ) ) );
-
- // find free space for new annotation
- int y = 0, x = 0;
-
- AnnotationVector aAnnotations( pPage->getAnnotations() );
- if( !aAnnotations.empty() )
- {
- const int page_width = pPage->GetSize().Width();
- const int width = 1000;
- const int height = 800;
- Rectangle aTagRect;
-
- while( true )
- {
- Rectangle aNewRect( x, y, x + width - 1, y + height - 1 );
- bool bFree = true;
-
- for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
- {
- RealPoint2D aPoint( (*iter)->getPosition() );
- aTagRect.nLeft = sal::static_int_cast< long >( aPoint.X * 100.0 );
- aTagRect.nTop = sal::static_int_cast< long >( aPoint.Y * 100.0 );
- aTagRect.nRight = aTagRect.nLeft + width - 1;
- aTagRect.nBottom = aTagRect.nTop + height - 1;
-
- if( aNewRect.IsOver( aTagRect ) )
- {
- bFree = false;
- break;
- }
- }
-
- if( bFree == false)
- {
- x += width;
- if( x > page_width )
- {
- x = 0;
- y += height;
- }
- }
- else
- {
- break;
- }
- }
- }
-
- Reference< XAnnotation > xAnnotation;
- pPage->createAnnotation( xAnnotation );
-
- // set current author to new annotation
- SvtUserOptions aUserOptions;
- xAnnotation->setAuthor( aUserOptions.GetFullName() );
-
- // set current time to new annotation
- xAnnotation->setDateTime( getCurrentDateTime() );
-
- // set position
- RealPoint2D aPos( ((double)x) / 100.0, ((double)y) / 100.0 );
- xAnnotation->setPosition( aPos );
-
- if( mpDoc->IsUndoEnabled() )
- mpDoc->EndUndo();
-
- UpdateTags(true);
- SelectAnnotation( xAnnotation, true );
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest& rReq )
-{
- Reference< XAnnotation > xAnnotation;
- const SfxItemSet* pArgs = rReq.GetArgs();
- if( pArgs )
- {
- const SfxPoolItem* pPoolItem = NULL;
- if( SFX_ITEM_SET == pArgs->GetItemState( rReq.GetSlot(), sal_True, &pPoolItem ) )
- ( ( const SfxUnoAnyItem* ) pPoolItem )->GetValue() >>= xAnnotation;
- }
-
-
- TextApiObject* pTextApi = getTextApiObject( xAnnotation );
- if( pTextApi )
- {
- std::auto_ptr< ::Outliner > pOutliner( new ::Outliner(GetAnnotationPool(),OUTLINERMODE_TEXTOBJECT) );
-
- mpDoc->SetCalcFieldValueHdl( pOutliner.get() );
- pOutliner->SetUpdateMode( sal_True );
-
- String aStr(SdResId(STR_ANNOTATION_REPLY));
- OUString sAuthor( xAnnotation->getAuthor() );
- if( sAuthor.getLength() == 0 )
- sAuthor = String( SdResId( STR_ANNOTATION_NOAUTHOR ) );
-
- aStr.SearchAndReplaceAscii("%1", sAuthor);
-
- aStr.Append( String(RTL_CONSTASCII_USTRINGPARAM(" (") ) );
- aStr.Append( String( getAnnotationDateTimeString( xAnnotation ) ) );
- aStr.Append( String(RTL_CONSTASCII_USTRINGPARAM("): \"") ) );
-
- String sQuote( pTextApi->GetText() );
-
- if( sQuote.Len() == 0 )
- sQuote = String( RTL_CONSTASCII_USTRINGPARAM( "..." ) );
- aStr.Append( sQuote );
- aStr.Append( String(RTL_CONSTASCII_USTRINGPARAM("\"\n") ) );
-
- sal_uInt16 nParaCount = aStr.GetTokenCount( '\n' );
- for( sal_uInt16 nPara = 0; nPara < nParaCount; nPara++ )
- pOutliner->Insert( aStr.GetToken( nPara, '\n' ), LIST_APPEND, -1 );
-
- if( pOutliner->GetParagraphCount() > 1 )
- {
- SfxItemSet aAnswerSet( pOutliner->GetEmptyItemSet() );
- aAnswerSet.Put(SvxPostureItem(ITALIC_NORMAL,EE_CHAR_ITALIC));
-
- ESelection aSel;
- aSel.nEndPara = (sal_uInt16)pOutliner->GetParagraphCount()-2;
- aSel.nEndPos = pOutliner->GetText( pOutliner->GetParagraph( aSel.nEndPara ) ).Len();
-
- pOutliner->QuickSetAttribs( aAnswerSet, aSel );
- }
-
- std::auto_ptr< OutlinerParaObject > pOPO( pOutliner->CreateParaObject() );
- pTextApi->SetText( *pOPO.get() );
-
- SvtUserOptions aUserOptions;
- xAnnotation->setAuthor( aUserOptions.GetFullName() );
-
- // set current time to reply
- xAnnotation->setDateTime( getCurrentDateTime() );
-
- UpdateTags(true);
- SelectAnnotation( xAnnotation, true );
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::DeleteAnnotation( Reference< XAnnotation > xAnnotation )
-{
- SdPage* pPage = GetCurrentPage();
-
- if( xAnnotation.is() && pPage )
- {
- if( mpDoc->IsUndoEnabled() )
- mpDoc->BegUndo( String( SdResId( STR_ANNOTATION_UNDO_DELETE ) ) );
-
- pPage->removeAnnotation( xAnnotation );
-
- if( mpDoc->IsUndoEnabled() )
- mpDoc->EndUndo();
-
- UpdateTags();
- }
-}
-
-void AnnotationManagerImpl::DeleteAnnotationsByAuthor( const rtl::OUString& sAuthor )
-{
- if( mpDoc->IsUndoEnabled() )
- mpDoc->BegUndo( String( SdResId( STR_ANNOTATION_UNDO_DELETE ) ) );
-
- SdPage* pPage = 0;
- do
- {
- pPage = GetNextPage( pPage, true );
-
- if( pPage && !pPage->getAnnotations().empty() )
- {
- AnnotationVector aAnnotations( pPage->getAnnotations() );
- for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
- {
- Reference< XAnnotation > xAnnotation( *iter );
- if( xAnnotation->getAuthor() == sAuthor )
- {
- if( mxSelectedAnnotation == xAnnotation )
- mxSelectedAnnotation.clear();
- pPage->removeAnnotation( xAnnotation );
- }
- }
- }
- } while( pPage );
-
- if( mpDoc->IsUndoEnabled() )
- mpDoc->EndUndo();
-}
-
-void AnnotationManagerImpl::DeleteAllAnnotations()
-{
- if( mpDoc->IsUndoEnabled() )
- mpDoc->BegUndo( String( SdResId( STR_ANNOTATION_UNDO_DELETE ) ) );
-
- SdPage* pPage = 0;
- do
- {
- pPage = GetNextPage( pPage, true );
-
- if( pPage && !pPage->getAnnotations().empty() )
- {
-
- AnnotationVector aAnnotations( pPage->getAnnotations() );
- for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
- {
- pPage->removeAnnotation( (*iter) );
- }
- }
- }
- while( pPage );
-
- mxSelectedAnnotation.clear();
-
- if( mpDoc->IsUndoEnabled() )
- mpDoc->EndUndo();
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::GetAnnotationState(SfxItemSet& rSet)
-{
- SdPage* pCurrentPage = GetCurrentPage();
-
- const bool bReadOnly = mrBase.GetDocShell()->IsReadOnly();
- const bool bWrongPageKind = (pCurrentPage == 0) || (pCurrentPage->GetPageKind() != PK_STANDARD);
-
- const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
-
- if( bReadOnly || bWrongPageKind || (nCurrentODFVersion != SvtSaveOptions::ODFVER_LATEST) )
- rSet.DisableItem( SID_INSERT_POSTIT );
-
- rSet.Put(SfxBoolItem(SID_SHOW_POSTIT, mbShowAnnotations));
-
- Reference< XAnnotation > xAnnotation;
- GetSelectedAnnotation( xAnnotation );
-
- if( !xAnnotation.is() || bReadOnly )
- rSet.DisableItem( SID_DELETE_POSTIT );
-
- SdPage* pPage = 0;
-
- bool bHasAnnotations = false;
- do
- {
- pPage = GetNextPage( pPage, true );
-
- if( pPage && !pPage->getAnnotations().empty() )
- bHasAnnotations = true;
- }
- while( pPage && !bHasAnnotations );
-
- if( !bHasAnnotations || bReadOnly )
- {
- rSet.DisableItem( SID_DELETEALL_POSTIT );
- }
-
- if( bWrongPageKind || !bHasAnnotations )
- {
- rSet.DisableItem( SID_PREVIOUS_POSTIT );
- rSet.DisableItem( SID_NEXT_POSTIT );
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::SelectNextAnnotation(bool bForeward)
-{
- ShowAnnotations( true );
-
- Reference< XAnnotation > xCurrent;
- GetSelectedAnnotation( xCurrent );
- SdPage* pPage = GetCurrentPage();
- if( !pPage )
- return;
-
- AnnotationVector aAnnotations( pPage->getAnnotations() );
-
- if( bForeward )
- {
- if( xCurrent.is() )
- {
- for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
- {
- if( (*iter) == xCurrent )
- {
- ++iter;
- if( iter != aAnnotations.end() )
- {
- SelectAnnotation( (*iter) );
- return;
- }
- break;
- }
- }
- }
- else if( !aAnnotations.empty() )
- {
- SelectAnnotation( *(aAnnotations.begin()) );
- return;
- }
- }
- else
- {
- if( xCurrent.is() )
- {
- for( AnnotationVector::iterator iter = aAnnotations.begin(); iter != aAnnotations.end(); ++iter )
- {
- if( (*iter) == xCurrent )
- {
- if( iter != aAnnotations.begin() )
- {
- --iter;
- SelectAnnotation( (*iter) );
- return;
- }
- break;
- }
- }
- }
- else if( !aAnnotations.empty() )
- {
- AnnotationVector::iterator iter( aAnnotations.end() );
- SelectAnnotation( *(--iter) );
- return;
- }
- }
-
- mxSelectedAnnotation.clear();
- do
- {
- do
- {
- pPage = GetNextPage( pPage, bForeward );
-
- if( pPage && !pPage->getAnnotations().empty() )
- {
- // switch to next/previous slide with annotations
- ::boost::shared_ptr<DrawViewShell> pDrawViewShell(::boost::dynamic_pointer_cast<DrawViewShell>(mrBase.GetMainViewShell()));
- if (pDrawViewShell.get() != NULL)
- {
- pDrawViewShell->ChangeEditMode(pPage->IsMasterPage() ? EM_MASTERPAGE : EM_PAGE, sal_False);
- pDrawViewShell->SwitchPage((pPage->GetPageNum() - 1) >> 1);
-
- SfxDispatcher* pDispatcher = getDispatcher( mrBase );
- if( pDispatcher )
- pDispatcher->Execute( bForeward ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT );
-
- return;
- }
- }
- }
- while( pPage );
-
- // The question text depends on the search direction.
- bool bImpress = mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS;
- sal_uInt16 nStringId;
- if(bForeward)
- nStringId = bImpress ? STR_ANNOTATION_WRAP_FORWARD : STR_ANNOTATION_WRAP_FORWARD_DRAW;
- else
- nStringId = bImpress ? STR_ANNOTATION_WRAP_BACKWARD : STR_ANNOTATION_WRAP_BACKWARD_DRAW;
-
- // Pop up question box that asks the user whether to wrap arround.
- // The dialog is made modal with respect to the whole application.
- QueryBox aQuestionBox (
- NULL,
- WB_YES_NO | WB_DEF_YES,
- String(SdResId(nStringId)));
- aQuestionBox.SetImage (QueryBox::GetStandardImage());
- sal_uInt16 nBoxResult = aQuestionBox.Execute();
- if(nBoxResult != BUTTONID_YES)
- break;
- }
- while( true );
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::onTagSelected( AnnotationTag& rTag )
-{
- mxSelectedAnnotation = rTag.GetAnnotation();
- invalidateSlots();
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::onTagDeselected( AnnotationTag& rTag )
-{
- if( rTag.GetAnnotation() == mxSelectedAnnotation )
- {
- mxSelectedAnnotation.clear();
- invalidateSlots();
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::SelectAnnotation( ::com::sun::star::uno::Reference< ::com::sun::star::office::XAnnotation > xAnnotation, bool bEdit /* = sal_False */ )
-{
- mxSelectedAnnotation = xAnnotation;
-
- for( AnnotationTagVector::iterator iter( maTagVector.begin() ); iter != maTagVector.end(); iter++ )
- {
- if( (*iter)->GetAnnotation() == xAnnotation )
- {
- SmartTagReference xTag( (*iter).get() );
- mrBase.GetMainViewShell()->GetView()->getSmartTags().select( xTag );
- (*iter)->OpenPopup( bEdit );
- break;
- }
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::GetSelectedAnnotation( ::com::sun::star::uno::Reference< ::com::sun::star::office::XAnnotation >& xAnnotation )
-{
- xAnnotation = mxSelectedAnnotation;
-}
-
-void AnnotationManagerImpl::invalidateSlots()
-{
- SfxBindings* pBindings = getBindings( mrBase );
- if( pBindings )
- {
- pBindings->Invalidate( SID_INSERT_POSTIT );
- pBindings->Invalidate( SID_DELETE_POSTIT );
- pBindings->Invalidate( SID_DELETEALL_POSTIT );
- pBindings->Invalidate( SID_PREVIOUS_POSTIT );
- pBindings->Invalidate( SID_NEXT_POSTIT );
- pBindings->Invalidate( SID_UNDO );
- pBindings->Invalidate( SID_REDO );
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::onSelectionChanged()
-{
- if( mxView.is() && mrBase.GetDrawView() ) try
- {
- Reference< XAnnotationAccess > xPage( mxView->getCurrentPage(), UNO_QUERY );
-
- if( xPage != mxCurrentPage )
- {
- mxCurrentPage = xPage;
-
- UpdateTags(true);
- }
- }
- catch( Exception& )
- {
- OSL_FAIL( "sd::AnnotationManagerImpl::onSelectionChanged(), exception caught!" );
- }
-}
-
-void AnnotationManagerImpl::UpdateTags( bool bSynchron )
-{
- if( bSynchron )
- {
- if( mnUpdateTagsEvent )
- Application::RemoveUserEvent( mnUpdateTagsEvent );
-
- UpdateTagsHdl(0);
- }
- else
- {
- if( !mnUpdateTagsEvent && mxView.is() )
- mnUpdateTagsEvent = Application::PostUserEvent( LINK( this, AnnotationManagerImpl, UpdateTagsHdl ) );
- }
-}
-
-IMPL_LINK(AnnotationManagerImpl,UpdateTagsHdl, void *, EMPTYARG)
-{
- mnUpdateTagsEvent = 0;
- DisposeTags();
-
- if( mbShowAnnotations )
- CreateTags();
-
- if( mrBase.GetDrawView() )
- static_cast< ::sd::View* >( mrBase.GetDrawView() )->updateHandles();
-
- invalidateSlots();
-
- return 0;
-}
-
-void AnnotationManagerImpl::CreateTags()
-{
-
- if( mxCurrentPage.is() && mpDoc ) try
- {
- int nIndex = 1;
- maFont = Application::GetSettings().GetStyleSettings().GetAppFont();
-
- rtl::Reference< AnnotationTag > xSelectedTag;
-
- Reference< XAnnotationEnumeration > xEnum( mxCurrentPage->createAnnotationEnumeration() );
- while( xEnum->hasMoreElements() )
- {
- Reference< XAnnotation > xAnnotation( xEnum->nextElement() );
- Color aColor( GetColorLight( mpDoc->GetAnnotationAuthorIndex( xAnnotation->getAuthor() ) ) );
- rtl::Reference< AnnotationTag > xTag( new AnnotationTag( *this, *mrBase.GetMainViewShell()->GetView(), xAnnotation, aColor, nIndex++, maFont ) );
- maTagVector.push_back(xTag);
-
- if( xAnnotation == mxSelectedAnnotation )
- {
- xSelectedTag = xTag;
- }
- }
-
- if( xSelectedTag.is() )
- {
- SmartTagReference xTag( xSelectedTag.get() );
- mrBase.GetMainViewShell()->GetView()->getSmartTags().select( xTag );
- }
- else
- {
- // no tag, no selection!
- mxSelectedAnnotation.clear();
- }
- }
- catch( Exception& )
- {
- OSL_FAIL( "sd::AnnotationManagerImpl::onSelectionChanged(), exception caught!" );
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::DisposeTags()
-{
- if( !maTagVector.empty() )
- {
- AnnotationTagVector::iterator iter = maTagVector.begin();
- do
- {
- (*iter++)->Dispose();
- }
- while( iter != maTagVector.end() );
-
- maTagVector.clear();
- }
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::addListener()
-{
- Link aLink( LINK(this,AnnotationManagerImpl,EventMultiplexerListener) );
- mrBase.GetEventMultiplexer()->AddEventListener (
- aLink,
- tools::EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION
- | tools::EventMultiplexerEvent::EID_CURRENT_PAGE
- | tools::EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED
- | tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED);
-}
-
-// --------------------------------------------------------------------
-
-void AnnotationManagerImpl::removeListener()
-{
- Link aLink( LINK(this,AnnotationManagerImpl,EventMultiplexerListener) );
- mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
-}
-
-// --------------------------------------------------------------------
-
-IMPL_LINK(AnnotationManagerImpl,EventMultiplexerListener,
- tools::EventMultiplexerEvent*,pEvent)
-{
- switch (pEvent->meEventId)
- {
- case tools::EventMultiplexerEvent::EID_CURRENT_PAGE:
- case tools::EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION:
- onSelectionChanged();
- break;
-
- case tools::EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED:
- mxView = Reference<XDrawView>();
- onSelectionChanged();
- break;
-
- case tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED:
- mxView = Reference<XDrawView>::query( mrBase.GetController() );
- onSelectionChanged();
- break;
- }
- return 0;
-}
-
-void AnnotationManagerImpl::ExecuteAnnotationContextMenu( Reference< XAnnotation > xAnnotation, ::Window* pParent, const Rectangle& rContextRect, bool bButtonMenu /* = false */ )
-{
- SfxDispatcher* pDispatcher( getDispatcher( mrBase ) );
- if( !pDispatcher )
- return;
-
- const bool bReadOnly = mrBase.GetDocShell()->IsReadOnly();
-
- AnnotationWindow* pAnnotationWindow = bButtonMenu ? 0 : dynamic_cast< AnnotationWindow* >( pParent );
-
- if( bReadOnly && !pAnnotationWindow )
- return;
-
- std::auto_ptr< PopupMenu > pMenu( new PopupMenu( SdResId( pAnnotationWindow ? RID_ANNOTATION_CONTEXTMENU : RID_ANNOTATION_TAG_CONTEXTMENU ) ) );
-
- SvtUserOptions aUserOptions;
- OUString sCurrentAuthor( aUserOptions.GetFullName() );
- OUString sAuthor( xAnnotation->getAuthor() );
-
- String aStr( pMenu->GetItemText( SID_DELETEALLBYAUTHOR_POSTIT ) ), aReplace( sAuthor );
- if( aReplace.Len() == 0 )
- aReplace = String( SdResId( STR_ANNOTATION_NOAUTHOR ) );
- aStr.SearchAndReplaceAscii("%1", aReplace);
- pMenu->SetItemText( SID_DELETEALLBYAUTHOR_POSTIT, aStr );
- pMenu->EnableItem( SID_REPLYTO_POSTIT, (sAuthor != sCurrentAuthor) && !bReadOnly );
- pMenu->EnableItem( SID_DELETE_POSTIT, (xAnnotation.is() && !bReadOnly) ? sal_True : sal_False );
- pMenu->EnableItem( SID_DELETEALLBYAUTHOR_POSTIT, !bReadOnly );
- pMenu->EnableItem( SID_DELETEALL_POSTIT, !bReadOnly );
-
- if( pAnnotationWindow )
- {
- if( pAnnotationWindow->IsProtected() || bReadOnly )
- {
- pMenu->EnableItem( SID_ATTR_CHAR_WEIGHT, sal_False );
- pMenu->EnableItem( SID_ATTR_CHAR_POSTURE, sal_False );
- pMenu->EnableItem( SID_ATTR_CHAR_UNDERLINE, sal_False );
- pMenu->EnableItem( SID_ATTR_CHAR_STRIKEOUT, sal_False );
- pMenu->EnableItem( SID_PASTE, sal_False );
- }
- else
- {
- SfxItemSet aSet(pAnnotationWindow->getView()->GetAttribs());
-
- if ( aSet.GetItemState( EE_CHAR_WEIGHT ) == SFX_ITEM_ON )
- {
- if( ((const SvxWeightItem&)aSet.Get( EE_CHAR_WEIGHT )).GetWeight() == WEIGHT_BOLD )
- pMenu->CheckItem( SID_ATTR_CHAR_WEIGHT );
- }
-
- if ( aSet.GetItemState( EE_CHAR_ITALIC ) == SFX_ITEM_ON )
- {
- if( ((const SvxPostureItem&)aSet.Get( EE_CHAR_ITALIC )).GetPosture() != ITALIC_NONE )
- pMenu->CheckItem( SID_ATTR_CHAR_POSTURE );
-
- }
- if ( aSet.GetItemState( EE_CHAR_UNDERLINE ) == SFX_ITEM_ON )
- {
- if( ((const SvxUnderlineItem&)aSet.Get( EE_CHAR_UNDERLINE )).GetLineStyle() != UNDERLINE_NONE )
- pMenu->CheckItem( SID_ATTR_CHAR_UNDERLINE );
- }
-
- if ( aSet.GetItemState( EE_CHAR_STRIKEOUT ) == SFX_ITEM_ON )
- {
- if( ((const SvxCrossedOutItem&)aSet.Get( EE_CHAR_STRIKEOUT )).GetStrikeout() != STRIKEOUT_NONE )
- pMenu->CheckItem( SID_ATTR_CHAR_STRIKEOUT );
- }
- TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pAnnotationWindow ) );
- pMenu->EnableItem( SID_PASTE, aDataHelper.GetFormatCount() != 0 );
- }
-
- pMenu->EnableItem( SID_COPY, pAnnotationWindow->getView()->HasSelection() );
- }
-
- sal_uInt16 nId = 0;
-
- // set slot images
- Reference< ::com::sun::star::frame::XFrame > xFrame( mrBase.GetMainViewShell()->GetViewFrame()->GetFrame().GetFrameInterface() );
- if( xFrame.is() )
- {
- for( sal_uInt16 nPos = 0; nPos < pMenu->GetItemCount(); nPos++ )
- {
- nId = pMenu->GetItemId( nPos );
- if( pMenu->IsItemEnabled( nId ) )
- {
- OUString sSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" ));
- sSlotURL += OUString::valueOf( sal_Int32( nId ));
-
- Image aImage( GetImage( xFrame, sSlotURL, false ) );
- if( !!aImage )
- pMenu->SetItemImage( nId, aImage );
- }
- }
- }
-
- nId = pMenu->Execute( pParent, rContextRect, POPUPMENU_EXECUTE_DOWN|POPUPMENU_NOMOUSEUPCLOSE );
- switch( nId )
- {
- case SID_REPLYTO_POSTIT:
- {
- const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( xAnnotation ) );
- pDispatcher->Execute( SID_REPLYTO_POSTIT, SFX_CALLMODE_ASYNCHRON, &aItem, 0 );
- break;
- }
- case SID_DELETE_POSTIT:
- {
- const SfxUnoAnyItem aItem( SID_DELETE_POSTIT, Any( xAnnotation ) );
- pDispatcher->Execute( SID_DELETE_POSTIT, SFX_CALLMODE_ASYNCHRON, &aItem, 0 );
- break;
- }
- case SID_DELETEALLBYAUTHOR_POSTIT:
- {
- const SfxStringItem aItem( SID_DELETEALLBYAUTHOR_POSTIT, sAuthor );
- pDispatcher->Execute( SID_DELETEALLBYAUTHOR_POSTIT, SFX_CALLMODE_ASYNCHRON, &aItem, 0 );
- break;
- }
- case SID_DELETEALL_POSTIT:
- pDispatcher->Execute( SID_DELETEALL_POSTIT );
- break;
- case SID_COPY:
- case SID_PASTE:
- case SID_ATTR_CHAR_WEIGHT:
- case SID_ATTR_CHAR_POSTURE:
- case SID_ATTR_CHAR_UNDERLINE:
- case SID_ATTR_CHAR_STRIKEOUT:
- if( pAnnotationWindow )
- pAnnotationWindow->ExecuteSlot( nId );
- break;
- }
-}
-
-// ====================================================================
-
-Color AnnotationManagerImpl::GetColor(sal_uInt16 aAuthorIndex)
-{
- if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
- {
- static const Color aArrayNormal[] = {
- COL_AUTHOR1_NORMAL, COL_AUTHOR2_NORMAL, COL_AUTHOR3_NORMAL,
- COL_AUTHOR4_NORMAL, COL_AUTHOR5_NORMAL, COL_AUTHOR6_NORMAL,
- COL_AUTHOR7_NORMAL, COL_AUTHOR8_NORMAL, COL_AUTHOR9_NORMAL };
-
- return Color( aArrayNormal[ aAuthorIndex % (SAL_N_ELEMENTS(aArrayNormal))]);
- }
- else
- return Color(COL_WHITE);
-}
-
-Color AnnotationManagerImpl::GetColorLight(sal_uInt16 aAuthorIndex)
-{
- if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
- {
- static const Color aArrayLight[] = {
- COL_AUTHOR1_LIGHT, COL_AUTHOR2_LIGHT, COL_AUTHOR3_LIGHT,
- COL_AUTHOR4_LIGHT, COL_AUTHOR5_LIGHT, COL_AUTHOR6_LIGHT,
- COL_AUTHOR7_LIGHT, COL_AUTHOR8_LIGHT, COL_AUTHOR9_LIGHT };
-
- return Color( aArrayLight[ aAuthorIndex % (SAL_N_ELEMENTS(aArrayLight))]);
- }
- else
- return Color(COL_WHITE);
-}
-
-Color AnnotationManagerImpl::GetColorDark(sal_uInt16 aAuthorIndex)
-{
- if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
- {
- static const Color aArrayAnkor[] = {
- COL_AUTHOR1_DARK, COL_AUTHOR2_DARK, COL_AUTHOR3_DARK,
- COL_AUTHOR4_DARK, COL_AUTHOR5_DARK, COL_AUTHOR6_DARK,
- COL_AUTHOR7_DARK, COL_AUTHOR8_DARK, COL_AUTHOR9_DARK };
-
- return Color( aArrayAnkor[ aAuthorIndex % (SAL_N_ELEMENTS(aArrayAnkor))]);
- }
- else
- return Color(COL_WHITE);
-}
-
-SdPage* AnnotationManagerImpl::GetNextPage( SdPage* pPage, bool bForeward )
-{
- if( pPage == 0 )
- return bForeward ? GetFirstPage() : GetLastPage();
-
- sal_uInt16 nPageNum = (pPage->GetPageNum() - 1) >> 1;
-
- // first all non master pages
- if( !pPage->IsMasterPage() )
- {
- if( bForeward )
- {
- if( nPageNum >= mpDoc->GetSdPageCount(PK_STANDARD)-1 )
- {
- // we reached end of draw pages, start with master pages (skip handout master for draw)
- return mpDoc->GetMasterSdPage( (mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) ? 0 : 1, PK_STANDARD );
- }
- nPageNum++;
- }
- else
- {
- if( nPageNum == 0 )
- return 0; // we are already on the first draw page, finished
-
- nPageNum--;
- }
- return mpDoc->GetSdPage(nPageNum, PK_STANDARD);
- }
- else
- {
- if( bForeward )
- {
- if( nPageNum >= mpDoc->GetMasterSdPageCount(PK_STANDARD)-1 )
- {
- return 0; // we reached the end, there is nothing more to see here
- }
- nPageNum++;
- }
- else
- {
- if( nPageNum == (mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) ? 0 : 1 )
- {
- // we reached beginning of master pages, start with end if pages
- return mpDoc->GetSdPage( mpDoc->GetSdPageCount(PK_STANDARD)-1, PK_STANDARD );
- }
-
- nPageNum--;
- }
- return mpDoc->GetMasterSdPage(nPageNum,PK_STANDARD);
- }
-}
-
-SdPage* AnnotationManagerImpl::GetFirstPage()
-{
- // return first drawing page
- return mpDoc->GetSdPage(0, PK_STANDARD );
-}
-
-SdPage* AnnotationManagerImpl::GetLastPage()
-{
- return mpDoc->GetMasterSdPage( mpDoc->GetMasterSdPageCount(PK_STANDARD) - 1, PK_STANDARD );
-}
-
-SdPage* AnnotationManagerImpl::GetCurrentPage()
-{
- return mrBase.GetMainViewShell()->getCurrentPage();
-}
-
-// ====================================================================
-
-AnnotationManager::AnnotationManager( ViewShellBase& rViewShellBase )
-: mxImpl( new AnnotationManagerImpl( rViewShellBase ) )
-{
- mxImpl->init();
-}
-
-AnnotationManager::~AnnotationManager()
-{
- mxImpl->dispose();
-}
-
-void AnnotationManager::ExecuteAnnotation(SfxRequest& rRequest)
-{
- mxImpl->ExecuteAnnotation( rRequest );
-}
-
-void AnnotationManager::GetAnnotationState(SfxItemSet& rItemSet)
-{
- mxImpl->GetAnnotationState(rItemSet);
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */