1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 #include <sfx2/docfile.hxx>
27 #include <vcl/svapp.hxx>
28 #include <editeng/outliner.hxx>
29 #ifndef _SVXLINK_HXX
30 #include <sfx2/linkmgr.hxx>
31 #endif
32 #include <svx/svdotext.hxx>
33 #include <tools/urlobj.hxx>
34 #include <editeng/outlobj.hxx>
35 #include <svl/urihelper.hxx>
36 #include <editeng/xmlcnitm.hxx>
37 #include <svx/svditer.hxx>
38 #include <tools/list.hxx>
39
40 #include "sdresid.hxx"
41 #include "sdpage.hxx"
42 #include "glob.hxx"
43 #include "glob.hrc"
44 #include "drawdoc.hxx"
45 #include "stlpool.hxx"
46 //#include "sdiocmpt.hxx"
47 #include "pglink.hxx"
48 //#include "strmname.h"
49 #include "anminfo.hxx"
50
51 #include "../ui/inc/strings.hrc"
52 #include "../ui/inc/DrawDocShell.hxx"
53
54 // #90477#
55 #include <tools/tenccvt.hxx>
56 #include <svl/itemset.hxx>
57
58 using namespace ::sd;
59 using namespace ::com::sun::star;
60 using namespace ::com::sun::star::uno;
61 using namespace ::com::sun::star::office;
62
63 extern void NotifyDocumentEvent( SdDrawDocument* pDocument, const rtl::OUString& rEventName, const Reference< XInterface >& xSource );
64
65 /*************************************************************************
66 |*
67 |* SetPresentationLayout, setzt: Layoutnamen, Masterpage-Verkn�pfung und
68 |* Vorlagen fuer Praesentationsobjekte
69 |*
70 |* Vorraussetzungen: - Die Seite muss bereits das richtige Model kennen!
71 |* - Die entsprechende Masterpage muss bereits im Model sein.
72 |* - Die entsprechenden StyleSheets muessen bereits im
73 |* im StyleSheetPool sein.
74 |*
75 |* bReplaceStyleSheets = sal_True : Benannte StyleSheets werden ausgetauscht
76 |* sal_False: Alle StyleSheets werden neu zugewiesen
77 |*
78 |* bSetMasterPage = sal_True : MasterPage suchen und zuweisen
79 |*
80 |* bReverseOrder = sal_False: MasterPages von vorn nach hinten suchen
81 |* sal_True : MasterPages von hinten nach vorn suchen (fuer Undo-Action)
82 |*
83 \************************************************************************/
84
SetPresentationLayout(const String & rLayoutName,sal_Bool bReplaceStyleSheets,sal_Bool bSetMasterPage,sal_Bool bReverseOrder)85 void SdPage::SetPresentationLayout(const String& rLayoutName,
86 sal_Bool bReplaceStyleSheets,
87 sal_Bool bSetMasterPage,
88 sal_Bool bReverseOrder)
89 {
90 /*********************************************************************
91 |* Layoutname der Seite
92 \********************************************************************/
93 String aOldLayoutName(maLayoutName); // merken
94 maLayoutName = rLayoutName;
95 maLayoutName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR ));
96 maLayoutName += String(SdResId(STR_LAYOUT_OUTLINE));
97
98 /*********************************************************************
99 |* ggf. Masterpage suchen und setzen
100 \********************************************************************/
101 if (bSetMasterPage && !IsMasterPage())
102 {
103 SdPage* pMaster;
104 SdPage* pFoundMaster = 0;
105 sal_uInt16 nMaster = 0;
106 sal_uInt16 nMasterCount = pModel->GetMasterPageCount();
107
108 if( !bReverseOrder )
109 {
110 for ( nMaster = 0; nMaster < nMasterCount; nMaster++ )
111 {
112 pMaster = static_cast<SdPage*>(pModel->GetMasterPage(nMaster));
113 if (pMaster->GetPageKind() == mePageKind && pMaster->GetLayoutName() == maLayoutName)
114 {
115 pFoundMaster = pMaster;
116 break;
117 }
118 }
119 }
120 else
121 {
122 for ( nMaster = nMasterCount; nMaster > 0; nMaster-- )
123 {
124 pMaster = static_cast<SdPage*>(pModel->GetMasterPage(nMaster - 1));
125 if (pMaster->GetPageKind() == mePageKind && pMaster->GetLayoutName() == maLayoutName)
126 {
127 pFoundMaster = pMaster;
128 break;
129 }
130 }
131 }
132
133 DBG_ASSERT(pFoundMaster, "Masterpage for presentation layout not found!");
134
135 // this should never happen, but we play failsafe here
136 if( pFoundMaster == 0 )
137 pFoundMaster = static_cast< SdDrawDocument *>(pModel)->GetSdPage( 0, mePageKind );
138
139 if( pFoundMaster )
140 TRG_SetMasterPage(*pFoundMaster);
141 }
142
143 /*********************************************************************
144 |* Vorlagen fuer Praesentationsobjekte
145 \********************************************************************/
146 // Listen mit:
147 // - Vorlagenzeigern fuer Gliederungstextobjekt (alte und neue Vorlagen)
148 // - Replacedaten fuer OutlinerParaObject
149 List aOutlineStyles;
150 List aOldOutlineStyles;
151 List aReplList;
152 sal_Bool bListsFilled = sal_False;
153
154 sal_uLong nObjCount = GetObjCount();
155
156 for (sal_uLong nObj = 0; nObj < nObjCount; nObj++)
157 {
158 SdrTextObj* pObj = (SdrTextObj*) GetObj(nObj);
159
160 if (pObj->GetObjInventor() == SdrInventor &&
161 pObj->GetObjIdentifier() == OBJ_OUTLINETEXT)
162 {
163 if (!bListsFilled || !bReplaceStyleSheets)
164 {
165 String aFullName;
166 String aOldFullName;
167 SfxStyleSheetBase* pSheet = NULL;
168 SfxStyleSheetBasePool* pStShPool = pModel->GetStyleSheetPool();
169
170 for (sal_Int16 i = -1; i < 9; i++)
171 {
172 aFullName = maLayoutName;
173 aOldFullName = aOldLayoutName;
174 aFullName += sal_Unicode( ' ' );
175 aFullName += String::CreateFromInt32( (sal_Int32) (i <= 0 ) ? 1 : i + 1);
176 aOldFullName += sal_Unicode( ' ' );
177 aOldFullName += String::CreateFromInt32( (sal_Int32) (i <= 0 ) ? 1 : i + 1 );
178
179 pSheet = pStShPool->Find(aOldFullName, SD_STYLE_FAMILY_MASTERPAGE);
180 DBG_ASSERT(pSheet, "alte Gliederungsvorlage nicht gefunden");
181 aOldOutlineStyles.Insert(pSheet, LIST_APPEND);
182
183 pSheet = pStShPool->Find(aFullName, SD_STYLE_FAMILY_MASTERPAGE);
184 DBG_ASSERT(pSheet, "neue Gliederungsvorlage nicht gefunden");
185 aOutlineStyles.Insert(pSheet, LIST_APPEND);
186
187 if (bReplaceStyleSheets && pSheet)
188 {
189 // Replace anstatt Set
190 StyleReplaceData* pReplData = new StyleReplaceData;
191 pReplData->nNewFamily = pSheet->GetFamily();
192 pReplData->nFamily = pSheet->GetFamily();
193 pReplData->aNewName = aFullName;
194 pReplData->aName = aOldFullName;
195 aReplList.Insert(pReplData, LIST_APPEND);
196 }
197 else
198 {
199 OutlinerParaObject* pOPO = ((SdrTextObj*)pObj)->GetOutlinerParaObject();
200
201 if( pOPO )
202 pOPO->SetStyleSheets( i, aFullName, SD_STYLE_FAMILY_MASTERPAGE );
203 }
204 }
205
206 bListsFilled = sal_True;
207 }
208
209 SfxStyleSheet* pSheet = (SfxStyleSheet*)aOutlineStyles.First();
210 SfxStyleSheet* pOldSheet = (SfxStyleSheet*)aOldOutlineStyles.First();
211 while (pSheet)
212 {
213 if (pSheet != pOldSheet)
214 {
215 pObj->EndListening(*pOldSheet);
216
217 if (!pObj->IsListening(*pSheet))
218 pObj->StartListening(*pSheet);
219 }
220
221 pSheet = (SfxStyleSheet*)aOutlineStyles.Next();
222 pOldSheet = (SfxStyleSheet*)aOldOutlineStyles.Next();
223 }
224
225 OutlinerParaObject* pOPO = ((SdrTextObj*)pObj)->GetOutlinerParaObject();
226 if ( bReplaceStyleSheets && pOPO )
227 {
228 StyleReplaceData* pReplData = (StyleReplaceData*) aReplList.First();
229
230 while( pReplData )
231 {
232 pOPO->ChangeStyleSheets( pReplData->aName, pReplData->nFamily, pReplData->aNewName, pReplData->nNewFamily );
233 pReplData = (StyleReplaceData*) aReplList.Next();
234 }
235 }
236 }
237 else if (pObj->GetObjInventor() == SdrInventor &&
238 pObj->GetObjIdentifier() == OBJ_TITLETEXT)
239 {
240 // PresObjKind nicht ueber GetPresObjKind() holen, da dort nur
241 // die PresObjListe beruecksichtigt wird. Es sollen aber alle
242 // "Titelobjekte" hier beruecksichtigt werden (Paste aus Clipboard usw.)
243 SfxStyleSheet* pSheet = GetStyleSheetForPresObj(PRESOBJ_TITLE);
244
245 if (pSheet)
246 pObj->SetStyleSheet(pSheet, sal_True);
247 }
248 else
249 {
250 SfxStyleSheet* pSheet = GetStyleSheetForPresObj(GetPresObjKind(pObj));
251
252 if (pSheet)
253 pObj->SetStyleSheet(pSheet, sal_True);
254 }
255 }
256
257 for (sal_uLong i = 0; i < aReplList.Count(); i++)
258 {
259 delete (StyleReplaceData*) aReplList.GetObject(i);
260 }
261 }
262
263
264 /*************************************************************************
265 |* das Gliederungstextobjekt bei den Vorlagen fuer die Gliederungsebenen
266 |* abmelden
267 \************************************************************************/
268
EndListenOutlineText()269 void SdPage::EndListenOutlineText()
270 {
271 SdrObject* pOutlineTextObj = GetPresObj(PRESOBJ_OUTLINE);
272
273 if (pOutlineTextObj)
274 {
275 SdStyleSheetPool* pSPool = (SdStyleSheetPool*)pModel->GetStyleSheetPool();
276 DBG_ASSERT(pSPool, "StyleSheetPool nicht gefunden");
277 String aTrueLayoutName(maLayoutName);
278 aTrueLayoutName.Erase( aTrueLayoutName.SearchAscii( SD_LT_SEPARATOR ));
279 List* pOutlineStyles = pSPool->CreateOutlineSheetList(aTrueLayoutName);
280 for (SfxStyleSheet* pSheet = (SfxStyleSheet*)pOutlineStyles->First();
281 pSheet;
282 pSheet = (SfxStyleSheet*)pOutlineStyles->Next())
283 {
284 pOutlineTextObj->EndListening(*pSheet);
285 }
286
287 delete pOutlineStyles;
288 }
289 }
290
291 /*************************************************************************
292 |* Neues Modell setzen
293 \************************************************************************/
294
SetModel(SdrModel * pNewModel)295 void SdPage::SetModel(SdrModel* pNewModel)
296 {
297 DisconnectLink();
298
299 // Model umsetzen
300 FmFormPage::SetModel(pNewModel);
301
302 ConnectLink();
303 }
304
305 /*************************************************************************
306 |* Ist die Seite read-only?
307 \************************************************************************/
308
IsReadOnly() const309 FASTBOOL SdPage::IsReadOnly() const
310 {
311 return sal_False;
312 }
313
314 /*************************************************************************
315 |* Beim sfx2::LinkManager anmelden
316 \************************************************************************/
317
ConnectLink()318 void SdPage::ConnectLink()
319 {
320 sfx2::LinkManager* pLinkManager = pModel!=NULL ? pModel->GetLinkManager() : NULL;
321
322 if (pLinkManager && !mpPageLink && maFileName.Len() && maBookmarkName.Len() &&
323 mePageKind==PK_STANDARD && !IsMasterPage() &&
324 ( (SdDrawDocument*) pModel)->IsNewOrLoadCompleted())
325 {
326 /**********************************************************************
327 * Anmelden
328 * Nur Standardseiten duerfen gelinkt sein
329 **********************************************************************/
330 ::sd::DrawDocShell* pDocSh = ((SdDrawDocument*) pModel)->GetDocSh();
331
332 if (!pDocSh || pDocSh->GetMedium()->GetOrigURL() != maFileName)
333 {
334 // Keine Links auf Dokument-eigene Seiten!
335 mpPageLink = new SdPageLink(this, maFileName, maBookmarkName);
336 String aFilterName(SdResId(STR_IMPRESS));
337 pLinkManager->InsertFileLink(*mpPageLink, OBJECT_CLIENT_FILE,
338 maFileName, &aFilterName, &maBookmarkName);
339 mpPageLink->Connect();
340 }
341 }
342 }
343
344
345 /*************************************************************************
346 |* Beim sfx2::LinkManager abmelden
347 \************************************************************************/
348
DisconnectLink()349 void SdPage::DisconnectLink()
350 {
351 sfx2::LinkManager* pLinkManager = pModel!=NULL ? pModel->GetLinkManager() : NULL;
352
353 if (pLinkManager && mpPageLink)
354 {
355 /**********************************************************************
356 * Abmelden
357 * (Bei Remove wird *pGraphicLink implizit deleted)
358 **********************************************************************/
359 pLinkManager->Remove(mpPageLink);
360 mpPageLink=NULL;
361 }
362 }
363
364 /*************************************************************************
365 |* Copy-Ctor
366 \************************************************************************/
367
SdPage(const SdPage & rSrcPage)368 SdPage::SdPage(const SdPage& rSrcPage)
369 : FmFormPage(rSrcPage)
370 , SdrObjUserCall()
371 , mpItems(NULL)
372 {
373 mePageKind = rSrcPage.mePageKind;
374 meAutoLayout = rSrcPage.meAutoLayout;
375
376 SdrObject* pObj = 0;
377 while((pObj = rSrcPage.maPresentationShapeList.getNextShape(pObj)) != 0)
378 InsertPresObj(GetObj(pObj->GetOrdNum()), rSrcPage.GetPresObjKind(pObj));
379
380 mbSelected = sal_False;
381 mnTransitionType = rSrcPage.mnTransitionType;
382 mnTransitionSubtype = rSrcPage.mnTransitionSubtype;
383 mbTransitionDirection = rSrcPage.mbTransitionDirection;
384 mnTransitionFadeColor = rSrcPage.mnTransitionFadeColor;
385 mfTransitionDuration = rSrcPage.mfTransitionDuration;
386 mePresChange = rSrcPage.mePresChange;
387 mnTime = rSrcPage.mnTime;
388 mbSoundOn = rSrcPage.mbSoundOn;
389 mbExcluded = rSrcPage.mbExcluded;
390
391 maLayoutName = rSrcPage.maLayoutName;
392 maSoundFile = rSrcPage.maSoundFile;
393 mbLoopSound = rSrcPage.mbLoopSound;
394 mbStopSound = rSrcPage.mbStopSound;
395 maCreatedPageName = String();
396 maFileName = rSrcPage.maFileName;
397 maBookmarkName = rSrcPage.maBookmarkName;
398 mbScaleObjects = rSrcPage.mbScaleObjects;
399 mbBackgroundFullSize = rSrcPage.mbBackgroundFullSize;
400 meCharSet = rSrcPage.meCharSet;
401 mnPaperBin = rSrcPage.mnPaperBin;
402 meOrientation = rSrcPage.meOrientation;
403
404 // header footer
405 setHeaderFooterSettings( rSrcPage.getHeaderFooterSettings() );
406
407 mpPageLink = NULL; // Wird beim Einfuegen ueber ConnectLink() gesetzt
408 }
409
410
411
412 /*************************************************************************
413 |* Clone
414 \************************************************************************/
415
Clone() const416 SdrPage* SdPage::Clone() const
417 {
418 return Clone(NULL);
419 }
420
Clone(SdrModel * pNewModel) const421 SdrPage* SdPage::Clone(SdrModel* pNewModel) const
422 {
423 DBG_ASSERT( pNewModel == 0, "sd::SdPage::Clone(), new page ignored, please check code! CL" );
424 (void)pNewModel;
425
426 SdPage* pNewPage = new SdPage(*this);
427
428 cloneAnimations( *pNewPage );
429
430 // fix user calls for duplicated slide
431 SdrObjListIter aSourceIter( *this, IM_DEEPWITHGROUPS );
432 SdrObjListIter aTargetIter( *pNewPage, IM_DEEPWITHGROUPS );
433
434 while( aSourceIter.IsMore() && aTargetIter.IsMore() )
435 {
436 SdrObject* pSource = aSourceIter.Next();
437 SdrObject* pTarget = aTargetIter.Next();
438
439 if( pSource->GetUserCall() )
440 pTarget->SetUserCall( pNewPage );
441 }
442
443 return pNewPage;
444 }
445
446 /*************************************************************************
447 |* GetTextStyleSheetForObject
448 \************************************************************************/
449
450
GetTextStyleSheetForObject(SdrObject * pObj) const451 SfxStyleSheet* SdPage::GetTextStyleSheetForObject( SdrObject* pObj ) const
452 {
453 const PresObjKind eKind = ((SdPage*)this)->GetPresObjKind(pObj);
454 if( eKind != PRESOBJ_NONE )
455 {
456 return ((SdPage*)this)->GetStyleSheetForPresObj(eKind);
457 }
458
459 return FmFormPage::GetTextStyleSheetForObject( pObj );
460 }
461
getOrCreateItems()462 SfxItemSet* SdPage::getOrCreateItems()
463 {
464 if( mpItems == NULL )
465 mpItems = new SfxItemSet( pModel->GetItemPool(), SDRATTR_XMLATTRIBUTES, SDRATTR_XMLATTRIBUTES );
466
467 return mpItems;
468 }
469
470
setAlienAttributes(const com::sun::star::uno::Any & rAttributes)471 sal_Bool SdPage::setAlienAttributes( const com::sun::star::uno::Any& rAttributes )
472 {
473 SfxItemSet* pSet = getOrCreateItems();
474
475 SvXMLAttrContainerItem aAlienAttributes( SDRATTR_XMLATTRIBUTES );
476 if( aAlienAttributes.PutValue( rAttributes, 0 ) )
477 {
478 pSet->Put( aAlienAttributes );
479 return sal_True;
480 }
481
482 return sal_False;
483 }
484
getAlienAttributes(com::sun::star::uno::Any & rAttributes)485 void SdPage::getAlienAttributes( com::sun::star::uno::Any& rAttributes )
486 {
487 const SfxPoolItem* pItem;
488
489 if( (mpItems == NULL) || ( SFX_ITEM_SET != mpItems->GetItemState( SDRATTR_XMLATTRIBUTES, sal_False, &pItem ) ) )
490 {
491 SvXMLAttrContainerItem aAlienAttributes;
492 aAlienAttributes.QueryValue( rAttributes, 0 );
493 }
494 else
495 {
496 ((SvXMLAttrContainerItem*)pItem)->QueryValue( rAttributes, 0 );
497 }
498 }
499
RemoveEmptyPresentationObjects()500 void SdPage::RemoveEmptyPresentationObjects()
501 {
502 SdrObjListIter aShapeIter( *this, IM_DEEPWITHGROUPS );
503
504 SdrObject* pShape;
505 for( pShape = aShapeIter.Next(); pShape; pShape = aShapeIter.Next() )
506 {
507 if( pShape && pShape->IsEmptyPresObj() )
508 {
509 RemoveObject( pShape->GetOrdNum() );
510 SdrObject::Free( pShape );
511 }
512
513 }
514 }
515
getTransitionType(void) const516 sal_Int16 SdPage::getTransitionType (void) const
517 {
518 return mnTransitionType;
519 }
520
setTransitionType(sal_Int16 nTransitionType)521 void SdPage::setTransitionType( sal_Int16 nTransitionType )
522 {
523 mnTransitionType = nTransitionType;
524 ActionChanged();
525 }
526
getTransitionSubtype(void) const527 sal_Int16 SdPage::getTransitionSubtype (void) const
528 {
529 return mnTransitionSubtype;
530 }
531
setTransitionSubtype(sal_Int16 nTransitionSubtype)532 void SdPage::setTransitionSubtype ( sal_Int16 nTransitionSubtype )
533 {
534 mnTransitionSubtype = nTransitionSubtype;
535 ActionChanged();
536 }
537
getTransitionDirection(void) const538 sal_Bool SdPage::getTransitionDirection (void) const
539 {
540 return mbTransitionDirection;
541 }
542
setTransitionDirection(sal_Bool bTransitionbDirection)543 void SdPage::setTransitionDirection ( sal_Bool bTransitionbDirection )
544 {
545 mbTransitionDirection = bTransitionbDirection;
546 ActionChanged();
547 }
548
getTransitionFadeColor(void) const549 sal_Int32 SdPage::getTransitionFadeColor (void) const
550 {
551 return mnTransitionFadeColor;
552 }
553
setTransitionFadeColor(sal_Int32 nTransitionFadeColor)554 void SdPage::setTransitionFadeColor ( sal_Int32 nTransitionFadeColor )
555 {
556 mnTransitionFadeColor = nTransitionFadeColor;
557 ActionChanged();
558 }
559
getTransitionDuration(void) const560 double SdPage::getTransitionDuration (void) const
561 {
562 return mfTransitionDuration;
563 }
564
setTransitionDuration(double fTranstionDuration)565 void SdPage::setTransitionDuration ( double fTranstionDuration )
566 {
567 mfTransitionDuration = fTranstionDuration;
568 ActionChanged();
569 }
570
571 namespace sd {
572 extern void createAnnotation( Reference< XAnnotation >& xAnnotation, SdPage* pPage );
573 extern SdrUndoAction* CreateUndoInsertOrRemoveAnnotation( const Reference< XAnnotation >& xAnnotation, bool bInsert );
574 }
575
createAnnotation(::com::sun::star::uno::Reference<::com::sun::star::office::XAnnotation> & xAnnotation)576 void SdPage::createAnnotation( ::com::sun::star::uno::Reference< ::com::sun::star::office::XAnnotation >& xAnnotation )
577 {
578 sd::createAnnotation( xAnnotation, this );
579 }
580
addAnnotation(const Reference<XAnnotation> & xAnnotation,int nIndex)581 void SdPage::addAnnotation( const Reference< XAnnotation >& xAnnotation, int nIndex )
582 {
583 if( (nIndex == -1) || (nIndex > (int)maAnnotations.size()) )
584 {
585 maAnnotations.push_back( xAnnotation );
586 }
587 else
588 {
589 maAnnotations.insert( maAnnotations.begin() + nIndex, xAnnotation );
590 }
591
592 if( pModel && pModel->IsUndoEnabled() )
593 {
594 SdrUndoAction* pAction = CreateUndoInsertOrRemoveAnnotation( xAnnotation, true );
595 if( pAction )
596 pModel->AddUndo( pAction );
597 }
598
599 SetChanged();
600
601 if( pModel )
602 {
603 pModel->SetChanged();
604 Reference< XInterface > xSource( xAnnotation, UNO_QUERY );
605 NotifyDocumentEvent( static_cast< SdDrawDocument* >( pModel ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OnAnnotationInserted" ) ), xSource );
606 }
607 }
608
removeAnnotation(const Reference<XAnnotation> & xAnnotation)609 void SdPage::removeAnnotation( const Reference< XAnnotation >& xAnnotation )
610 {
611 if( pModel && pModel->IsUndoEnabled() )
612 {
613 SdrUndoAction* pAction = CreateUndoInsertOrRemoveAnnotation( xAnnotation, false );
614 if( pAction )
615 pModel->AddUndo( pAction );
616 }
617
618 AnnotationVector::iterator iter = std::find( maAnnotations.begin(), maAnnotations.end(), xAnnotation );
619 if( iter != maAnnotations.end() )
620 maAnnotations.erase( iter );
621
622 if( pModel )
623 {
624 pModel->SetChanged();
625 Reference< XInterface > xSource( xAnnotation, UNO_QUERY );
626 NotifyDocumentEvent( static_cast< SdDrawDocument* >( pModel ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OnAnnotationRemoved" ) ), xSource );
627 }
628 }
629
630