LCOV - code coverage report
Current view: top level - libreoffice/sd/source/ui/unoidl - unomodel.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 521 1434 36.3 %
Date: 2012-12-27 Functions: 49 115 42.6 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10