xref: /trunk/main/sd/source/ui/unoidl/unomodel.cxx (revision 5b190011)
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 
27 #include <com/sun/star/presentation/XPresentation2.hpp>
28 
29 #include <com/sun/star/lang/DisposedException.hpp>
30 #include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
31 #include <com/sun/star/lang/Locale.hpp>
32 #include <com/sun/star/style/XStyle.hpp>
33 #include <com/sun/star/awt/XDevice.hpp>
34 
35 #include <com/sun/star/embed/Aspects.hpp>
36 #include <com/sun/star/presentation/XPresentation2.hpp>
37 
38 #include <osl/mutex.hxx>
39 #include <comphelper/serviceinfohelper.hxx>
40 
41 #include <comphelper/sequence.hxx>
42 
43 #include <rtl/uuid.h>
44 #include <rtl/memory.h>
45 #include <editeng/unofield.hxx>
46 #include <unomodel.hxx>
47 #include <sfx2/dispatch.hxx>
48 #include <sfx2/bindings.hxx>
49 #include <vcl/svapp.hxx>
50 #include <editeng/UnoForbiddenCharsTable.hxx>
51 #include <svx/svdoutl.hxx>
52 #include <editeng/forbiddencharacterstable.hxx>
53 #include <svx/UnoNamespaceMap.hxx>
54 #include <svx/svdlayer.hxx>
55 #include <svx/svdsob.hxx>
56 #include <svx/unoapi.hxx>
57 #include <svx/unofill.hxx>
58 #include <svx/unopool.hxx>
59 #include <svx/svdorect.hxx>
60 #include <editeng/flditem.hxx>
61 #include <vos/mutex.hxx>
62 #include <toolkit/awt/vclxdevice.hxx>
63 #include <svx/svdpool.hxx>
64 #include <editeng/unolingu.hxx>
65 #include <svx/svdpagv.hxx>
66 #include <svtools/unoimap.hxx>
67 #include <svx/unoshape.hxx>
68 #include <editeng/unonrule.hxx>
69 #include <editeng/eeitem.hxx>
70 
71 // #99870# Support creation of GraphicObjectResolver and EmbeddedObjectResolver
72 #include <svx/xmleohlp.hxx>
73 #include <svx/xmlgrhlp.hxx>
74 #include "DrawDocShell.hxx"
75 #include "ViewShellBase.hxx"
76 #include <UnoDocumentSettings.hxx>
77 
78 #include <drawdoc.hxx>
79 #include <glob.hrc>
80 #include <sdresid.hxx>
81 #include <sdpage.hxx>
82 
83 #include <strings.hrc>
84 #include "unohelp.hxx"
85 #include <unolayer.hxx>
86 #include <unoprnms.hxx>
87 #include <unopage.hxx>
88 #include <unocpres.hxx>
89 #include <unoobj.hxx>
90 #include <stlpool.hxx>
91 #include <unopback.hxx>
92 #include <unokywds.hxx>
93 #include "FrameView.hxx"
94 #include "ClientView.hxx"
95 #include "ViewShell.hxx"
96 #include "app.hrc"
97 #include <vcl/pdfextoutdevdata.hxx>
98 #include <com/sun/star/presentation/AnimationEffect.hpp>
99 #include <com/sun/star/presentation/AnimationSpeed.hpp>
100 #include <com/sun/star/presentation/ClickAction.hpp>
101 #include <tools/urlobj.hxx>
102 #include <svx/sdr/contact/viewobjectcontact.hxx>
103 #include <svx/sdr/contact/viewcontact.hxx>
104 #include <svx/sdr/contact/displayinfo.hxx>
105 
106 #include <com/sun/star/office/XAnnotation.hpp>
107 #include <com/sun/star/office/XAnnotationAccess.hpp>
108 #include <com/sun/star/office/XAnnotationEnumeration.hpp>
109 #include <com/sun/star/geometry/RealPoint2D.hpp>
110 #include <com/sun/star/util/DateTime.hpp>
111 
112 using ::rtl::OUString;
113 
114 #include <drawinglayer/primitive2d/structuretagprimitive2d.hxx>
115 
116 using namespace ::osl;
117 using namespace ::vos;
118 using namespace ::cppu;
119 using namespace ::com::sun::star;
120 
121 extern uno::Reference< uno::XInterface > SdUnoCreatePool( SdDrawDocument* pDrawModel );
122 
123 class SdUnoForbiddenCharsTable : public SvxUnoForbiddenCharsTable,
124 								 public SfxListener
125 {
126 public:
127 	SdUnoForbiddenCharsTable( SdrModel* pModel );
128 	~SdUnoForbiddenCharsTable();
129 
130 	// SfxListener
131 	virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) throw ();
132 protected:
133 	virtual void onChange();
134 
135 private:
136 	SdrModel*	mpModel;
137 };
138 
139 SdUnoForbiddenCharsTable::SdUnoForbiddenCharsTable( SdrModel* pModel )
140 : SvxUnoForbiddenCharsTable( pModel->GetForbiddenCharsTable() ), mpModel( pModel )
141 {
142 	StartListening( *pModel );
143 }
144 
145 void SdUnoForbiddenCharsTable::onChange()
146 {
147 	if( mpModel )
148 	{
149 		mpModel->ReformatAllTextObjects();
150 	}
151 }
152 
153 SdUnoForbiddenCharsTable::~SdUnoForbiddenCharsTable()
154 {
155 	if( mpModel )
156 		EndListening( *mpModel );
157 }
158 
159 void SdUnoForbiddenCharsTable::Notify( SfxBroadcaster&, const SfxHint& rHint ) throw()
160 {
161 	const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint );
162 
163 	if( pSdrHint )
164 	{
165 		if( HINT_MODELCLEARED == pSdrHint->GetKind() )
166 		{
167 			mpModel = NULL;
168 		}
169 	}
170 }
171 
172 ///////////////////////////////////////////////////////////////////////
173 
174 const sal_Int32 WID_MODEL_LANGUAGE = 1;
175 const sal_Int32 WID_MODEL_TABSTOP  = 2;
176 const sal_Int32 WID_MODEL_VISAREA  = 3;
177 const sal_Int32 WID_MODEL_MAPUNIT  = 4;
178 const sal_Int32 WID_MODEL_FORBCHARS= 5;
179 const sal_Int32 WID_MODEL_CONTFOCUS = 6;
180 const sal_Int32 WID_MODEL_DSGNMODE	= 7;
181 const sal_Int32 WID_MODEL_BASICLIBS = 8;
182 const sal_Int32 WID_MODEL_RUNTIMEUID = 9;
183 const sal_Int32 WID_MODEL_BUILDID = 10;
184 const sal_Int32 WID_MODEL_HASVALIDSIGNATURES = 11;
185 const sal_Int32 WID_MODEL_DIALOGLIBS = 12;
186 
187 const SvxItemPropertySet* ImplGetDrawModelPropertySet()
188 {
189 	// Achtung: Der erste Parameter MUSS sortiert vorliegen !!!
190 	const static SfxItemPropertyMapEntry aDrawModelPropertyMap_Impl[] =
191 	{
192 		{ MAP_CHAR_LEN("BuildId"),						WID_MODEL_BUILDID,	&::getCppuType(static_cast< const rtl::OUString * >(0)), 0, 0},
193 		{ MAP_CHAR_LEN(sUNO_Prop_CharLocale),		  	WID_MODEL_LANGUAGE,	&::getCppuType((const lang::Locale*)0),		0,	0},
194 		{ MAP_CHAR_LEN(sUNO_Prop_TabStop),				WID_MODEL_TABSTOP,	&::getCppuType((const sal_Int32*)0),		0,  0},
195 		{ MAP_CHAR_LEN(sUNO_Prop_VisibleArea),			WID_MODEL_VISAREA,	&::getCppuType((const awt::Rectangle*)0),	0,	0},
196 		{ MAP_CHAR_LEN(sUNO_Prop_MapUnit),				WID_MODEL_MAPUNIT,	&::getCppuType((const sal_Int16*)0),		beans::PropertyAttribute::READONLY,	0},
197 		{ MAP_CHAR_LEN(sUNO_Prop_ForbiddenCharacters),	WID_MODEL_FORBCHARS,&::getCppuType((const uno::Reference< i18n::XForbiddenCharacters > *)0), beans::PropertyAttribute::READONLY, 0 },
198 		{ MAP_CHAR_LEN(sUNO_Prop_AutomContFocus ),	WID_MODEL_CONTFOCUS,	&::getBooleanCppuType(),					0,	0},
199 		{ MAP_CHAR_LEN(sUNO_Prop_ApplyFrmDsgnMode),	WID_MODEL_DSGNMODE,		&::getBooleanCppuType(),					0,	0},
200 		{ MAP_CHAR_LEN("BasicLibraries"),				WID_MODEL_BASICLIBS,&::getCppuType((const uno::Reference< script::XLibraryContainer > *)0), beans::PropertyAttribute::READONLY, 0 },
201         { MAP_CHAR_LEN("DialogLibraries"),              WID_MODEL_DIALOGLIBS,   &::getCppuType((const uno::Reference< script::XLibraryContainer > *)0), beans::PropertyAttribute::READONLY, 0 },
202         { MAP_CHAR_LEN(sUNO_Prop_RuntimeUID),           WID_MODEL_RUNTIMEUID,   &::getCppuType(static_cast< const rtl::OUString * >(0)), beans::PropertyAttribute::READONLY, 0 },
203         { MAP_CHAR_LEN(sUNO_Prop_HasValidSignatures),   WID_MODEL_HASVALIDSIGNATURES, &::getCppuType(static_cast< const sal_Bool * >(0)), beans::PropertyAttribute::READONLY, 0 },
204 		{ 0,0,0,0,0,0 }
205 	};
206     static SvxItemPropertySet aDrawModelPropertySet_Impl( aDrawModelPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
207     return &aDrawModelPropertySet_Impl;
208 }
209 
210 // this ctor is used from the DocShell
211 SdXImpressDocument::SdXImpressDocument (::sd::DrawDocShell* pShell, bool bClipBoard ) throw()
212 :	SfxBaseModel( pShell ),
213 	mpDocShell( pShell ),
214     mpDoc( pShell ? pShell->GetDoc() : NULL ),
215 	mbDisposed(false),
216 	mbImpressDoc( pShell && pShell->GetDoc() && pShell->GetDoc()->GetDocumentType() == DOCUMENT_TYPE_IMPRESS ),
217 	mbClipBoard( bClipBoard ),
218 	mpPropSet( ImplGetDrawModelPropertySet() )
219 {
220 	if( mpDoc )
221 	{
222 		StartListening( *mpDoc );
223 	}
224 	else
225 	{
226 		DBG_ERROR("DocShell is invalid");
227 	}
228 }
229 
230 SdXImpressDocument::SdXImpressDocument( SdDrawDocument* pDoc, bool bClipBoard ) throw()
231 :	SfxBaseModel( NULL ),
232 	mpDocShell( NULL ),
233 	mpDoc( pDoc ),
234 	mbDisposed(false),
235 	mbImpressDoc( pDoc && pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS ),
236 	mbClipBoard( bClipBoard ),
237 	mpPropSet( ImplGetDrawModelPropertySet() )
238 {
239 	if( mpDoc )
240 	{
241 		StartListening( *mpDoc );
242 	}
243 	else
244 	{
245 		DBG_ERROR("SdDrawDocument is invalid");
246 	}
247 }
248 
249 /***********************************************************************
250 *                                                                      *
251 ***********************************************************************/
252 SdXImpressDocument::~SdXImpressDocument() throw()
253 {
254 }
255 
256 // uno helper
257 
258 
259 /******************************************************************************
260 * Erzeugt anhand der uebergebennen SdPage eine SdDrawPage. Wurde fuer diese   *
261 * SdPage bereits eine SdDrawPage erzeugt, wird keine neue SdDrawPage erzeug.  *
262 ******************************************************************************/
263 /*
264 uno::Reference< drawing::XDrawPage >  SdXImpressDocument::CreateXDrawPage( SdPage* pPage ) throw()
265 {
266 	DBG_ASSERT(pPage,"SdXImpressDocument::CreateXDrawPage( NULL? )");
267 
268 	uno::Reference< drawing::XDrawPage >  xDrawPage;
269 
270 	if(pPage)
271 	{
272 		xDrawPage = SvxDrawPage::GetPageForSdrPage(pPage);
273 
274 		if(!xDrawPage.is())
275 		{
276 			if(pPage->IsMasterPage())
277 			{
278 				xDrawPage = (presentation::XPresentationPage*)new SdMasterPage( this, pPage );
279 			}
280 			else
281 			{
282 				xDrawPage = (SvxDrawPage*)new SdDrawPage( this, pPage );
283 			}
284 		}
285 	}
286 
287 	return xDrawPage;
288 }
289 */
290 
291 // XInterface
292 uno::Any SAL_CALL SdXImpressDocument::queryInterface( const uno::Type & rType ) throw(uno::RuntimeException)
293 {
294 	uno::Any aAny;
295 
296 	QUERYINT(lang::XServiceInfo);
297 	else QUERYINT(beans::XPropertySet);
298 	else QUERYINT(lang::XMultiServiceFactory);
299 	else QUERYINT(drawing::XDrawPageDuplicator);
300 	else QUERYINT(drawing::XLayerSupplier);
301 	else QUERYINT(drawing::XMasterPagesSupplier);
302 	else QUERYINT(drawing::XDrawPagesSupplier);
303 	else QUERYINT(presentation::XHandoutMasterSupplier);
304 	else QUERYINT(document::XLinkTargetSupplier);
305 	else QUERYINT(style::XStyleFamiliesSupplier);
306 	else QUERYINT(com::sun::star::ucb::XAnyCompareFactory);
307 	else QUERYINT(view::XRenderable);
308 	else if( mbImpressDoc && rType == ITYPE(presentation::XPresentationSupplier) )
309 			aAny <<= uno::Reference< presentation::XPresentationSupplier >(this);
310 	else if( mbImpressDoc && rType == ITYPE(presentation::XCustomPresentationSupplier) )
311 			aAny <<= uno::Reference< presentation::XCustomPresentationSupplier >(this);
312 	else
313 		return SfxBaseModel::queryInterface( rType );
314 
315 	return aAny;
316 }
317 
318 void SAL_CALL SdXImpressDocument::acquire() throw ( )
319 {
320 	SfxBaseModel::acquire();
321 }
322 
323 void SAL_CALL SdXImpressDocument::release() throw ( )
324 {
325     if (osl_decrementInterlockedCount( &m_refCount ) == 0)
326 	{
327         // restore reference count:
328         osl_incrementInterlockedCount( &m_refCount );
329         if(!mbDisposed)
330 		{
331             try
332 			{
333                 dispose();
334             }
335 			catch (uno::RuntimeException const& exc)
336 			{ // don't break throw ()
337                 OSL_ENSURE(
338                     false, OUStringToOString(
339                         exc.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
340                 static_cast<void>(exc);
341             }
342         }
343         SfxBaseModel::release();
344     }
345 }
346 
347 // XUnoTunnel
348 const ::com::sun::star::uno::Sequence< sal_Int8 > & SdXImpressDocument::getUnoTunnelId() throw()
349 {
350     static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = 0;
351     if( !pSeq )
352     {
353         ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() );
354         if( !pSeq )
355         {
356             static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq( 16 );
357             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
358             pSeq = &aSeq;
359         }
360     }
361     return *pSeq;
362 }
363 
364 SdXImpressDocument* SdXImpressDocument::getImplementation( const uno::Reference< uno::XInterface >& xInt )
365 {
366     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUT( xInt, ::com::sun::star::uno::UNO_QUERY );
367     if( xUT.is() )
368         return reinterpret_cast<SdXImpressDocument*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething( SdXImpressDocument::getUnoTunnelId() )));
369     else
370         return NULL;
371 }
372 
373 sal_Int64 SAL_CALL SdXImpressDocument::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rIdentifier ) throw(::com::sun::star::uno::RuntimeException)
374 {
375     if( rIdentifier.getLength() == 16 )
376     {
377         if( (0 == rtl_compareMemory( SdXImpressDocument::getUnoTunnelId().getConstArray(), rIdentifier.getConstArray(), 16 )) )
378             return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
379 
380         if( (0 == rtl_compareMemory( SdrModel::getUnoTunnelImplementationId().getConstArray(), rIdentifier.getConstArray(), 16 )) )
381             return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(mpDoc));
382     }
383 
384     return SfxBaseModel::getSomething( rIdentifier );
385 }
386 
387 // XTypeProvider
388 uno::Sequence< uno::Type > SAL_CALL SdXImpressDocument::getTypes(  ) throw(uno::RuntimeException)
389 {
390 	OGuard aGuard( Application::GetSolarMutex() );
391 
392 	if( maTypeSequence.getLength() == 0 )
393 	{
394 		const uno::Sequence< uno::Type > aBaseTypes( SfxBaseModel::getTypes() );
395 		const sal_Int32 nBaseTypes = aBaseTypes.getLength();
396 		const uno::Type* pBaseTypes = aBaseTypes.getConstArray();
397 
398 		const sal_Int32 nOwnTypes = mbImpressDoc ? 14 : 11;		// !DANGER! Keep this updated!
399 
400 		maTypeSequence.realloc(  nBaseTypes + nOwnTypes );
401 		uno::Type* pTypes = maTypeSequence.getArray();
402 
403 		*pTypes++ = ITYPE(beans::XPropertySet);
404 		*pTypes++ = ITYPE(lang::XServiceInfo);
405 		*pTypes++ = ITYPE(lang::XMultiServiceFactory);
406 		*pTypes++ = ITYPE(drawing::XDrawPageDuplicator);
407 		*pTypes++ = ITYPE(drawing::XLayerSupplier);
408 		*pTypes++ = ITYPE(drawing::XMasterPagesSupplier);
409 		*pTypes++ = ITYPE(drawing::XDrawPagesSupplier);
410 		*pTypes++ = ITYPE(document::XLinkTargetSupplier);
411 		*pTypes++ = ITYPE(style::XStyleFamiliesSupplier);
412 		*pTypes++ = ITYPE(com::sun::star::ucb::XAnyCompareFactory);
413 		*pTypes++ = ITYPE(view::XRenderable);
414 		if( mbImpressDoc )
415 		{
416 			*pTypes++ = ITYPE(presentation::XPresentationSupplier);
417 			*pTypes++ = ITYPE(presentation::XCustomPresentationSupplier);
418 			*pTypes++ = ITYPE(presentation::XHandoutMasterSupplier);
419 		}
420 
421 		for( sal_Int32 nType = 0; nType < nBaseTypes; nType++ )
422 			*pTypes++ = *pBaseTypes++;
423 	}
424 
425 	return maTypeSequence;
426 }
427 
428 uno::Sequence< sal_Int8 > SAL_CALL SdXImpressDocument::getImplementationId(  ) throw(uno::RuntimeException)
429 {
430 	OGuard aGuard( Application::GetSolarMutex() );
431 
432 	static uno::Sequence< sal_Int8 > aId;
433 	if( aId.getLength() == 0 )
434 	{
435 		aId.realloc( 16 );
436 		rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
437 	}
438 	return aId;
439 }
440 
441 /***********************************************************************
442 *                                                                      *
443 ***********************************************************************/
444 void SdXImpressDocument::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
445 {
446 	if( mpDoc )
447 	{
448 		const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint );
449 
450 		if( pSdrHint )
451 		{
452 			if( hasEventListeners() )
453 			{
454 				document::EventObject aEvent;
455 				if( SvxUnoDrawMSFactory::createEvent( mpDoc, pSdrHint, aEvent ) )
456 					notifyEvent( aEvent );
457 			}
458 
459 			if( pSdrHint->GetKind() == HINT_MODELCLEARED )
460 			{
461 				if( mpDoc )
462 					EndListening( *mpDoc );
463 				mpDoc = NULL;
464 				mpDocShell = NULL;
465 			}
466 		}
467 		else
468 		{
469 			const SfxSimpleHint* pSfxHint = PTR_CAST(SfxSimpleHint, &rHint );
470 
471 			// ist unser SdDrawDocument gerade gestorben?
472 			if(pSfxHint && pSfxHint->GetId() == SFX_HINT_DYING)
473 			{
474 				// yup, also schnell ein neues erfragen
475 				if( mpDocShell )
476 				{
477 					SdDrawDocument *pNewDoc = mpDocShell->GetDoc();
478 
479 					// ist ueberhaupt ein neues da?
480 					if( pNewDoc != mpDoc )
481 					{
482 						mpDoc = pNewDoc;
483 						if(mpDoc)
484 							StartListening( *mpDoc );
485 					}
486 				}
487 			}
488 		}
489 	}
490 	SfxBaseModel::Notify( rBC, rHint );
491 }
492 
493 /******************************************************************************
494 *                                                                             *
495 ******************************************************************************/
496 SdPage* SdXImpressDocument::InsertSdPage( sal_uInt16 nPage, sal_Bool bDuplicate ) throw()
497 {
498 	sal_uInt16 nPageCount = mpDoc->GetSdPageCount( PK_STANDARD );
499 	SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin();
500 	sal_uInt8 aBckgrnd = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), sal_False);
501 	sal_uInt8 aBckgrndObj = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), sal_False);
502 
503 	SdPage* pStandardPage = NULL;
504 
505 	if( 0 == nPageCount )
506 	{
507 		// this is only used for clipboard where we only have one page
508 		pStandardPage = (SdPage*) mpDoc->AllocPage(sal_False);
509 
510 		Size aDefSize(21000, 29700);   // A4-Hochformat
511 		pStandardPage->SetSize( aDefSize );
512 		mpDoc->InsertPage(pStandardPage, 0);
513 	}
514 	else
515 	{
516 		// Hier wird die Seite ermittelt, hinter der eingefuegt werden soll
517 		SdPage* pPreviousStandardPage = mpDoc->GetSdPage( Min( (sal_uInt16)(nPageCount - 1), nPage ), PK_STANDARD );
518 		SetOfByte aVisibleLayers = pPreviousStandardPage->TRG_GetMasterPageVisibleLayers();
519 		sal_Bool bIsPageBack = aVisibleLayers.IsSet( aBckgrnd );
520 		sal_Bool bIsPageObj = aVisibleLayers.IsSet( aBckgrndObj );
521 
522 		// AutoLayouts muessen fertig sein
523 		mpDoc->StopWorkStartupDelay();
524 
525 		/**************************************************************
526 		* Es wird stets zuerst eine Standardseite und dann eine
527 		* Notizseite erzeugt. Es ist sichergestellt, dass auf eine
528 		* Standardseite stets die zugehoerige Notizseite folgt.
529 		**************************************************************/
530 
531 		sal_uInt16 nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2;
532 		SdPage* pPreviousNotesPage = (SdPage*) mpDoc->GetPage( nStandardPageNum - 1 );
533 		sal_uInt16 nNotesPageNum = nStandardPageNum + 1;
534 		String aStandardPageName;
535 		String aNotesPageName;
536 
537 		/**************************************************************
538 		* Standardseite
539 		**************************************************************/
540 		if( bDuplicate )
541 			pStandardPage = (SdPage*) pPreviousStandardPage->Clone();
542 		else
543 			pStandardPage = (SdPage*) mpDoc->AllocPage(sal_False);
544 
545 		pStandardPage->SetSize( pPreviousStandardPage->GetSize() );
546 		pStandardPage->SetBorder( pPreviousStandardPage->GetLftBorder(),
547 									pPreviousStandardPage->GetUppBorder(),
548 									pPreviousStandardPage->GetRgtBorder(),
549 									pPreviousStandardPage->GetLwrBorder() );
550 		pStandardPage->SetOrientation( pPreviousStandardPage->GetOrientation() );
551 		pStandardPage->SetName(aStandardPageName);
552 
553 		// Seite hinter aktueller Seite einfuegen
554 		mpDoc->InsertPage(pStandardPage, nStandardPageNum);
555 
556 		if( !bDuplicate )
557 		{
558 			// MasterPage der aktuellen Seite verwenden
559 			pStandardPage->TRG_SetMasterPage(pPreviousStandardPage->TRG_GetMasterPage());
560 			pStandardPage->SetLayoutName( pPreviousStandardPage->GetLayoutName() );
561 			pStandardPage->SetAutoLayout(AUTOLAYOUT_NONE, sal_True );
562 		}
563 
564 		aBckgrnd = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), sal_False);
565 		aBckgrndObj = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), sal_False);
566 		aVisibleLayers.Set(aBckgrnd, bIsPageBack);
567 		aVisibleLayers.Set(aBckgrndObj, bIsPageObj);
568 		pStandardPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
569 
570 		/**************************************************************
571 		* Notizseite
572 		**************************************************************/
573 		SdPage* pNotesPage = NULL;
574 
575 		if( bDuplicate )
576 			pNotesPage = (SdPage*) pPreviousNotesPage->Clone();
577 		else
578 			pNotesPage = (SdPage*) mpDoc->AllocPage(sal_False);
579 
580 		pNotesPage->SetSize( pPreviousNotesPage->GetSize() );
581 		pNotesPage->SetBorder( pPreviousNotesPage->GetLftBorder(),
582 								pPreviousNotesPage->GetUppBorder(),
583 								pPreviousNotesPage->GetRgtBorder(),
584 								pPreviousNotesPage->GetLwrBorder() );
585 		pNotesPage->SetOrientation( pPreviousNotesPage->GetOrientation() );
586 		pNotesPage->SetName(aNotesPageName);
587 		pNotesPage->SetPageKind(PK_NOTES);
588 
589 		// Seite hinter aktueller Seite einfuegen
590 		mpDoc->InsertPage(pNotesPage, nNotesPageNum);
591 
592 		if( !bDuplicate )
593 		{
594 			// MasterPage der aktuellen Seite verwenden
595 			pNotesPage->TRG_SetMasterPage(pPreviousNotesPage->TRG_GetMasterPage());
596 			pNotesPage->SetLayoutName( pPreviousNotesPage->GetLayoutName() );
597 			pNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, sal_True );
598 		}
599 	}
600 
601 	SetModified();
602 
603 	return( pStandardPage );
604 }
605 
606 void SdXImpressDocument::SetModified( sal_Bool bModified /* = sal_True */ ) throw()
607 {
608 	if( mpDoc )
609 		mpDoc->SetChanged( bModified );
610 }
611 
612 // XModel
613 void SAL_CALL SdXImpressDocument	::lockControllers(  )
614 	throw(uno::RuntimeException)
615 {
616 	OGuard aGuard( Application::GetSolarMutex() );
617 
618 	if( NULL == mpDoc )
619 		throw lang::DisposedException();
620 
621 	mpDoc->setLock( sal_True );
622 }
623 
624 void SAL_CALL SdXImpressDocument::unlockControllers(  )
625 	throw(uno::RuntimeException)
626 {
627 	OGuard aGuard( Application::GetSolarMutex() );
628 
629 	if( NULL == mpDoc )
630 		throw lang::DisposedException();
631 
632 	if( mpDoc->isLocked() )
633 	{
634 		mpDoc->setLock( sal_False );
635 	}
636 }
637 
638 sal_Bool SAL_CALL SdXImpressDocument::hasControllersLocked(  )
639 	throw(uno::RuntimeException)
640 {
641 	OGuard aGuard( Application::GetSolarMutex() );
642 
643 	if( NULL == mpDoc )
644 		throw lang::DisposedException();
645 
646 	return mpDoc && mpDoc->isLocked();
647 }
648 
649 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
650 #include <comphelper/processfactory.hxx>
651 #endif
652 
653 uno::Reference < container::XIndexAccess > SAL_CALL SdXImpressDocument::getViewData() throw( uno::RuntimeException )
654 {
655 	OGuard aGuard( Application::GetSolarMutex() );
656 
657 	if( NULL == mpDoc )
658 		throw lang::DisposedException();
659 
660 	uno::Reference < container::XIndexAccess > xRet( SfxBaseModel::getViewData() );
661 
662 	if( !xRet.is() )
663 	{
664 		List* pFrameViewList = mpDoc->GetFrameViewList();
665 
666 		if( pFrameViewList && pFrameViewList->Count() )
667 		{
668 			xRet = uno::Reference < container::XIndexAccess >::query(::comphelper::getProcessServiceFactory()->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.IndexedPropertyValues"))));
669 
670 
671 			uno::Reference < container::XIndexContainer > xCont( xRet, uno::UNO_QUERY );
672 			DBG_ASSERT( xCont.is(), "SdXImpressDocument::getViewData() failed for OLE object" );
673 			if( xCont.is() )
674 			{
675 				sal_uInt32 i;
676 				for( i = 0; i < pFrameViewList->Count(); i++ )
677 				{
678 					::sd::FrameView* pFrameView =
679                           static_cast< ::sd::FrameView*>(
680                               pFrameViewList->GetObject(i));
681 
682 					if(pFrameView)
683 					{
684 						uno::Sequence< beans::PropertyValue > aSeq;
685 						pFrameView->WriteUserDataSequence( aSeq );
686 						xCont->insertByIndex( i, uno::makeAny( aSeq ) );
687 					}
688 				}
689 			}
690 		}
691 	}
692 
693 	return xRet;
694 }
695 
696 void SAL_CALL SdXImpressDocument::setViewData( const uno::Reference < container::XIndexAccess >& xData ) throw(::com::sun::star::uno::RuntimeException)
697 {
698 	OGuard aGuard( Application::GetSolarMutex() );
699 
700 	if( NULL == mpDoc )
701 		throw lang::DisposedException();
702 
703 	SfxBaseModel::setViewData( xData );
704 	if( mpDocShell && (mpDocShell->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED) && xData.is() )
705 	{
706 		const sal_Int32 nCount = xData->getCount();
707 
708 		List* pFrameViewList = mpDoc->GetFrameViewList();
709 
710 		DBG_ASSERT( pFrameViewList, "No FrameViewList?" );
711 		if( pFrameViewList )
712 		{
713 			::sd::FrameView* pFrameView;
714 
715 			sal_uInt32 i;
716 			for ( i = 0; i < pFrameViewList->Count(); i++)
717 			{
718 				// Ggf. FrameViews loeschen
719 				pFrameView = static_cast< ::sd::FrameView*>(
720                     pFrameViewList->GetObject(i));
721 
722 				if (pFrameView)
723 					delete pFrameView;
724 			}
725 
726 			pFrameViewList->Clear();
727 
728 			uno::Sequence< beans::PropertyValue > aSeq;
729 			sal_Int32 nIndex;
730 			for( nIndex = 0; nIndex < nCount; nIndex++ )
731 			{
732 				if( xData->getByIndex( nIndex ) >>= aSeq )
733 				{
734 					pFrameView = new ::sd::FrameView( mpDoc );
735 					pFrameView->ReadUserDataSequence( aSeq );
736 					pFrameViewList->Insert( pFrameView );
737 				}
738 			}
739 		}
740 	}
741 }
742 
743 // XDrawPageDuplicator
744 uno::Reference< drawing::XDrawPage > SAL_CALL SdXImpressDocument::duplicate( const uno::Reference< drawing::XDrawPage >& xPage )
745 	throw(uno::RuntimeException)
746 {
747 	OGuard aGuard( Application::GetSolarMutex() );
748 
749 	if( NULL == mpDoc )
750 		throw lang::DisposedException();
751 
752 	// pPage von xPage besorgen und dann die Id (nPos )ermitteln
753 	SvxDrawPage* pSvxPage = SvxDrawPage::getImplementation( xPage );
754 	if( pSvxPage )
755 	{
756 		SdPage* pPage = (SdPage*) pSvxPage->GetSdrPage();
757 		sal_uInt16 nPos = pPage->GetPageNum();
758 		nPos = ( nPos - 1 ) / 2;
759 		pPage = InsertSdPage( nPos, sal_True );
760 		if( pPage )
761 		{
762 			uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
763 			return xDrawPage;
764 		}
765 	}
766 
767 	uno::Reference< drawing::XDrawPage > xDrawPage;
768 	return xDrawPage;
769 }
770 
771 
772 // XDrawPagesSupplier
773 uno::Reference< drawing::XDrawPages > SAL_CALL SdXImpressDocument::getDrawPages()
774 	throw(uno::RuntimeException)
775 {
776 	OGuard aGuard( Application::GetSolarMutex() );
777 
778 	if( NULL == mpDoc )
779 		throw lang::DisposedException();
780 
781 	uno::Reference< drawing::XDrawPages >  xDrawPages( mxDrawPagesAccess );
782 
783 	if( !xDrawPages.is() )
784 	{
785 		initializeDocument();
786 		mxDrawPagesAccess = xDrawPages = (drawing::XDrawPages*)new SdDrawPagesAccess(*this);
787 	}
788 
789 	return xDrawPages;
790 }
791 
792 // XMasterPagesSupplier
793 uno::Reference< drawing::XDrawPages > SAL_CALL SdXImpressDocument::getMasterPages()
794 	throw(uno::RuntimeException)
795 {
796 	OGuard aGuard( Application::GetSolarMutex() );
797 
798 	if( NULL == mpDoc )
799 		throw lang::DisposedException();
800 
801 	uno::Reference< drawing::XDrawPages >  xMasterPages( mxMasterPagesAccess );
802 
803 	if( !xMasterPages.is() )
804 	{
805 		initializeDocument();
806 		mxMasterPagesAccess = xMasterPages = new SdMasterPagesAccess(*this);
807 	}
808 
809 	return xMasterPages;
810 }
811 
812 // XLayerManagerSupplier
813 uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getLayerManager(  )
814 	throw(uno::RuntimeException)
815 {
816 	OGuard aGuard( Application::GetSolarMutex() );
817 
818 	if( NULL == mpDoc )
819 		throw lang::DisposedException();
820 
821 	uno::Reference< container::XNameAccess >  xLayerManager( mxLayerManager );
822 
823 	if( !xLayerManager.is() )
824 		mxLayerManager = xLayerManager = new SdLayerManager(*this);
825 
826 	return xLayerManager;
827 }
828 
829 // XCustomPresentationSupplier
830 uno::Reference< container::XNameContainer > SAL_CALL SdXImpressDocument::getCustomPresentations()
831 	throw(uno::RuntimeException)
832 {
833 	OGuard aGuard( Application::GetSolarMutex() );
834 
835 	if( NULL == mpDoc )
836 		throw lang::DisposedException();
837 
838 	uno::Reference< container::XNameContainer >  xCustomPres( mxCustomPresentationAccess );
839 
840 	if( !xCustomPres.is() )
841 		mxCustomPresentationAccess = xCustomPres = new SdXCustomPresentationAccess(*this);
842 
843 	return xCustomPres;
844 }
845 
846 extern uno::Reference< presentation::XPresentation > createPresentation( SdXImpressDocument& rModel );
847 
848 // XPresentationSupplier
849 uno::Reference< presentation::XPresentation > SAL_CALL SdXImpressDocument::getPresentation()
850 	throw(uno::RuntimeException)
851 {
852 	OGuard aGuard( Application::GetSolarMutex() );
853 
854 	if( NULL == mpDoc )
855 		throw lang::DisposedException();
856 
857 	return uno::Reference< presentation::XPresentation >( mpDoc->getPresentation().get() );
858 }
859 
860 // XHandoutMasterSupplier
861 uno::Reference< drawing::XDrawPage > SAL_CALL SdXImpressDocument::getHandoutMasterPage()
862 	throw (uno::RuntimeException)
863 {
864 	OGuard aGuard( Application::GetSolarMutex() );
865 
866 	if( NULL == mpDoc )
867 		throw lang::DisposedException();
868 
869 	uno::Reference< drawing::XDrawPage > xPage;
870 
871 	if( mpDoc )
872 	{
873 		initializeDocument();
874 		SdPage* pPage = mpDoc->GetMasterSdPage( 0, PK_HANDOUT );
875 		if( pPage )
876 			xPage = uno::Reference< drawing::XDrawPage >::query( pPage->getUnoPage() );
877 	}
878 	return xPage;
879 }
880 
881 // XMultiServiceFactory ( SvxFmMSFactory )
882 uno::Reference< uno::XInterface > SAL_CALL SdXImpressDocument::createInstance( const OUString& aServiceSpecifier )
883 	throw(uno::Exception, uno::RuntimeException)
884 {
885 	OGuard aGuard( Application::GetSolarMutex() );
886 
887 	if( NULL == mpDoc )
888 		throw lang::DisposedException();
889 
890 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.DashTable") ) )
891 	{
892 		if( !mxDashTable.is() )
893 			mxDashTable = SvxUnoDashTable_createInstance( mpDoc );
894 
895 		return mxDashTable;
896 	}
897 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.GradientTable") ) )
898 	{
899 		if( !mxGradientTable.is() )
900 			mxGradientTable = SvxUnoGradientTable_createInstance( mpDoc );
901 
902 		return mxGradientTable;
903 	}
904 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.HatchTable") ) )
905 	{
906 		if( !mxHatchTable.is() )
907 			mxHatchTable = SvxUnoHatchTable_createInstance( mpDoc );
908 
909 		return mxHatchTable;
910 	}
911 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.BitmapTable") ) )
912 	{
913 		if( !mxBitmapTable.is() )
914 			mxBitmapTable = SvxUnoBitmapTable_createInstance( mpDoc );
915 
916 		return mxBitmapTable;
917 	}
918 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.TransparencyGradientTable") ) )
919 	{
920 		if( !mxTransGradientTable.is() )
921 			mxTransGradientTable = SvxUnoTransGradientTable_createInstance( mpDoc );
922 
923 		return mxTransGradientTable;
924 	}
925 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.MarkerTable") ) )
926 	{
927 		if( !mxMarkerTable.is() )
928 			mxMarkerTable = SvxUnoMarkerTable_createInstance( mpDoc );
929 
930 		return mxMarkerTable;
931 	}
932 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.NumberingRules" ) ) )
933 	{
934 		return uno::Reference< uno::XInterface >( SvxCreateNumRule( mpDoc ), uno::UNO_QUERY );
935 	}
936 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.Background" ) ) )
937 	{
938 		return uno::Reference< uno::XInterface >(
939             static_cast<uno::XWeak*>(new SdUnoPageBackground( mpDoc )));
940 	}
941 
942 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.Defaults") ) )
943 	{
944 		if( !mxDrawingPool.is() )
945 			mxDrawingPool = SdUnoCreatePool( mpDoc );
946 
947 		return mxDrawingPool;
948 
949 	}
950 
951 	if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_Service_ImageMapRectangleObject) ) )
952 	{
953 		return SvUnoImageMapRectangleObject_createInstance( ImplGetSupportedMacroItems() );
954 	}
955 
956 	if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_Service_ImageMapCircleObject) ) )
957 	{
958 		return SvUnoImageMapCircleObject_createInstance( ImplGetSupportedMacroItems() );
959 	}
960 
961 	if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_Service_ImageMapPolygonObject) ) )
962 	{
963 		return SvUnoImageMapPolygonObject_createInstance( ImplGetSupportedMacroItems() );
964 	}
965 
966 	if( ( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.document.Settings") ) ) ||
967 		( !mbImpressDoc && ( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.DocumentSettings") ) ) ) ||
968 		( mbImpressDoc && ( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.DocumentSettings") ) ) ) )
969 	{
970 		return sd::DocumentSettings_createInstance( this );
971 	}
972 
973 	if( ( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextField.DateTime") ) ) ||
974 	    ( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.textfield.DateTime") ) ) )
975 	{
976 		return (::cppu::OWeakObject * )new SvxUnoTextField( ID_EXT_DATEFIELD );
977 	}
978 
979 	if( (0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.TextField.Header"))) ||
980 	    (0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.textfield.Header"))) )
981 	{
982 		return (::cppu::OWeakObject * )new SvxUnoTextField( ID_HEADERFIELD );
983 	}
984 
985 	if( (0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.TextField.Footer"))) ||
986 	    (0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.textfield.Footer"))) )
987 	{
988 		return (::cppu::OWeakObject * )new SvxUnoTextField( ID_FOOTERFIELD );
989 	}
990 
991 	if( (0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.TextField.DateTime"))) ||
992 	    (0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.textfield.DateTime"))) )
993 	{
994 		return (::cppu::OWeakObject * )new SvxUnoTextField( ID_DATETIMEFIELD );
995 	}
996 
997 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.xml.NamespaceMap") ) )
998 	{
999 		static sal_uInt16 aWhichIds[] = { SDRATTR_XMLATTRIBUTES, EE_CHAR_XMLATTRIBS, EE_PARA_XMLATTRIBS, 0 };
1000 
1001 		return svx::NamespaceMap_createInstance( aWhichIds, &mpDoc->GetItemPool() );
1002 	}
1003 
1004 	// #99870# Support creation of GraphicObjectResolver and EmbeddedObjectResolver
1005 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.document.ExportGraphicObjectResolver") ) )
1006 	{
1007 		return (::cppu::OWeakObject * )new SvXMLGraphicHelper( GRAPHICHELPER_MODE_WRITE );
1008 	}
1009 
1010 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.document.ImportGraphicObjectResolver") ) )
1011 	{
1012 		return (::cppu::OWeakObject * )new SvXMLGraphicHelper( GRAPHICHELPER_MODE_READ );
1013 	}
1014 
1015 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.document.ExportEmbeddedObjectResolver") ) )
1016 	{
1017         ::comphelper::IEmbeddedHelper *pPersist = mpDoc ? mpDoc->GetPersist() : NULL;
1018 		if( NULL == pPersist )
1019 			throw lang::DisposedException();
1020 
1021 		return (::cppu::OWeakObject * )new SvXMLEmbeddedObjectHelper( *pPersist, EMBEDDEDOBJECTHELPER_MODE_WRITE );
1022 	}
1023 
1024 	if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.document.ImportEmbeddedObjectResolver") ) )
1025 	{
1026         ::comphelper::IEmbeddedHelper *pPersist = mpDoc ? mpDoc->GetPersist() : NULL;
1027 		if( NULL == pPersist )
1028 			throw lang::DisposedException();
1029 
1030 		return (::cppu::OWeakObject * )new SvXMLEmbeddedObjectHelper( *pPersist, EMBEDDEDOBJECTHELPER_MODE_READ );
1031     }
1032 
1033 	uno::Reference< uno::XInterface > xRet;
1034 
1035 	const String aType( aServiceSpecifier );
1036 	if( aType.EqualsAscii( "com.sun.star.presentation.", 0, 26 ) )
1037 	{
1038 		SvxShape* pShape = NULL;
1039 
1040 		sal_uInt16 nType = OBJ_TEXT;
1041 		// create a shape wrapper
1042 		if( aType.EqualsAscii( "TitleTextShape", 26, 14 ) )
1043 		{
1044 			nType = OBJ_TEXT;
1045 		}
1046 		else if( aType.EqualsAscii( "OutlinerShape", 26, 13 ) )
1047 		{
1048 			nType = OBJ_TEXT;
1049 		}
1050 		else if( aType.EqualsAscii( "SubtitleShape", 26, 13 ) )
1051 		{
1052 			nType = OBJ_TEXT;
1053 		}
1054 		else if( aType.EqualsAscii( "GraphicObjectShape", 26, 18 ) )
1055 		{
1056 			nType = OBJ_GRAF;
1057 		}
1058 		else if( aType.EqualsAscii( "PageShape", 26, 9 ) )
1059 		{
1060 			nType = OBJ_PAGE;
1061 		}
1062 		else if( aType.EqualsAscii( "OLE2Shape", 26, 9 ) )
1063 		{
1064 			nType = OBJ_OLE2;
1065 		}
1066 		else if( aType.EqualsAscii( "ChartShape", 26, 10 ) )
1067 		{
1068 			nType = OBJ_OLE2;
1069 		}
1070 		else if( aType.EqualsAscii( "CalcShape", 26, 9 ) )
1071 		{
1072 			nType = OBJ_OLE2;
1073 		}
1074 		else if( aType.EqualsAscii( "TableShape", 26, 10 ) )
1075 		{
1076 			nType = OBJ_TABLE;
1077 		}
1078 		else if( aType.EqualsAscii( "OrgChartShape", 26, 13 ) )
1079 		{
1080 			nType = OBJ_OLE2;
1081 		}
1082 		else if( aType.EqualsAscii( "NotesShape", 26, 13 ) )
1083 		{
1084 			nType = OBJ_TEXT;
1085 		}
1086 		else if( aType.EqualsAscii( "HandoutShape", 26, 13 ) )
1087 		{
1088 			nType = OBJ_PAGE;
1089 		}
1090 		else if( aType.EqualsAscii( "FooterShape", 26, 12 ) )
1091 		{
1092 			nType = OBJ_TEXT;
1093 		}
1094 		else if( aType.EqualsAscii( "HeaderShape", 26, 12 ) )
1095 		{
1096 			nType = OBJ_TEXT;
1097 		}
1098 		else if( aType.EqualsAscii( "SlideNumberShape", 26, 17 ) )
1099 		{
1100 			nType = OBJ_TEXT;
1101 		}
1102 		else if( aType.EqualsAscii( "DateTimeShape", 26, 17 ) )
1103 		{
1104 			nType = OBJ_TEXT;
1105 		}
1106 		else if( aType.EqualsAscii( "MediaShape", 26, 10 ) )
1107 		{
1108 			nType = OBJ_MEDIA;
1109 		}
1110 		else
1111 		{
1112 			throw lang::ServiceNotRegisteredException();
1113 		}
1114 
1115 		// create the API wrapper
1116 		pShape = CreateSvxShapeByTypeAndInventor( nType, SdrInventor );
1117 
1118 		// set shape type
1119 		if( pShape && !mbClipBoard )
1120 			pShape->SetShapeType(aServiceSpecifier);
1121 
1122 		xRet = (uno::XWeak*)pShape;
1123 	}
1124 	else if( aServiceSpecifier.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.TableShape") ) )
1125 	{
1126 		SvxShape* pShape = CreateSvxShapeByTypeAndInventor( OBJ_TABLE, SdrInventor );
1127 		if( pShape && !mbClipBoard )
1128 			pShape->SetShapeType(aServiceSpecifier);
1129 
1130 		xRet = (uno::XWeak*)pShape;
1131 	}
1132 	else
1133 	{
1134 		xRet = SvxFmMSFactory::createInstance( aServiceSpecifier );
1135 	}
1136 
1137 	uno::Reference< drawing::XShape > xShape( xRet, uno::UNO_QUERY );
1138 	if( xShape.is() )
1139 	{
1140 		xRet.clear();
1141 		new SdXShape( SvxShape::getImplementation( xShape ), (SdXImpressDocument*)this );
1142 		xRet = xShape;
1143 		xShape.clear();
1144 	}
1145 
1146 	return xRet;
1147 }
1148 
1149 uno::Sequence< OUString > SAL_CALL SdXImpressDocument::getAvailableServiceNames()
1150 	throw(uno::RuntimeException)
1151 {
1152 	OGuard aGuard( Application::GetSolarMutex() );
1153 
1154 	if( NULL == mpDoc )
1155 		throw lang::DisposedException();
1156 
1157 	const uno::Sequence< OUString > aSNS_ORG( SvxFmMSFactory::getAvailableServiceNames() );
1158 
1159 	uno::Sequence< OUString > aSNS( mbImpressDoc ? (36) : (19) );
1160 
1161 	sal_uInt16 i(0);
1162 
1163 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DashTable"));
1164 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.GradientTable"));
1165 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.HatchTable"));
1166 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.BitmapTable"));
1167 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.TransparencyGradientTable"));
1168 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.MarkerTable"));
1169 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.NumberingRules"));
1170 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.Background"));
1171 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.Settings"));
1172 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_Service_ImageMapRectangleObject));
1173 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_Service_ImageMapCircleObject));
1174 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_Service_ImageMapPolygonObject));
1175 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.NamespaceMap"));
1176 
1177 	// #99870# Support creation of GraphicObjectResolver and EmbeddedObjectResolver
1178 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ExportGraphicObjectResolver"));
1179 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ImportGraphicObjectResolver"));
1180 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ExportEmbeddedObjectResolver"));
1181 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ImportEmbeddedObjectResolver"));
1182 	aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.TableShape"));
1183 
1184 	if(mbImpressDoc)
1185 	{
1186 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TitleTextShape"));
1187 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OutlinerShape"));
1188 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.SubtitleShape"));
1189 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.GraphicObjectShape"));
1190 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.ChartShape"));
1191 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PageShape"));
1192 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OLE2Shape"));
1193 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TableShape"));
1194 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OrgChartShape"));
1195 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.NotesShape"));
1196 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.HandoutShape"));
1197 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.DocumentSettings"));
1198 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.FooterShape"));
1199 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.HeaderShape"));
1200 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.SlideNumberShape"));
1201 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.DateTimeShape"));
1202 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.CalcShape"));
1203 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.MediaShape"));
1204 	}
1205 	else
1206 	{
1207 		aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DocumentSettings"));
1208 	}
1209 
1210 	DBG_ASSERT( i == aSNS.getLength(), "Sequence overrun!" );
1211 
1212 	return comphelper::concatSequences( aSNS_ORG, aSNS );
1213 }
1214 
1215 // lang::XServiceInfo
1216 OUString SAL_CALL SdXImpressDocument::getImplementationName()
1217 	throw(uno::RuntimeException)
1218 {
1219 	return OUString( RTL_CONSTASCII_USTRINGPARAM("SdXImpressDocument"));
1220 }
1221 
1222 sal_Bool SAL_CALL SdXImpressDocument::supportsService( const OUString& ServiceName )
1223 	throw(uno::RuntimeException)
1224 {
1225 	OGuard aGuard( Application::GetSolarMutex() );
1226 
1227     if (
1228         (ServiceName.equalsAscii("com.sun.star.document.OfficeDocument"       )) ||
1229         (ServiceName.equalsAscii("com.sun.star.drawing.GenericDrawingDocument")) ||
1230         (ServiceName.equalsAscii("com.sun.star.drawing.DrawingDocumentFactory"))
1231        )
1232     {
1233         return sal_True;
1234     }
1235 
1236     return (
1237             ( mbImpressDoc && ServiceName.equalsAscii("com.sun.star.presentation.PresentationDocument")) ||
1238             (!mbImpressDoc && ServiceName.equalsAscii("com.sun.star.drawing.DrawingDocument"          ))
1239            );
1240 }
1241 
1242 uno::Sequence< OUString > SAL_CALL SdXImpressDocument::getSupportedServiceNames() throw(uno::RuntimeException)
1243 {
1244 	OGuard aGuard( Application::GetSolarMutex() );
1245 
1246 	uno::Sequence< OUString > aSeq( 4 );
1247 	OUString* pServices = aSeq.getArray();
1248 
1249 	*pServices++ = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.OfficeDocument"));
1250 	*pServices++ = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.GenericDrawingDocument"));
1251 	*pServices++ = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DrawingDocumentFactory"));
1252 
1253 	if( mbImpressDoc )
1254 		*pServices++ = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PresentationDocument"));
1255     else
1256 		*pServices++ = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DrawingDocument"));
1257 
1258 	return aSeq;
1259 }
1260 
1261 // XPropertySet
1262 uno::Reference< beans::XPropertySetInfo > SAL_CALL SdXImpressDocument::getPropertySetInfo(  )
1263 	throw(uno::RuntimeException)
1264 {
1265 	OGuard aGuard( Application::GetSolarMutex() );
1266 	return mpPropSet->getPropertySetInfo();
1267 }
1268 
1269 void SAL_CALL SdXImpressDocument::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
1270 	throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
1271 {
1272 	OGuard aGuard( Application::GetSolarMutex() );
1273 
1274 	if( NULL == mpDoc )
1275 		throw lang::DisposedException();
1276 
1277 	const SfxItemPropertySimpleEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName);
1278 
1279 	switch( pEntry ? pEntry->nWID : -1 )
1280 	{
1281 		case WID_MODEL_LANGUAGE:
1282 		{
1283 			lang::Locale aLocale;
1284 			if(!(aValue >>= aLocale))
1285 				throw lang::IllegalArgumentException();
1286 
1287 			mpDoc->SetLanguage( SvxLocaleToLanguage(aLocale), EE_CHAR_LANGUAGE );
1288 			break;
1289 		}
1290 		case WID_MODEL_TABSTOP:
1291 		{
1292 			sal_Int32 nValue = 0;
1293 			if(!(aValue >>= nValue) || nValue < 0 )
1294 				throw lang::IllegalArgumentException();
1295 
1296 			mpDoc->SetDefaultTabulator((sal_uInt16)nValue);
1297 			break;
1298 		}
1299 		case WID_MODEL_VISAREA:
1300 			{
1301                 SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh();
1302 				if( !pEmbeddedObj )
1303 					break;
1304 
1305 				awt::Rectangle aVisArea;
1306 				if( !(aValue >>= aVisArea) || (aVisArea.Width < 0) || (aVisArea.Height < 0) )
1307 					throw lang::IllegalArgumentException();
1308 
1309 				pEmbeddedObj->SetVisArea( Rectangle( aVisArea.X, aVisArea.Y, aVisArea.X + aVisArea.Width - 1, aVisArea.Y + aVisArea.Height - 1 ) );
1310 			}
1311 			break;
1312 		case WID_MODEL_CONTFOCUS:
1313 			{
1314 				sal_Bool bFocus = sal_False;
1315 				if( !(aValue >>= bFocus ) )
1316 					throw lang::IllegalArgumentException();
1317 				mpDoc->SetAutoControlFocus( bFocus );
1318 			}
1319 			break;
1320 		case WID_MODEL_DSGNMODE:
1321 			{
1322 				sal_Bool bMode = sal_False;
1323 				if( !(aValue >>= bMode ) )
1324 					throw lang::IllegalArgumentException();
1325 				mpDoc->SetOpenInDesignMode( bMode );
1326 			}
1327 			break;
1328 		case WID_MODEL_BUILDID:
1329 			aValue >>= maBuildId;
1330 			return;
1331 		case WID_MODEL_MAPUNIT:
1332 		case WID_MODEL_BASICLIBS:
1333         case WID_MODEL_RUNTIMEUID: // is read-only
1334         case WID_MODEL_DIALOGLIBS:
1335 			throw beans::PropertyVetoException();
1336 		default:
1337 			throw beans::UnknownPropertyException();
1338 	}
1339 
1340 	SetModified();
1341 }
1342 
1343 uno::Any SAL_CALL SdXImpressDocument::getPropertyValue( const OUString& PropertyName )
1344 	throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1345 {
1346 	OGuard aGuard( Application::GetSolarMutex() );
1347 
1348 	uno::Any aAny;
1349 	if( NULL == mpDoc )
1350 		throw lang::DisposedException();
1351 
1352 	const SfxItemPropertySimpleEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName);
1353 
1354 	switch( pEntry ? pEntry->nWID : -1 )
1355 	{
1356 		case WID_MODEL_LANGUAGE:
1357 		{
1358 			LanguageType eLang = mpDoc->GetLanguage( EE_CHAR_LANGUAGE );
1359 			lang::Locale aLocale;
1360 			SvxLanguageToLocale( aLocale, eLang );
1361 			aAny <<= aLocale;
1362 			break;
1363 		}
1364 		case WID_MODEL_TABSTOP:
1365 			aAny <<= (sal_Int32)mpDoc->GetDefaultTabulator();
1366 			break;
1367 		case WID_MODEL_VISAREA:
1368 			{
1369                 SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh();
1370 				if( !pEmbeddedObj )
1371 					break;
1372 
1373 				const Rectangle& aRect = pEmbeddedObj->GetVisArea();
1374 				awt::Rectangle aVisArea( aRect.nLeft, aRect.nTop, aRect.getWidth(), aRect.getHeight() );
1375 				aAny <<= aVisArea;
1376 			}
1377 			break;
1378 		case WID_MODEL_MAPUNIT:
1379 			{
1380                 SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh();
1381 				if( !pEmbeddedObj )
1382 					break;
1383 
1384 				sal_Int16 nMeasureUnit = 0;
1385 				SvxMapUnitToMeasureUnit( (const short)pEmbeddedObj->GetMapUnit(), nMeasureUnit );
1386 				aAny <<= (sal_Int16)nMeasureUnit;
1387 		}
1388 		break;
1389 		case WID_MODEL_FORBCHARS:
1390 		{
1391 			aAny <<= getForbiddenCharsTable();
1392 		}
1393 		break;
1394 		case WID_MODEL_CONTFOCUS:
1395 			aAny <<= (sal_Bool)mpDoc->GetAutoControlFocus();
1396 			break;
1397 		case WID_MODEL_DSGNMODE:
1398 			aAny <<= mpDoc->GetOpenInDesignMode();
1399 			break;
1400 		case WID_MODEL_BASICLIBS:
1401 			aAny <<= mpDocShell->GetBasicContainer();
1402 			break;
1403         case WID_MODEL_DIALOGLIBS:
1404             aAny <<= mpDocShell->GetDialogContainer();
1405             break;
1406         case WID_MODEL_RUNTIMEUID:
1407             aAny <<= getRuntimeUID();
1408             break;
1409 		case WID_MODEL_BUILDID:
1410 			return uno::Any( maBuildId );
1411         case WID_MODEL_HASVALIDSIGNATURES:
1412             aAny <<= hasValidSignatures();
1413             break;
1414         default:
1415 			throw beans::UnknownPropertyException();
1416 	}
1417 
1418 	return aAny;
1419 }
1420 
1421 void SAL_CALL SdXImpressDocument::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
1422 void SAL_CALL SdXImpressDocument::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
1423 void SAL_CALL SdXImpressDocument::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
1424 void SAL_CALL SdXImpressDocument::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
1425 
1426 // XLinkTargetSupplier
1427 uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getLinks()
1428 	throw(uno::RuntimeException)
1429 {
1430 	OGuard aGuard( Application::GetSolarMutex() );
1431 
1432 	if( NULL == mpDoc )
1433 		throw lang::DisposedException();
1434 
1435 	uno::Reference< container::XNameAccess > xLinks( mxLinks );
1436 	if( !xLinks.is() )
1437 		mxLinks = xLinks = new SdDocLinkTargets( *this );
1438 	return xLinks;
1439 }
1440 
1441 // XStyleFamiliesSupplier
1442 uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getStyleFamilies(  )
1443 	throw(uno::RuntimeException)
1444 {
1445 	OGuard aGuard( Application::GetSolarMutex() );
1446 
1447 	if( NULL == mpDoc )
1448 		throw lang::DisposedException();
1449 
1450 	uno::Reference< container::XNameAccess > xStyles( dynamic_cast< container::XNameAccess* >( mpDoc->GetStyleSheetPool()) );
1451 	return xStyles;
1452 }
1453 
1454 // XAnyCompareFactory
1455 uno::Reference< com::sun::star::ucb::XAnyCompare > SAL_CALL SdXImpressDocument::createAnyCompareByName( const OUString& )
1456     throw (uno::RuntimeException)
1457 {
1458 	return SvxCreateNumRuleCompare();
1459 }
1460 
1461 // XRenderable
1462 sal_Int32 SAL_CALL SdXImpressDocument::getRendererCount( const uno::Any& rSelection,
1463                                                          const uno::Sequence< beans::PropertyValue >&  )
1464     throw (lang::IllegalArgumentException, uno::RuntimeException)
1465 {
1466 	OGuard      aGuard( Application::GetSolarMutex() );
1467 	sal_Int32   nRet = 0;
1468 
1469 	if( NULL == mpDoc )
1470 		throw lang::DisposedException();
1471 
1472     uno::Sequence< beans::PropertyValue > aRenderer;
1473 
1474     if( mpDocShell && mpDoc )
1475     {
1476         uno::Reference< frame::XModel > xModel;
1477 
1478         rSelection >>= xModel;
1479 
1480         if( xModel == mpDocShell->GetModel() )
1481             nRet = mpDoc->GetSdPageCount( PK_STANDARD );
1482         else
1483         {
1484             uno::Reference< drawing::XShapes > xShapes;
1485 
1486             rSelection >>= xShapes;
1487 
1488             if( xShapes.is() && xShapes->getCount() )
1489                 nRet = 1;
1490         }
1491     }
1492     return nRet;
1493 }
1494 
1495 uno::Sequence< beans::PropertyValue > SAL_CALL SdXImpressDocument::getRenderer( sal_Int32 , const uno::Any& ,
1496                                                                                 const uno::Sequence< beans::PropertyValue >& rxOptions )
1497     throw (lang::IllegalArgumentException, uno::RuntimeException)
1498 {
1499 	OGuard aGuard( Application::GetSolarMutex() );
1500 
1501 	if( NULL == mpDoc )
1502 		throw lang::DisposedException();
1503 
1504 	sal_Bool bExportNotesPages = sal_False;
1505 	for( sal_Int32 nProperty = 0, nPropertyCount = rxOptions.getLength(); nProperty < nPropertyCount; ++nProperty )
1506     {
1507         if( rxOptions[ nProperty ].Name.equalsAscii( "ExportNotesPages" ) )
1508 			rxOptions[ nProperty].Value >>= bExportNotesPages;
1509     }
1510     uno::Sequence< beans::PropertyValue > aRenderer;
1511     if( mpDocShell && mpDoc )
1512     {
1513 		awt::Size aPageSize;
1514 		if ( bExportNotesPages )
1515 		{
1516 			Size aNotesPageSize = mpDoc->GetSdPage( 0, PK_NOTES )->GetSize();
1517 			aPageSize = awt::Size( aNotesPageSize.Width(), aNotesPageSize.Height() );
1518 		}
1519 		else
1520 		{
1521 			const Rectangle aVisArea( mpDocShell->GetVisArea( embed::Aspects::MSOLE_DOCPRINT ) );
1522 			aPageSize = awt::Size( aVisArea.GetWidth(), aVisArea.GetHeight() );
1523 		}
1524         aRenderer.realloc( 1 );
1525 
1526         aRenderer[ 0 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) );
1527         aRenderer[ 0 ].Value <<= aPageSize;
1528     }
1529     return aRenderer;
1530 }
1531 
1532 class ImplRenderPaintProc : public ::sdr::contact::ViewObjectContactRedirector
1533 {
1534 	const SdrLayerAdmin&	rLayerAdmin;
1535 	SdrPageView*			pSdrPageView;
1536 	vcl::PDFExtOutDevData*	pPDFExtOutDevData;
1537 
1538 	vcl::PDFWriter::StructElement ImplBegStructureTag( SdrObject& rObject );
1539 
1540 public:
1541 	sal_Bool IsVisible  ( const SdrObject* pObj ) const;
1542 	sal_Bool IsPrintable( const SdrObject* pObj ) const;
1543 
1544 	ImplRenderPaintProc( const SdrLayerAdmin& rLA, SdrPageView* pView, vcl::PDFExtOutDevData* pData );
1545 	virtual ~ImplRenderPaintProc();
1546 
1547 	// all default implementations just call the same methods at the original. To do something
1548 	// different, overload the method and at least do what the method does.
1549 	virtual drawinglayer::primitive2d::Primitive2DSequence createRedirectedPrimitive2DSequence(
1550 		const sdr::contact::ViewObjectContact& rOriginal,
1551 		const sdr::contact::DisplayInfo& rDisplayInfo);
1552 };
1553 
1554 ImplRenderPaintProc::ImplRenderPaintProc( const SdrLayerAdmin& rLA, SdrPageView* pView, vcl::PDFExtOutDevData* pData )
1555 :	ViewObjectContactRedirector(),
1556 	rLayerAdmin			( rLA ),
1557 	pSdrPageView		( pView ),
1558 	pPDFExtOutDevData	( pData )
1559 {
1560 }
1561 
1562 ImplRenderPaintProc::~ImplRenderPaintProc()
1563 {
1564 }
1565 
1566 sal_Int32 ImplPDFGetBookmarkPage( const String& rBookmark, SdDrawDocument& rDoc )
1567 {
1568 	sal_Int32 nPage = -1;
1569 
1570     OSL_TRACE("GotoBookmark %s",
1571         ::rtl::OUStringToOString(rBookmark, RTL_TEXTENCODING_UTF8).getStr());
1572 
1573 	String aBookmark( rBookmark );
1574 
1575 	if( rBookmark.Len() && rBookmark.GetChar( 0 ) == sal_Unicode('#') )
1576 		aBookmark = rBookmark.Copy( 1 );
1577 
1578 	// is the bookmark a page ?
1579 	sal_Bool        bIsMasterPage;
1580     sal_uInt16      nPgNum = rDoc.GetPageByName( aBookmark, bIsMasterPage );
1581 	SdrObject*  pObj = NULL;
1582 
1583 	if ( nPgNum == SDRPAGE_NOTFOUND )
1584 	{
1585 		// is the bookmark a object ?
1586 		pObj = rDoc.GetObj( aBookmark );
1587 		if (pObj)
1588 			nPgNum = pObj->GetPage()->GetPageNum();
1589 	}
1590 	if ( nPgNum != SDRPAGE_NOTFOUND )
1591 		nPage = ( nPgNum - 1 ) / 2;
1592 	return nPage;
1593 }
1594 
1595 void ImplPDFExportComments( uno::Reference< drawing::XDrawPage > xPage, vcl::PDFExtOutDevData& rPDFExtOutDevData )
1596 {
1597 	try
1598 	{
1599 		uno::Reference< office::XAnnotationAccess > xAnnotationAccess( xPage, uno::UNO_QUERY_THROW );
1600 		uno::Reference< office::XAnnotationEnumeration > xAnnotationEnumeration( xAnnotationAccess->createAnnotationEnumeration() );
1601 
1602 		LanguageType eLanguage = Application::GetSettings().GetLanguage();
1603 		while( xAnnotationEnumeration->hasMoreElements() )
1604 		{
1605 			uno::Reference< office::XAnnotation > xAnnotation( xAnnotationEnumeration->nextElement() );
1606 
1607 			geometry::RealPoint2D aRealPoint2D( xAnnotation->getPosition() );
1608 			uno::Reference< text::XText > xText( xAnnotation->getTextRange() );
1609 //			rtl::OUString sInitials( getInitials( sAuthor ) );
1610 			util::DateTime aDateTime( xAnnotation->getDateTime() );
1611 
1612 			Date aDate( aDateTime.Day, aDateTime.Month, aDateTime.Year );
1613 			Time aTime;
1614 			String aStr( SvxDateTimeField::GetFormatted( aDate, aTime, SVXDATEFORMAT_B, *(SD_MOD()->GetNumberFormatter()), eLanguage ) );
1615 
1616 			vcl::PDFNote aNote;
1617 			String sTitle( xAnnotation->getAuthor() );
1618             sTitle.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ", " ) );
1619             sTitle += aStr;
1620             aNote.Title = sTitle;
1621 			aNote.Contents = xText->getString();
1622 			rPDFExtOutDevData.CreateNote( Rectangle( Point( static_cast< long >( aRealPoint2D.X * 100 ),
1623 				static_cast< long >( aRealPoint2D.Y * 100 ) ), Size( 1000, 1000 ) ), aNote );
1624 		}
1625 	}
1626 	catch( uno::Exception& )
1627 	{
1628 	}
1629 }
1630 
1631 void ImplPDFExportShapeInteraction( uno::Reference< drawing::XShape > xShape, SdDrawDocument& rDoc, vcl::PDFExtOutDevData& rPDFExtOutDevData )
1632 {
1633 	const rtl::OUString sGroup   ( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.GroupShape" ) );
1634 	const rtl::OUString sOnClick ( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) );
1635 	const rtl::OUString sBookmark( RTL_CONSTASCII_USTRINGPARAM( "Bookmark" ) );
1636 
1637 	if ( xShape->getShapeType().equals( sGroup ) )
1638 	{
1639 		uno::Reference< container::XIndexAccess > xIndexAccess( xShape, uno::UNO_QUERY );
1640 		if ( xIndexAccess.is() )
1641 		{
1642 			sal_Int32 i, nCount = xIndexAccess->getCount();
1643 			for ( i = 0; i < nCount; i++ )
1644 			{
1645 				uno::Reference< drawing::XShape > xSubShape( xIndexAccess->getByIndex( i ), uno::UNO_QUERY );
1646 				if ( xSubShape.is() )
1647 					ImplPDFExportShapeInteraction( xSubShape, rDoc, rPDFExtOutDevData );
1648 			}
1649 		}
1650 	}
1651 	else
1652 	{
1653 		uno::Reference< beans::XPropertySet > xShapePropSet( xShape, uno::UNO_QUERY );
1654 		if( xShapePropSet.is() )
1655 		{
1656 			Size		aPageSize( rDoc.GetSdPage( 0, PK_STANDARD )->GetSize() );
1657 			Point aPoint( 0, 0 );
1658 			Rectangle	aPageRect( aPoint, aPageSize );
1659 
1660 			awt::Point	aShapePos( xShape->getPosition() );
1661 			awt::Size	aShapeSize( xShape->getSize() );
1662 			Rectangle	aLinkRect( Point( aShapePos.X, aShapePos.Y ), Size( aShapeSize.Width, aShapeSize.Height ) );
1663 
1664 			presentation::ClickAction eCa;
1665 			uno::Any aAny( xShapePropSet->getPropertyValue( sOnClick ) );
1666 			if ( aAny >>= eCa )
1667 			{
1668 				switch ( eCa )
1669 				{
1670 					case presentation::ClickAction_LASTPAGE :
1671 					{
1672 						sal_Int32 nCount = rDoc.GetSdPageCount( PK_STANDARD );
1673 						sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nCount - 1, vcl::PDFWriter::FitRectangle );
1674 					    sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink( aLinkRect, -1 );
1675 						rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
1676 					}
1677 					break;
1678 					case presentation::ClickAction_FIRSTPAGE :
1679 					{
1680 						sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, 0, vcl::PDFWriter::FitRectangle );
1681 					    sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink( aLinkRect, -1 );
1682 						rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
1683 					}
1684 					break;
1685 					case presentation::ClickAction_PREVPAGE :
1686 					{
1687 						sal_Int32 nDestPage = rPDFExtOutDevData.GetCurrentPageNumber();
1688 						if ( nDestPage )
1689 							nDestPage--;
1690 						sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nDestPage, vcl::PDFWriter::FitRectangle );
1691 					    sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink( aLinkRect, -1 );
1692 						rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
1693 					}
1694 					break;
1695 					case presentation::ClickAction_NEXTPAGE :
1696 					{
1697 						sal_Int32 nDestPage = rPDFExtOutDevData.GetCurrentPageNumber() + 1;
1698 						sal_Int32 nLastPage = rDoc.GetSdPageCount( PK_STANDARD ) - 1;
1699 						if ( nDestPage > nLastPage )
1700 							nDestPage = nLastPage;
1701 						sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nDestPage, vcl::PDFWriter::FitRectangle );
1702 					    sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink( aLinkRect, -1 );
1703 						rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
1704 					}
1705 					break;
1706 
1707 					case presentation::ClickAction_PROGRAM :
1708 					case presentation::ClickAction_BOOKMARK :
1709 					case presentation::ClickAction_DOCUMENT :
1710 					{
1711 						rtl::OUString aBookmark;
1712 						xShapePropSet->getPropertyValue( sBookmark ) >>= aBookmark;
1713 						if( aBookmark.getLength() )
1714 						{
1715 							switch( eCa )
1716 							{
1717 								case presentation::ClickAction_DOCUMENT :
1718 								case presentation::ClickAction_PROGRAM :
1719 								{
1720 									sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink( aLinkRect, -1 );
1721 									rPDFExtOutDevData.SetLinkURL( nLinkId, aBookmark );
1722 								}
1723 								break;
1724 								case presentation::ClickAction_BOOKMARK :
1725 								{
1726 									sal_Int32 nPage = ImplPDFGetBookmarkPage( aBookmark, rDoc );
1727 									if ( nPage != -1 )
1728 									{
1729 										sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nPage, vcl::PDFWriter::FitRectangle );
1730 										sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink( aLinkRect, -1 );
1731 										rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
1732 									}
1733 								}
1734 								break;
1735 								default:
1736 									break;
1737 							}
1738 						}
1739 					}
1740 					break;
1741 
1742 					case presentation::ClickAction_STOPPRESENTATION :
1743 					case presentation::ClickAction_SOUND :
1744 					case presentation::ClickAction_INVISIBLE :
1745 					case presentation::ClickAction_VERB :
1746 					case presentation::ClickAction_VANISH :
1747 					case presentation::ClickAction_MACRO :
1748 					default :
1749 					break;
1750 				}
1751 			}
1752 		}
1753 	}
1754 }
1755 
1756 vcl::PDFWriter::StructElement ImplRenderPaintProc::ImplBegStructureTag( SdrObject& rObject )
1757 {
1758 	vcl::PDFWriter::StructElement eElement(vcl::PDFWriter::NonStructElement);
1759 
1760 	if ( pPDFExtOutDevData && pPDFExtOutDevData->GetIsExportTaggedPDF() )
1761 	{
1762 		sal_uInt32 nInventor   = rObject.GetObjInventor();
1763 		sal_uInt16 nIdentifier = rObject.GetObjIdentifier();
1764 		sal_Bool   bIsTextObj  = rObject.ISA( SdrTextObj );
1765 
1766 		if ( nInventor == SdrInventor )
1767 		{
1768 			if ( nIdentifier == OBJ_GRUP )
1769 				eElement = vcl::PDFWriter::Section;
1770 			else if ( nIdentifier == OBJ_TITLETEXT )
1771 				eElement = vcl::PDFWriter::Heading;
1772 			else if ( nIdentifier == OBJ_OUTLINETEXT )
1773 				eElement = vcl::PDFWriter::Division;
1774 			else if ( !bIsTextObj || !((SdrTextObj&)rObject).HasText() )
1775 				eElement = vcl::PDFWriter::Figure;
1776 		}
1777 	}
1778 
1779 	return eElement;
1780 }
1781 
1782 drawinglayer::primitive2d::Primitive2DSequence ImplRenderPaintProc::createRedirectedPrimitive2DSequence(
1783 	const sdr::contact::ViewObjectContact& rOriginal,
1784 	const sdr::contact::DisplayInfo& rDisplayInfo)
1785 {
1786 	SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
1787 
1788     if(pObject)
1789 	{
1790 		drawinglayer::primitive2d::Primitive2DSequence xRetval;
1791 
1792 		if(pObject->GetPage())
1793 		{
1794 			if(pObject->GetPage()->checkVisibility(rOriginal, rDisplayInfo, false))
1795 			{
1796 				if(IsVisible(pObject) && IsPrintable(pObject))
1797 				{
1798 					const vcl::PDFWriter::StructElement eElement(ImplBegStructureTag( *pObject ));
1799 					const bool bTagUsed(vcl::PDFWriter::NonStructElement != eElement);
1800 
1801 					xRetval = ::sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo);
1802 
1803 					if(xRetval.hasElements() && bTagUsed)
1804 					{
1805 						// embed Primitive2DSequence in a structure tag element for
1806 						// exactly this purpose (StructureTagPrimitive2D)
1807 						const drawinglayer::primitive2d::Primitive2DReference xReference(new drawinglayer::primitive2d::StructureTagPrimitive2D(eElement, xRetval));
1808 						xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
1809 					}
1810 				}
1811 			}
1812 		}
1813 
1814 		return xRetval;
1815 	}
1816 	else
1817 	{
1818 		// not an object, maybe a page
1819 		return sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo);
1820 	}
1821 }
1822 
1823 sal_Bool ImplRenderPaintProc::IsVisible( const SdrObject* pObj ) const
1824 {
1825 	sal_Bool bVisible = sal_True;
1826 	SdrLayerID nLayerId = pObj->GetLayer();
1827 	if( pSdrPageView )
1828 	{
1829 		const SdrLayer* pSdrLayer = rLayerAdmin.GetLayer( nLayerId );
1830 		if ( pSdrLayer )
1831 		{
1832 			String aLayerName = pSdrLayer->GetName();
1833 			bVisible = pSdrPageView->IsLayerVisible( aLayerName );
1834 		}
1835 	}
1836 	return bVisible;
1837 }
1838 sal_Bool ImplRenderPaintProc::IsPrintable( const SdrObject* pObj ) const
1839 {
1840 	sal_Bool bPrintable = sal_True;
1841 	SdrLayerID nLayerId = pObj->GetLayer();
1842 	if( pSdrPageView )
1843 	{
1844 		const SdrLayer* pSdrLayer = rLayerAdmin.GetLayer( nLayerId );
1845 		if ( pSdrLayer )
1846 		{
1847 			String aLayerName = pSdrLayer->GetName();
1848 			bPrintable = pSdrPageView->IsLayerPrintable( aLayerName );
1849 		}
1850 	}
1851 	return bPrintable;
1852 
1853 }
1854 void SAL_CALL SdXImpressDocument::render( sal_Int32 nRenderer, const uno::Any& rSelection,
1855                                           const uno::Sequence< beans::PropertyValue >& rxOptions )
1856     throw (lang::IllegalArgumentException, uno::RuntimeException)
1857 {
1858 	OGuard aGuard( Application::GetSolarMutex() );
1859 
1860 	if( NULL == mpDoc )
1861 		throw lang::DisposedException();
1862 
1863     if( mpDocShell && mpDoc )
1864     {
1865         uno::Reference< awt::XDevice >  xRenderDevice;
1866         const sal_Int32					nPageNumber = nRenderer + 1;
1867 		PageKind						ePageKind = PK_STANDARD;
1868 		sal_Bool						bExportNotesPages = sal_False;
1869 
1870 		for( sal_Int32 nProperty = 0, nPropertyCount = rxOptions.getLength(); nProperty < nPropertyCount; ++nProperty )
1871         {
1872 			if( rxOptions[ nProperty ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "RenderDevice" ) ) )
1873 				rxOptions[ nProperty ].Value >>= xRenderDevice;
1874 			else if ( rxOptions[ nProperty ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "ExportNotesPages" ) ) )
1875 			{
1876 				rxOptions[ nProperty].Value >>= bExportNotesPages;
1877 				if ( bExportNotesPages )
1878 					ePageKind = PK_NOTES;
1879 			}
1880         }
1881 
1882         if( xRenderDevice.is() && nPageNumber && ( nPageNumber <= mpDoc->GetSdPageCount( ePageKind ) ) )
1883         {
1884             VCLXDevice*     pDevice = VCLXDevice::GetImplementation( xRenderDevice );
1885             OutputDevice*   pOut = pDevice ? pDevice->GetOutputDevice() : NULL;
1886 
1887             if( pOut )
1888             {
1889 				vcl::PDFExtOutDevData* pPDFExtOutDevData = PTR_CAST( vcl::PDFExtOutDevData, pOut->GetExtOutDevData() );
1890 
1891 	            ::sd::ClientView* pView = new ::sd::ClientView( mpDocShell, pOut, NULL );
1892 				Rectangle				aVisArea = Rectangle( Point(), mpDoc->GetSdPage( (sal_uInt16)nPageNumber - 1, ePageKind )->GetSize() );
1893         		Region					aRegion( aVisArea );
1894                 Point					aOrigin;
1895 
1896 				::sd::ViewShell* pOldViewSh = mpDocShell->GetViewShell();
1897 				::sd::View* pOldSdView = pOldViewSh ? pOldViewSh->GetView() : NULL;
1898 
1899 				if  ( pOldSdView )
1900 					pOldSdView->SdrEndTextEdit();
1901 
1902                 pView->SetHlplVisible( sal_False );
1903                 pView->SetGridVisible( sal_False );
1904 	            pView->SetBordVisible( sal_False );
1905 	            pView->SetPageVisible( sal_False );
1906 	            pView->SetGlueVisible( sal_False );
1907 
1908                 pOut->SetMapMode( MAP_100TH_MM );
1909 	            pOut->IntersectClipRegion( aVisArea );
1910 
1911 
1912 
1913                 uno::Reference< frame::XModel > xModel;
1914                 rSelection >>= xModel;
1915 
1916                 if( xModel == mpDocShell->GetModel() )
1917                 {
1918                     pView->ShowSdrPage( mpDoc->GetSdPage( (sal_uInt16)nPageNumber - 1, ePageKind ));
1919 					SdrPageView* pPV = pView->GetSdrPageView();
1920 
1921 				    if( pOldSdView )
1922                     {
1923                         SdrPageView* pOldPV = pOldSdView->GetSdrPageView();
1924                         if( pPV && pOldPV )
1925                         {
1926                             pPV->SetVisibleLayers( pOldPV->GetVisibleLayers() );
1927                             pPV->SetPrintableLayers( pOldPV->GetPrintableLayers() );
1928                         }
1929                     }
1930 
1931 					ImplRenderPaintProc	aImplRenderPaintProc( mpDoc->GetLayerAdmin(),
1932 						pPV, pPDFExtOutDevData );
1933 
1934 					// background color for outliner :o
1935 					SdPage* pPage = (SdPage*)pPV->GetPage();
1936 					if( pPage )
1937 					{
1938 						SdrOutliner& rOutl = mpDoc->GetDrawOutliner( NULL );
1939                         bool bScreenDisplay(true);
1940 
1941                         if(bScreenDisplay && pOut && OUTDEV_PRINTER == pOut->GetOutDevType())
1942                         {
1943                             // #i75566# printing; suppress AutoColor BackgroundColor generation
1944                             // for visibility reasons by giving GetPageBackgroundColor()
1945                             // the needed hint
1946                             bScreenDisplay = false;
1947                         }
1948 
1949                         if(bScreenDisplay && pOut && pOut->GetPDFWriter())
1950                         {
1951                             // #i75566# PDF export; suppress AutoColor BackgroundColor generation (see above)
1952                             bScreenDisplay = false;
1953                         }
1954 
1955                         // #i75566# Name change GetBackgroundColor -> GetPageBackgroundColor and
1956                         // hint value if screen display. Only then the AutoColor mechanisms shall be applied
1957 						rOutl.SetBackgroundColor( pPage->GetPageBackgroundColor( pPV, bScreenDisplay ) );
1958 					}
1959 					pView->SdrPaintView::CompleteRedraw( pOut, aRegion, &aImplRenderPaintProc );
1960 
1961 					if ( pPDFExtOutDevData )
1962 					{
1963 						try
1964 						{
1965 							uno::Any aAny;
1966 							uno::Reference< drawing::XDrawPage > xPage( uno::Reference< drawing::XDrawPage >::query( pPage->getUnoPage() ) );
1967 							if ( xPage.is() )
1968 							{
1969 								if ( pPDFExtOutDevData->GetIsExportNotes() )
1970 									ImplPDFExportComments( xPage, *pPDFExtOutDevData );
1971 								uno::Reference< beans::XPropertySet > xPagePropSet( xPage, uno::UNO_QUERY );
1972 								if( xPagePropSet.is() )
1973 								{
1974 									// exporting object interactions to pdf
1975 
1976 									// if necessary, the master page interactions will be exported first
1977 									sal_Bool bIsBackgroundObjectsVisible = sal_False;	// SJ: #i39428# IsBackgroundObjectsVisible not available for Draw
1978 									const rtl::OUString sIsBackgroundObjectsVisible( RTL_CONSTASCII_USTRINGPARAM( "IsBackgroundObjectsVisible" ) );
1979 									if ( mbImpressDoc && !pPDFExtOutDevData->GetIsExportNotesPages() && ( xPagePropSet->getPropertyValue( sIsBackgroundObjectsVisible ) >>= bIsBackgroundObjectsVisible ) && bIsBackgroundObjectsVisible )
1980 									{
1981 										uno::Reference< drawing::XMasterPageTarget > xMasterPageTarget( xPage, uno::UNO_QUERY );
1982 										if ( xMasterPageTarget.is() )
1983 										{
1984 											uno::Reference< drawing::XDrawPage > xMasterPage = xMasterPageTarget->getMasterPage();
1985 											if ( xMasterPage.is() )
1986 											{
1987 												uno::Reference< drawing::XShapes> xShapes( xMasterPage, uno::UNO_QUERY );
1988 												sal_Int32 i, nCount = xShapes->getCount();
1989 												for ( i = 0; i < nCount; i++ )
1990 												{
1991 													aAny = xShapes->getByIndex( i );
1992 													uno::Reference< drawing::XShape > xShape;
1993 													if ( aAny >>= xShape )
1994 														ImplPDFExportShapeInteraction( xShape, *mpDoc, *pPDFExtOutDevData );
1995 												}
1996 											}
1997 										}
1998 									}
1999 
2000 									// exporting slide page object interactions
2001 									uno::Reference< drawing::XShapes> xShapes( xPage, uno::UNO_QUERY );
2002 									sal_Int32 i, nCount = xShapes->getCount();
2003 									for ( i = 0; i < nCount; i++ )
2004 									{
2005 										aAny = xShapes->getByIndex( i );
2006 										uno::Reference< drawing::XShape > xShape;
2007 										if ( aAny >>= xShape )
2008 											ImplPDFExportShapeInteraction( xShape, *mpDoc, *pPDFExtOutDevData );
2009 									}
2010 
2011 									// exporting transition effects to pdf
2012 									if ( mbImpressDoc && !pPDFExtOutDevData->GetIsExportNotesPages() && pPDFExtOutDevData->GetIsExportTransitionEffects() )
2013 									{
2014 										const rtl::OUString sEffect( RTL_CONSTASCII_USTRINGPARAM( "Effect" ) );
2015 										const rtl::OUString sSpeed ( RTL_CONSTASCII_USTRINGPARAM( "Speed" ) );
2016 										sal_Int32 nTime = 800;
2017 										presentation::AnimationSpeed aAs;
2018 										aAny = xPagePropSet->getPropertyValue( sSpeed );
2019 										if ( aAny >>= aAs )
2020 										{
2021 											switch( aAs )
2022 											{
2023 												case presentation::AnimationSpeed_SLOW : nTime = 1500; break;
2024 												case presentation::AnimationSpeed_FAST : nTime = 300; break;
2025 												default:
2026 												case presentation::AnimationSpeed_MEDIUM : nTime = 800;
2027 											}
2028 										}
2029 										presentation::FadeEffect eFe;
2030 										aAny = xPagePropSet->getPropertyValue( sEffect );
2031 										vcl::PDFWriter::PageTransition eType = vcl::PDFWriter::Regular;
2032 										if ( aAny >>= eFe )
2033 										{
2034 											switch( eFe )
2035 											{
2036 												case presentation::FadeEffect_HORIZONTAL_LINES :
2037 												case presentation::FadeEffect_HORIZONTAL_CHECKERBOARD :
2038 												case presentation::FadeEffect_HORIZONTAL_STRIPES : eType = vcl::PDFWriter::BlindsHorizontal; break;
2039 
2040 												case presentation::FadeEffect_VERTICAL_LINES :
2041 												case presentation::FadeEffect_VERTICAL_CHECKERBOARD :
2042 												case presentation::FadeEffect_VERTICAL_STRIPES : eType = vcl::PDFWriter::BlindsVertical; break;
2043 
2044 												case presentation::FadeEffect_UNCOVER_TO_RIGHT :
2045 												case presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT :
2046 												case presentation::FadeEffect_ROLL_FROM_LEFT :
2047 												case presentation::FadeEffect_FADE_FROM_UPPERLEFT :
2048 												case presentation::FadeEffect_MOVE_FROM_UPPERLEFT :
2049 												case presentation::FadeEffect_FADE_FROM_LEFT :
2050 												case presentation::FadeEffect_MOVE_FROM_LEFT : eType = vcl::PDFWriter::WipeLeftToRight; break;
2051 
2052 												case presentation::FadeEffect_UNCOVER_TO_BOTTOM :
2053 												case presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT :
2054 												case presentation::FadeEffect_ROLL_FROM_TOP :
2055 												case presentation::FadeEffect_FADE_FROM_UPPERRIGHT :
2056 												case presentation::FadeEffect_MOVE_FROM_UPPERRIGHT :
2057 												case presentation::FadeEffect_FADE_FROM_TOP :
2058 												case presentation::FadeEffect_MOVE_FROM_TOP : eType = vcl::PDFWriter::WipeTopToBottom; break;
2059 
2060 												case presentation::FadeEffect_UNCOVER_TO_LEFT :
2061 												case presentation::FadeEffect_UNCOVER_TO_LOWERLEFT :
2062 												case presentation::FadeEffect_ROLL_FROM_RIGHT :
2063 
2064 												case presentation::FadeEffect_FADE_FROM_LOWERRIGHT :
2065 												case presentation::FadeEffect_MOVE_FROM_LOWERRIGHT :
2066 												case presentation::FadeEffect_FADE_FROM_RIGHT :
2067 												case presentation::FadeEffect_MOVE_FROM_RIGHT : eType = vcl::PDFWriter::WipeRightToLeft; break;
2068 
2069 												case presentation::FadeEffect_UNCOVER_TO_TOP :
2070 												case presentation::FadeEffect_UNCOVER_TO_UPPERLEFT :
2071 												case presentation::FadeEffect_ROLL_FROM_BOTTOM :
2072 												case presentation::FadeEffect_FADE_FROM_LOWERLEFT :
2073 												case presentation::FadeEffect_MOVE_FROM_LOWERLEFT :
2074 												case presentation::FadeEffect_FADE_FROM_BOTTOM :
2075 												case presentation::FadeEffect_MOVE_FROM_BOTTOM : eType = vcl::PDFWriter::WipeBottomToTop; break;
2076 
2077 												case presentation::FadeEffect_OPEN_VERTICAL : eType = vcl::PDFWriter::SplitHorizontalInward; break;
2078 												case presentation::FadeEffect_CLOSE_HORIZONTAL : eType = vcl::PDFWriter::SplitHorizontalOutward; break;
2079 
2080 												case presentation::FadeEffect_OPEN_HORIZONTAL : eType = vcl::PDFWriter::SplitVerticalInward; break;
2081 												case presentation::FadeEffect_CLOSE_VERTICAL : eType = vcl::PDFWriter::SplitVerticalOutward; break;
2082 
2083 												case presentation::FadeEffect_FADE_TO_CENTER : eType = vcl::PDFWriter::BoxInward; break;
2084 												case presentation::FadeEffect_FADE_FROM_CENTER : eType = vcl::PDFWriter::BoxOutward; break;
2085 
2086 												case presentation::FadeEffect_NONE : eType = vcl::PDFWriter::Regular; break;
2087 
2088 												case presentation::FadeEffect_RANDOM :
2089 												case presentation::FadeEffect_DISSOLVE :
2090 												default: eType = vcl::PDFWriter::Dissolve; break;
2091 											}
2092 										}
2093 										pPDFExtOutDevData->SetPageTransition( eType, nTime, -1 );
2094 									}
2095 								}
2096 							}
2097 							Size		aPageSize( mpDoc->GetSdPage( 0, PK_STANDARD )->GetSize() );
2098 							Point aPoint( 0, 0 );
2099 							Rectangle	aPageRect( aPoint, aPageSize );
2100 
2101 							// resolving links found in this page by the method ImpEditEngine::Paint
2102 							std::vector< vcl::PDFExtOutDevBookmarkEntry >& rBookmarks = pPDFExtOutDevData->GetBookmarks();
2103 							std::vector< vcl::PDFExtOutDevBookmarkEntry >::iterator aIBeg = rBookmarks.begin();
2104 							std::vector< vcl::PDFExtOutDevBookmarkEntry >::iterator aIEnd = rBookmarks.end();
2105 							while ( aIBeg != aIEnd )
2106 							{
2107 								sal_Int32 nPage = ImplPDFGetBookmarkPage( aIBeg->aBookmark, *mpDoc );
2108 								if ( nPage != -1 )
2109 								{
2110 									if ( aIBeg->nLinkId != -1 )
2111 										pPDFExtOutDevData->SetLinkDest( aIBeg->nLinkId, pPDFExtOutDevData->CreateDest( aPageRect, nPage, vcl::PDFWriter::FitRectangle ) );
2112 									else
2113 										pPDFExtOutDevData->DescribeRegisteredDest( aIBeg->nDestId, aPageRect, nPage, vcl::PDFWriter::FitRectangle );
2114 								}
2115 								else
2116 									pPDFExtOutDevData->SetLinkURL( aIBeg->nLinkId, aIBeg->aBookmark );
2117 								aIBeg++;
2118 							}
2119 							rBookmarks.clear();
2120 							//---> i56629, i40318
2121 							//get the page name, will be used as outline element in PDF bookmark pane
2122 							String aPageName = mpDoc->GetSdPage( (sal_uInt16)nPageNumber - 1 , PK_STANDARD )->GetName();
2123 							if( aPageName.Len() > 0 )
2124 							{
2125 								// insert the bookmark to this page into the NamedDestinations
2126 								if( pPDFExtOutDevData->GetIsExportNamedDestinations() )
2127 									pPDFExtOutDevData->CreateNamedDest( aPageName, aPageRect,  nPageNumber - 1 );
2128 								//
2129 								// add the name to the outline, (almost) same code as in sc/source/ui/unoobj/docuno.cxx
2130 								// issue i40318.
2131 								//
2132 								if( pPDFExtOutDevData->GetIsExportBookmarks() )
2133 								{
2134 									// Destination Export
2135 									const sal_Int32 nDestId =
2136 										pPDFExtOutDevData->CreateDest( aPageRect , nPageNumber - 1 );
2137 
2138 									// Create a new outline item:
2139 									pPDFExtOutDevData->CreateOutlineItem( -1 , aPageName, nDestId );
2140 								}
2141 							}
2142 							//<--- i56629, i40318
2143 						}
2144 						catch( uno::Exception& )
2145 						{
2146 						}
2147 
2148 					}
2149             	}
2150             	else
2151             	{
2152 		            uno::Reference< drawing::XShapes > xShapes;
2153 		            rSelection >>= xShapes;
2154 
2155 		            if( xShapes.is() && xShapes->getCount() )
2156 		            {
2157 		               SdrPageView* pPV = NULL;
2158 
2159 					   ImplRenderPaintProc	aImplRenderPaintProc( mpDoc->GetLayerAdmin(),
2160 										pOldSdView ? pOldSdView->GetSdrPageView() : NULL, pPDFExtOutDevData );
2161 
2162 			            for( sal_uInt32 i = 0, nCount = xShapes->getCount(); i < nCount; i++ )
2163 			            {
2164 			                uno::Reference< drawing::XShape > xShape;
2165 				            xShapes->getByIndex( i ) >>= xShape;
2166 
2167 				            if( xShape.is() )
2168 				            {
2169 					            SvxShape* pShape = SvxShape::getImplementation( xShape );
2170 
2171 					            if( pShape )
2172 					            {
2173 						            SdrObject* pObj = pShape->GetSdrObject();
2174 						            if( pObj && pObj->GetPage()
2175 										&& aImplRenderPaintProc.IsVisible( pObj )
2176 											&& aImplRenderPaintProc.IsPrintable( pObj ) )
2177 						            {
2178 						                if( !pPV )
2179                                             pPV = pView->ShowSdrPage( pObj->GetPage() );
2180 
2181                                         if( pPV )
2182 							                pView->MarkObj( pObj, pPV );
2183 							        }
2184 					            }
2185 				            }
2186 			            }
2187                         pView->DrawMarkedObj(*pOut);
2188 		            }
2189 		        }
2190 
2191                 delete pView;
2192             }
2193         }
2194     }
2195 }
2196 
2197 uno::Reference< i18n::XForbiddenCharacters > SdXImpressDocument::getForbiddenCharsTable()
2198 {
2199 	uno::Reference< i18n::XForbiddenCharacters > xForb(mxForbidenCharacters);
2200 
2201 	if( !xForb.is() )
2202 		mxForbidenCharacters = xForb = new SdUnoForbiddenCharsTable( mpDoc );
2203 
2204 	return xForb;
2205 }
2206 
2207 void SdXImpressDocument::initializeDocument()
2208 {
2209     if( !mbClipBoard )
2210     {
2211         switch( mpDoc->GetPageCount() )
2212         {
2213         case 1:
2214         {
2215             // nasty hack to detect clipboard document
2216             mbClipBoard = true;
2217             break;
2218         }
2219         case 0:
2220         {
2221 	        mpDoc->CreateFirstPages();
2222 		    mpDoc->StopWorkStartupDelay();
2223             break;
2224         }
2225 	    }
2226     }
2227 }
2228 
2229 void SAL_CALL SdXImpressDocument::dispose() throw (::com::sun::star::uno::RuntimeException)
2230 {
2231     if( !mbDisposed )
2232     {
2233         {
2234 			OGuard aGuard( Application::GetSolarMutex() );
2235 
2236 			if( mpDoc )
2237 			{
2238 				EndListening( *mpDoc );
2239 				mpDoc = NULL;
2240 			}
2241 
2242 			// Call the base class dispose() before setting the mbDisposed flag
2243 			// to true.  The reason for this is that if close() has not yet been
2244 			// called this is done in SfxBaseModel::dispose().  At the end of
2245 			// that dispose() is called again.  It is important to forward this
2246 			// second dispose() to the base class, too.
2247 			// As a consequence the following code has to be able to be run twice.
2248 			SfxBaseModel::dispose();
2249 			mbDisposed = true;
2250 
2251 			uno::Reference< container::XNameAccess > xStyles(mxStyleFamilies);
2252 			if( xStyles.is() )
2253 			{
2254 				uno::Reference< lang::XComponent > xComp( xStyles, uno::UNO_QUERY );
2255 				if( xComp.is() )
2256 					xComp->dispose();
2257 
2258 				xStyles = 0;
2259 			}
2260 
2261 			uno::Reference< presentation::XPresentation > xPresentation( mxPresentation );
2262 			if( xPresentation.is() )
2263 			{
2264 				uno::Reference< ::com::sun::star::presentation::XPresentation2 > xPres( mpDoc->getPresentation().get() );
2265 				uno::Reference< lang::XComponent > xPresComp( xPres, uno::UNO_QUERY );
2266 				if( xPresComp.is() )
2267 					xPresComp->dispose();
2268 			}
2269 
2270 			uno::Reference< container::XNameAccess > xLinks( mxLinks );
2271 			if( xLinks.is() )
2272 			{
2273 				uno::Reference< lang::XComponent > xComp( xLinks, uno::UNO_QUERY );
2274 				if( xComp.is() )
2275 					xComp->dispose();
2276 
2277 				xLinks = 0;
2278 			}
2279 
2280 			uno::Reference< drawing::XDrawPages > xDrawPagesAccess( mxDrawPagesAccess );
2281 			if( xDrawPagesAccess.is() )
2282 			{
2283 				uno::Reference< lang::XComponent > xComp( xDrawPagesAccess, uno::UNO_QUERY );
2284 				if( xComp.is() )
2285 					xComp->dispose();
2286 
2287 				xDrawPagesAccess = 0;
2288 			}
2289 
2290 			uno::Reference< drawing::XDrawPages > xMasterPagesAccess( mxMasterPagesAccess );
2291 			if( xDrawPagesAccess.is() )
2292 			{
2293 				uno::Reference< lang::XComponent > xComp( xMasterPagesAccess, uno::UNO_QUERY );
2294 				if( xComp.is() )
2295 					xComp->dispose();
2296 
2297 				xDrawPagesAccess = 0;
2298 			}
2299 
2300 			uno::Reference< container::XNameAccess > xLayerManager( mxLayerManager );
2301 			if( xLayerManager.is() )
2302 			{
2303 				uno::Reference< lang::XComponent > xComp( xLayerManager, uno::UNO_QUERY );
2304 				if( xComp.is() )
2305 					xComp->dispose();
2306 
2307 				xLayerManager = 0;
2308 			}
2309 
2310 			uno::Reference< container::XNameContainer > xCustomPresentationAccess( mxCustomPresentationAccess );
2311 			if( xCustomPresentationAccess.is() )
2312 			{
2313 				uno::Reference< lang::XComponent > xComp( xCustomPresentationAccess, uno::UNO_QUERY );
2314 				if( xComp.is() )
2315 					xComp->dispose();
2316 
2317 				xCustomPresentationAccess = 0;
2318 			}
2319 
2320 			mxDashTable = 0;
2321 			mxGradientTable = 0;
2322 			mxHatchTable = 0;
2323 			mxBitmapTable = 0;
2324 			mxTransGradientTable = 0;
2325 			mxMarkerTable = 0;
2326 			mxDrawingPool = 0;
2327 		}
2328 	}
2329 }
2330 
2331 //=============================================================================
2332 // class SdDrawPagesAccess
2333 //=============================================================================
2334 
2335 SdDrawPagesAccess::SdDrawPagesAccess( SdXImpressDocument& rMyModel )  throw()
2336 :	mpModel( &rMyModel)
2337 {
2338 }
2339 
2340 SdDrawPagesAccess::~SdDrawPagesAccess() throw()
2341 {
2342 }
2343 
2344 // XIndexAccess
2345 sal_Int32 SAL_CALL SdDrawPagesAccess::getCount()
2346 	throw(uno::RuntimeException)
2347 {
2348 	OGuard aGuard( Application::GetSolarMutex() );
2349 
2350 	if( NULL == mpModel )
2351 		throw lang::DisposedException();
2352 
2353 	return mpModel->mpDoc->GetSdPageCount( PK_STANDARD );
2354 }
2355 
2356 uno::Any SAL_CALL SdDrawPagesAccess::getByIndex( sal_Int32 Index )
2357 	throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
2358 {
2359 	OGuard aGuard( Application::GetSolarMutex() );
2360 
2361 	if( NULL == mpModel )
2362 		throw lang::DisposedException();
2363 
2364 	uno::Any aAny;
2365 
2366 	if( (Index < 0) || (Index >= mpModel->mpDoc->GetSdPageCount( PK_STANDARD ) ) )
2367 		throw lang::IndexOutOfBoundsException();
2368 
2369 	SdPage* pPage = mpModel->mpDoc->GetSdPage( (sal_uInt16)Index, PK_STANDARD );
2370 	if( pPage )
2371 	{
2372 		uno::Reference< drawing::XDrawPage >  xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
2373 		aAny <<= xDrawPage;
2374 	}
2375 
2376 	return aAny;
2377 }
2378 
2379 // XNameAccess
2380 uno::Any SAL_CALL SdDrawPagesAccess::getByName( const OUString& aName ) throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
2381 {
2382 	OGuard aGuard( Application::GetSolarMutex() );
2383 
2384 	if( NULL == mpModel )
2385 		throw lang::DisposedException();
2386 
2387 	if( aName.getLength() != 0 )
2388 	{
2389 		const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PK_STANDARD );
2390 		sal_uInt16 nPage;
2391 		for( nPage = 0; nPage < nCount; nPage++ )
2392 		{
2393 			SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PK_STANDARD );
2394 			if(NULL == pPage)
2395 				continue;
2396 
2397 			if( aName == SdDrawPage::getPageApiName( pPage ) )
2398 			{
2399 				uno::Any aAny;
2400 				uno::Reference< drawing::XDrawPage >  xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
2401 				aAny <<= xDrawPage;
2402 				return aAny;
2403 			}
2404 		}
2405 	}
2406 
2407 	throw container::NoSuchElementException();
2408 }
2409 
2410 uno::Sequence< OUString > SAL_CALL SdDrawPagesAccess::getElementNames() throw(uno::RuntimeException)
2411 {
2412 	OGuard aGuard( Application::GetSolarMutex() );
2413 
2414 	if( NULL == mpModel )
2415 		throw lang::DisposedException();
2416 
2417 	const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PK_STANDARD );
2418 	uno::Sequence< OUString > aNames( nCount );
2419 	OUString* pNames = aNames.getArray();
2420 
2421 	sal_uInt16 nPage;
2422 	for( nPage = 0; nPage < nCount; nPage++ )
2423 	{
2424 		SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PK_STANDARD );
2425 		*pNames++ = SdDrawPage::getPageApiName( pPage );
2426 	}
2427 
2428 	return aNames;
2429 }
2430 
2431 sal_Bool SAL_CALL SdDrawPagesAccess::hasByName( const OUString& aName ) throw(uno::RuntimeException)
2432 {
2433 	OGuard aGuard( Application::GetSolarMutex() );
2434 
2435 	if( NULL == mpModel )
2436 		throw lang::DisposedException();
2437 
2438 	const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PK_STANDARD );
2439 	sal_uInt16 nPage;
2440 	for( nPage = 0; nPage < nCount; nPage++ )
2441 	{
2442 		SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PK_STANDARD );
2443 		if(NULL == pPage)
2444 			continue;
2445 
2446 		if( aName == SdDrawPage::getPageApiName( pPage ) )
2447 			return sal_True;
2448 	}
2449 
2450 	return sal_False;
2451 }
2452 
2453 // XElementAccess
2454 uno::Type SAL_CALL SdDrawPagesAccess::getElementType()
2455 	throw(uno::RuntimeException)
2456 {
2457 	return ITYPE( drawing::XDrawPage );
2458 }
2459 
2460 sal_Bool SAL_CALL SdDrawPagesAccess::hasElements()
2461 	throw(uno::RuntimeException)
2462 {
2463 	return getCount() > 0;
2464 }
2465 
2466 // XDrawPages
2467 
2468 /******************************************************************************
2469 * Erzeugt eine neue Seite mit Model an der angegebennen Position und gibt die *
2470 * dazugehoerige SdDrawPage zurueck.                                           *
2471 ******************************************************************************/
2472 uno::Reference< drawing::XDrawPage > SAL_CALL SdDrawPagesAccess::insertNewByIndex( sal_Int32 nIndex )
2473 	throw(uno::RuntimeException)
2474 {
2475 	OGuard aGuard( Application::GetSolarMutex() );
2476 
2477 	if( NULL == mpModel )
2478 		throw lang::DisposedException();
2479 
2480 	if( mpModel->mpDoc )
2481 	{
2482 		SdPage* pPage = mpModel->InsertSdPage( (sal_uInt16)nIndex );
2483 		if( pPage )
2484 		{
2485 			uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
2486 			return xDrawPage;
2487 		}
2488 	}
2489 	uno::Reference< drawing::XDrawPage > xDrawPage;
2490 	return xDrawPage;
2491 }
2492 
2493 /******************************************************************************
2494 * Entfernt die angegebenne SdDrawPage aus dem Model und aus der internen      *
2495 * Liste. Dies funktioniert nur, wenn mindestens eine *normale* Seite im Model *
2496 * nach dem entfernen dieser Seite vorhanden ist.							  *
2497 ******************************************************************************/
2498 void SAL_CALL SdDrawPagesAccess::remove( const uno::Reference< drawing::XDrawPage >& xPage )
2499 		throw(uno::RuntimeException)
2500 {
2501 	OGuard aGuard( Application::GetSolarMutex() );
2502 
2503 	if( NULL == mpModel || mpModel->mpDoc == NULL )
2504 		throw lang::DisposedException();
2505 
2506 	SdDrawDocument& rDoc = *mpModel->mpDoc;
2507 
2508 	sal_uInt16 nPageCount = rDoc.GetSdPageCount( PK_STANDARD );
2509 	if( nPageCount > 1 )
2510 	{
2511 		// pPage von xPage besorgen und dann die Id (nPos )ermitteln
2512 		SdDrawPage* pSvxPage = SdDrawPage::getImplementation( xPage );
2513 		if( pSvxPage )
2514 		{
2515 			SdPage* pPage = (SdPage*) pSvxPage->GetSdrPage();
2516 			if(pPage && ( pPage->GetPageKind() == PK_STANDARD ) )
2517 			{
2518 				sal_uInt16 nPage = pPage->GetPageNum();
2519 
2520 				SdPage* pNotesPage = static_cast< SdPage* >( rDoc.GetPage( nPage+1 ) );
2521 
2522 				bool bUndo = rDoc.IsUndoEnabled();
2523 				if( bUndo )
2524 				{
2525 					// Add undo actions and delete the pages.  The order of adding
2526 					// the undo actions is important.
2527 					rDoc.BegUndo( SdResId( STR_UNDO_DELETEPAGES ) );
2528 					rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pNotesPage));
2529 					rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
2530 				}
2531 
2532 				rDoc.RemovePage( nPage ); // the page
2533 				rDoc.RemovePage( nPage ); // the notes page
2534 
2535 				if( bUndo )
2536 				{
2537 					rDoc.EndUndo();
2538 				}
2539 				else
2540 				{
2541 					delete pNotesPage;
2542 					delete pPage;
2543 				}
2544 			}
2545 		}
2546 	}
2547 
2548 	mpModel->SetModified();
2549 }
2550 
2551 // XServiceInfo
2552 sal_Char pSdDrawPagesAccessService[sizeof("com.sun.star.drawing.DrawPages")] = "com.sun.star.drawing.DrawPages";
2553 
2554 OUString SAL_CALL SdDrawPagesAccess::getImplementationName(  ) throw(uno::RuntimeException)
2555 {
2556 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SdDrawPagesAccess" ) );
2557 }
2558 
2559 sal_Bool SAL_CALL SdDrawPagesAccess::supportsService( const OUString& ServiceName ) throw(uno::RuntimeException)
2560 {
2561 	return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( pSdDrawPagesAccessService ) );
2562 }
2563 
2564 uno::Sequence< OUString > SAL_CALL SdDrawPagesAccess::getSupportedServiceNames(  ) throw(uno::RuntimeException)
2565 {
2566 	OUString aService( RTL_CONSTASCII_USTRINGPARAM( pSdDrawPagesAccessService ) );
2567 	uno::Sequence< OUString > aSeq( &aService, 1 );
2568 	return aSeq;
2569 }
2570 
2571 // XComponent
2572 void SAL_CALL SdDrawPagesAccess::dispose(  ) throw (uno::RuntimeException)
2573 {
2574 	mpModel = NULL;
2575 }
2576 
2577 void SAL_CALL SdDrawPagesAccess::addEventListener( const uno::Reference< lang::XEventListener >&  ) throw (uno::RuntimeException)
2578 {
2579 	DBG_ERROR( "not implemented!" );
2580 }
2581 
2582 void SAL_CALL SdDrawPagesAccess::removeEventListener( const uno::Reference< lang::XEventListener >&  ) throw (uno::RuntimeException)
2583 {
2584 	DBG_ERROR( "not implemented!" );
2585 }
2586 
2587 //=============================================================================
2588 // class SdMasterPagesAccess
2589 //=============================================================================
2590 
2591 SdMasterPagesAccess::SdMasterPagesAccess( SdXImpressDocument& rMyModel ) throw()
2592 :	mpModel(&rMyModel)
2593 {
2594 }
2595 
2596 SdMasterPagesAccess::~SdMasterPagesAccess() throw()
2597 {
2598 }
2599 
2600 // XComponent
2601 void SAL_CALL SdMasterPagesAccess::dispose(  ) throw (uno::RuntimeException)
2602 {
2603 	mpModel = NULL;
2604 }
2605 
2606 void SAL_CALL SdMasterPagesAccess::addEventListener( const uno::Reference< lang::XEventListener >&  ) throw (uno::RuntimeException)
2607 {
2608 	DBG_ERROR( "not implemented!" );
2609 }
2610 
2611 void SAL_CALL SdMasterPagesAccess::removeEventListener( const uno::Reference< lang::XEventListener >&  ) throw (uno::RuntimeException)
2612 {
2613 	DBG_ERROR( "not implemented!" );
2614 }
2615 
2616 // XIndexAccess
2617 sal_Int32 SAL_CALL SdMasterPagesAccess::getCount()
2618 	throw(uno::RuntimeException)
2619 {
2620 	OGuard aGuard( Application::GetSolarMutex() );
2621 
2622 	if( NULL == mpModel->mpDoc )
2623 		throw lang::DisposedException();
2624 
2625 	return mpModel->mpDoc->GetMasterSdPageCount(PK_STANDARD);
2626 }
2627 
2628 /******************************************************************************
2629 * Liefert ein drawing::XDrawPage Interface fuer den Zugriff auf die Masterpage and der *
2630 * angegebennen Position im Model.                                             *
2631 ******************************************************************************/
2632 uno::Any SAL_CALL SdMasterPagesAccess::getByIndex( sal_Int32 Index )
2633 	throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
2634 {
2635 	OGuard aGuard( Application::GetSolarMutex() );
2636 
2637 	if( NULL == mpModel )
2638 		throw lang::DisposedException();
2639 
2640 	uno::Any aAny;
2641 
2642 	if( (Index < 0) || (Index >= mpModel->mpDoc->GetMasterSdPageCount( PK_STANDARD ) ) )
2643 		throw lang::IndexOutOfBoundsException();
2644 
2645 	SdPage* pPage = mpModel->mpDoc->GetMasterSdPage( (sal_uInt16)Index, PK_STANDARD );
2646 	if( pPage )
2647 	{
2648 		uno::Reference< drawing::XDrawPage >  xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
2649 		aAny <<= xDrawPage;
2650 	}
2651 
2652 	return aAny;
2653 }
2654 
2655 // XElementAccess
2656 uno::Type SAL_CALL SdMasterPagesAccess::getElementType()
2657 	throw(uno::RuntimeException)
2658 {
2659 	return ITYPE(drawing::XDrawPage);
2660 }
2661 
2662 sal_Bool SAL_CALL SdMasterPagesAccess::hasElements()
2663 	throw(uno::RuntimeException)
2664 {
2665 	return getCount() > 0;
2666 }
2667 
2668 // XDrawPages
2669 uno::Reference< drawing::XDrawPage > SAL_CALL SdMasterPagesAccess::insertNewByIndex( sal_Int32 nInsertPos )
2670 	throw(uno::RuntimeException)
2671 {
2672 	OGuard aGuard( Application::GetSolarMutex() );
2673 
2674 	if( NULL == mpModel )
2675 		throw lang::DisposedException();
2676 
2677 	uno::Reference< drawing::XDrawPage > xDrawPage;
2678 
2679 	SdDrawDocument* mpDoc = mpModel->mpDoc;
2680 	if( mpDoc )
2681 	{
2682 		// calculate internal index and check for range errors
2683 		const sal_Int32 nMPageCount = mpDoc->GetMasterPageCount();
2684 		nInsertPos = nInsertPos * 2 + 1;
2685 		if( nInsertPos < 0 || nInsertPos > nMPageCount )
2686 			nInsertPos = nMPageCount;
2687 
2688 		// now generate a unique name for the new masterpage
2689 		const String aStdPrefix( SdResId(STR_LAYOUT_DEFAULT_NAME) );
2690 		String aPrefix( aStdPrefix );
2691 
2692 		sal_Bool bUnique = sal_True;
2693 		sal_Int32 i = 0;
2694 		do
2695 		{
2696 			bUnique = sal_True;
2697 			for( sal_Int32 nMaster = 1; nMaster < nMPageCount; nMaster++ )
2698 			{
2699 				SdPage* pPage = (SdPage*)mpDoc->GetMasterPage((sal_uInt16)nMaster);
2700 				if( pPage && pPage->GetName() == aPrefix )
2701 				{
2702 					bUnique = sal_False;
2703 					break;
2704 				}
2705 			}
2706 
2707 			if( !bUnique )
2708 			{
2709 				i++;
2710 				aPrefix = aStdPrefix;
2711 				aPrefix += sal_Unicode( ' ' );
2712 				aPrefix += String::CreateFromInt32( i );
2713 			}
2714 
2715 		} while( !bUnique );
2716 
2717 		String aLayoutName( aPrefix );
2718 		aLayoutName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR ));
2719 		aLayoutName += String(SdResId(STR_LAYOUT_OUTLINE));
2720 
2721 		// create styles
2722 		((SdStyleSheetPool*)mpDoc->GetStyleSheetPool())->CreateLayoutStyleSheets( aPrefix );
2723 
2724 		// get the first page for initial size and border settings
2725 		SdPage* pPage = mpModel->mpDoc->GetSdPage( (sal_uInt16)0, PK_STANDARD );
2726 		SdPage* pRefNotesPage = mpModel->mpDoc->GetSdPage( (sal_uInt16)0, PK_NOTES);
2727 
2728 		// create and instert new draw masterpage
2729 		SdPage* pMPage = (SdPage*)mpModel->mpDoc->AllocPage(sal_True);
2730 		pMPage->SetSize( pPage->GetSize() );
2731 		pMPage->SetBorder( pPage->GetLftBorder(),
2732 						   pPage->GetUppBorder(),
2733 						   pPage->GetRgtBorder(),
2734 						   pPage->GetLwrBorder() );
2735 		pMPage->SetLayoutName( aLayoutName );
2736 		mpDoc->InsertMasterPage(pMPage,  (sal_uInt16)nInsertPos);
2737 
2738 		{
2739 			// ensure default MasterPage fill
2740             pMPage->EnsureMasterPageDefaultBackground();
2741 		}
2742 
2743 		xDrawPage = uno::Reference< drawing::XDrawPage >::query( pMPage->getUnoPage() );
2744 
2745 		// create and instert new notes masterpage
2746 		SdPage* pMNotesPage = (SdPage*)mpModel->mpDoc->AllocPage(sal_True);
2747 		pMNotesPage->SetSize( pRefNotesPage->GetSize() );
2748 		pMNotesPage->SetPageKind(PK_NOTES);
2749 		pMNotesPage->SetBorder( pRefNotesPage->GetLftBorder(),
2750 								pRefNotesPage->GetUppBorder(),
2751 								pRefNotesPage->GetRgtBorder(),
2752 								pRefNotesPage->GetLwrBorder() );
2753 		pMNotesPage->SetLayoutName( aLayoutName );
2754 		mpDoc->InsertMasterPage(pMNotesPage,  (sal_uInt16)nInsertPos + 1);
2755 //		pMNotesPage->InsertMasterPage( pMPage->GetPageNum() );
2756 		pMNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, sal_True, sal_True);
2757 		mpModel->SetModified();
2758 	}
2759 
2760 	return( xDrawPage );
2761 }
2762 
2763 /******************************************************************************
2764 * Entfernt die angegebenne SdMasterPage aus dem Model und aus der internen    *
2765 * Liste. Dies funktioniert nur, wenn keine *normale* Seite im Model diese     *
2766 * Seite als Masterpage benutzt.                                               *
2767 ******************************************************************************/
2768 void SAL_CALL SdMasterPagesAccess::remove( const uno::Reference< drawing::XDrawPage >& xPage )
2769 	throw(uno::RuntimeException)
2770 {
2771 	OGuard aGuard( Application::GetSolarMutex() );
2772 
2773 	if( NULL == mpModel || mpModel->mpDoc == NULL )
2774 		throw lang::DisposedException();
2775 
2776 	SdDrawDocument& rDoc = *mpModel->mpDoc;
2777 
2778 	SdMasterPage* pSdPage = SdMasterPage::getImplementation( xPage );
2779 	if(pSdPage == NULL)
2780 		return;
2781 
2782 	SdPage* pPage = dynamic_cast< SdPage* > (pSdPage->GetSdrPage());
2783 
2784 	DBG_ASSERT( pPage && pPage->IsMasterPage(), "SdMasterPage is not masterpage?");
2785 
2786 	if( !pPage || !pPage->IsMasterPage() || (mpModel->mpDoc->GetMasterPageUserCount(pPage) > 0))
2787 		return; //Todo: this should be excepted
2788 
2789 	// only standard pages can be removed directly
2790 	if( pPage->GetPageKind() == PK_STANDARD )
2791 	{
2792 		sal_uInt16 nPage = pPage->GetPageNum();
2793 
2794 		SdPage* pNotesPage = static_cast< SdPage* >( rDoc.GetMasterPage( nPage+1 ) );
2795 
2796 		bool bUndo = rDoc.IsUndoEnabled();
2797 		if( bUndo )
2798 		{
2799 			// Add undo actions and delete the pages.  The order of adding
2800 			// the undo actions is important.
2801 			rDoc.BegUndo( SdResId( STR_UNDO_DELETEPAGES ) );
2802 			rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pNotesPage));
2803 			rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
2804 		}
2805 
2806 		rDoc.RemoveMasterPage( nPage );
2807 		rDoc.RemoveMasterPage( nPage );
2808 
2809 		if( bUndo )
2810 		{
2811 			rDoc.EndUndo();
2812 		}
2813 		else
2814 		{
2815 			delete pNotesPage;
2816 			delete pPage;
2817 		}
2818 	}
2819 }
2820 
2821 // XServiceInfo
2822 sal_Char pSdMasterPagesAccessService[sizeof("com.sun.star.drawing.MasterPages")] = "com.sun.star.drawing.MasterPages";
2823 
2824 OUString SAL_CALL SdMasterPagesAccess::getImplementationName(  ) throw(uno::RuntimeException)
2825 {
2826 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SdMasterPagesAccess" ) );
2827 }
2828 
2829 sal_Bool SAL_CALL SdMasterPagesAccess::supportsService( const OUString& ServiceName ) throw(uno::RuntimeException)
2830 {
2831 	return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( pSdMasterPagesAccessService ) );
2832 }
2833 
2834 uno::Sequence< OUString > SAL_CALL SdMasterPagesAccess::getSupportedServiceNames(  ) throw(uno::RuntimeException)
2835 {
2836 	OUString aService( RTL_CONSTASCII_USTRINGPARAM( pSdMasterPagesAccessService ) );
2837 	uno::Sequence< OUString > aSeq( &aService, 1 );
2838 	return aSeq;
2839 }
2840 
2841 //=============================================================================
2842 // class SdDocLinkTargets
2843 //=============================================================================
2844 
2845 SdDocLinkTargets::SdDocLinkTargets( SdXImpressDocument& rMyModel ) throw()
2846 : mpModel( &rMyModel )
2847 {
2848 }
2849 
2850 SdDocLinkTargets::~SdDocLinkTargets() throw()
2851 {
2852 }
2853 
2854 // XComponent
2855 void SAL_CALL SdDocLinkTargets::dispose(  ) throw (uno::RuntimeException)
2856 {
2857 	mpModel = NULL;
2858 }
2859 
2860 void SAL_CALL SdDocLinkTargets::addEventListener( const uno::Reference< lang::XEventListener >&  ) throw (uno::RuntimeException)
2861 {
2862 	DBG_ERROR( "not implemented!" );
2863 }
2864 
2865 void SAL_CALL SdDocLinkTargets::removeEventListener( const uno::Reference< lang::XEventListener >&  ) throw (uno::RuntimeException)
2866 {
2867 	DBG_ERROR( "not implemented!" );
2868 }
2869 
2870 // XNameAccess
2871 uno::Any SAL_CALL SdDocLinkTargets::getByName( const OUString& aName )
2872 	throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
2873 {
2874 	OGuard aGuard( Application::GetSolarMutex() );
2875 
2876 	if( NULL == mpModel )
2877 		throw lang::DisposedException();
2878 
2879 	SdPage* pPage = FindPage( aName );
2880 
2881 	if( pPage == NULL )
2882 		throw container::NoSuchElementException();
2883 
2884 	uno::Any aAny;
2885 
2886 	uno::Reference< beans::XPropertySet > xProps( pPage->getUnoPage(), uno::UNO_QUERY );
2887 	if( xProps.is() )
2888 		aAny <<= xProps;
2889 
2890 	return aAny;
2891 }
2892 
2893 uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getElementNames()
2894 	throw(uno::RuntimeException)
2895 {
2896 	OGuard aGuard( Application::GetSolarMutex() );
2897 
2898 	if( NULL == mpModel )
2899 		throw lang::DisposedException();
2900 
2901 	SdDrawDocument* mpDoc = mpModel->GetDoc();
2902 	if( mpDoc == NULL )
2903 	{
2904 		uno::Sequence< OUString > aSeq;
2905 		return aSeq;
2906 	}
2907 
2908 	if( mpDoc->GetDocumentType() == DOCUMENT_TYPE_DRAW )
2909 	{
2910 		const sal_uInt16 nMaxPages = mpDoc->GetSdPageCount( PK_STANDARD );
2911 		const sal_uInt16 nMaxMasterPages = mpDoc->GetMasterSdPageCount( PK_STANDARD );
2912 
2913 		uno::Sequence< OUString > aSeq( nMaxPages + nMaxMasterPages );
2914 		OUString* pStr = aSeq.getArray();
2915 
2916 		sal_uInt16 nPage;
2917 		// standard pages
2918 		for( nPage = 0; nPage < nMaxPages; nPage++ )
2919 			*pStr++ = mpDoc->GetSdPage( nPage, PK_STANDARD )->GetName();
2920 
2921 		// master pages
2922 		for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
2923 			*pStr++ = mpDoc->GetMasterSdPage( nPage, PK_STANDARD )->GetName();
2924 		return aSeq;
2925 	}
2926 	else
2927 	{
2928 		const sal_uInt16 nMaxPages = mpDoc->GetPageCount();
2929 		const sal_uInt16 nMaxMasterPages = mpDoc->GetMasterPageCount();
2930 
2931 		uno::Sequence< OUString > aSeq( nMaxPages + nMaxMasterPages );
2932 		OUString* pStr = aSeq.getArray();
2933 
2934 		sal_uInt16 nPage;
2935 		// standard pages
2936 		for( nPage = 0; nPage < nMaxPages; nPage++ )
2937 			*pStr++ = ((SdPage*)mpDoc->GetPage( nPage ))->GetName();
2938 
2939 		// master pages
2940 		for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
2941 			*pStr++ = ((SdPage*)mpDoc->GetMasterPage( nPage ))->GetName();
2942 		return aSeq;
2943 	}
2944 }
2945 
2946 sal_Bool SAL_CALL SdDocLinkTargets::hasByName( const OUString& aName )
2947 	throw(uno::RuntimeException)
2948 {
2949 	OGuard aGuard( Application::GetSolarMutex() );
2950 
2951 	if( NULL == mpModel )
2952 		throw lang::DisposedException();
2953 
2954 	return FindPage( aName ) != NULL;
2955 }
2956 
2957 // container::XElementAccess
2958 uno::Type SAL_CALL SdDocLinkTargets::getElementType()
2959 	throw(uno::RuntimeException)
2960 {
2961 	return ITYPE(beans::XPropertySet);
2962 }
2963 
2964 sal_Bool SAL_CALL SdDocLinkTargets::hasElements()
2965 	throw(uno::RuntimeException)
2966 {
2967 	OGuard aGuard( Application::GetSolarMutex() );
2968 
2969 	if( NULL == mpModel )
2970 		throw lang::DisposedException();
2971 
2972 	return mpModel->GetDoc() != NULL;
2973 }
2974 
2975 SdPage* SdDocLinkTargets::FindPage( const OUString& rName ) const throw()
2976 {
2977 	SdDrawDocument* mpDoc = mpModel->GetDoc();
2978 	if( mpDoc == NULL )
2979 		return NULL;
2980 
2981 	const sal_uInt16 nMaxPages = mpDoc->GetPageCount();
2982 	const sal_uInt16 nMaxMasterPages = mpDoc->GetMasterPageCount();
2983 
2984 	sal_uInt16 nPage;
2985 	SdPage* pPage;
2986 
2987 	const String aName( rName );
2988 
2989 	const bool bDraw = mpDoc->GetDocumentType() == DOCUMENT_TYPE_DRAW;
2990 
2991 	// standard pages
2992 	for( nPage = 0; nPage < nMaxPages; nPage++ )
2993 	{
2994 		pPage = (SdPage*)mpDoc->GetPage( nPage );
2995 		if( (pPage->GetName() == aName) && (!bDraw || (pPage->GetPageKind() == PK_STANDARD)) )
2996 			return pPage;
2997 	}
2998 
2999 	// master pages
3000 	for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
3001 	{
3002 		pPage = (SdPage*)mpDoc->GetMasterPage( nPage );
3003 		if( (pPage->GetName() == aName) && (!bDraw || (pPage->GetPageKind() == PK_STANDARD)) )
3004 			return pPage;
3005 	}
3006 
3007 	return NULL;
3008 }
3009 
3010 // XServiceInfo
3011 OUString SAL_CALL SdDocLinkTargets::getImplementationName()
3012 	throw(uno::RuntimeException)
3013 {
3014 	return OUString( RTL_CONSTASCII_USTRINGPARAM("SdDocLinkTargets") );
3015 }
3016 
3017 sal_Bool SAL_CALL SdDocLinkTargets::supportsService( const OUString& ServiceName )
3018 	throw(uno::RuntimeException)
3019 {
3020 	return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
3021 }
3022 
3023 uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getSupportedServiceNames()
3024 	throw(uno::RuntimeException)
3025 {
3026 	const OUString aSN( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.LinkTargets") );
3027 	uno::Sequence< OUString > aSeq( &aSN, 1 );
3028 	return aSeq;
3029 }
3030 
3031 rtl::Reference< SdXImpressDocument > SdXImpressDocument::GetModel( SdDrawDocument* pDocument )
3032 {
3033 	rtl::Reference< SdXImpressDocument > xRet;
3034 	if( pDocument )
3035 	{
3036 		::sd::DrawDocShell* pDocShell = pDocument->GetDocSh();
3037 		if( pDocShell )
3038 		{
3039 			uno::Reference<frame::XModel> xModel(pDocShell->GetModel());
3040 
3041 			xRet.set( dynamic_cast< SdXImpressDocument* >( xModel.get() ) );
3042 		}
3043 	}
3044 
3045 	return xRet;
3046 }
3047 
3048 void NotifyDocumentEvent( SdDrawDocument* pDocument, const rtl::OUString& rEventName )
3049 {
3050 	rtl::Reference< SdXImpressDocument > xModel( SdXImpressDocument::GetModel( pDocument ) );
3051 
3052 	if( xModel.is() )
3053 	{
3054 		uno::Reference< uno::XInterface > xSource( static_cast<uno::XWeak*>( xModel.get() ) );
3055 		::com::sun::star::document::EventObject aEvent( xSource, rEventName );
3056 		xModel->notifyEvent(aEvent );
3057 	}
3058 }
3059 
3060 void NotifyDocumentEvent( SdDrawDocument* pDocument, const rtl::OUString& rEventName, const uno::Reference< uno::XInterface >& xSource )
3061 {
3062 	rtl::Reference< SdXImpressDocument > xModel( SdXImpressDocument::GetModel( pDocument ) );
3063 
3064 	if( xModel.is() )
3065 	{
3066 		::com::sun::star::document::EventObject aEvent( xSource, rEventName );
3067 		xModel->notifyEvent(aEvent );
3068 	}
3069 }
3070