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