/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sd.hxx"
#include <osl/endian.h>
#include <eppt.hxx>
#include "epptdef.hxx"
#ifndef _PptEscherEx_HXX
#include "escherex.hxx"
#endif
#include <tools/poly.hxx>
#include <vcl/bmpacc.hxx>
#include <vcl/gradient.hxx>
#include <vcl/gfxlink.hxx>
#include <tools/stream.hxx>
#include <sot/storage.hxx>
#include <vcl/outdev.hxx>
#include <vcl/virdev.hxx>
#include <vcl/gradient.hxx>
#include <sfx2/app.hxx>
#include <svl/languageoptions.hxx>
//#ifndef _SVX_XIT_HXX
//#include <svx/xit.hxx>
//#endif
#include <editeng/svxenum.hxx>
#include <svx/unoapi.hxx>
#include <svx/svdoashp.hxx>
#include <com/sun/star/style/VerticalAlignment.hpp>
#include <com/sun/star/container/XIndexReplace.hpp>
#include <com/sun/star/presentation/XPresentationPage.hpp>
#include <com/sun/star/awt/XFont.hpp>
#ifndef _COM_SUN_STAR_AWT_XFONTWEIGHT_HPP_
#include <com/sun/star/awt/FontWeight.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XFONTUNDERLINE_HPP_
#include <com/sun/star/awt/FontUnderline.hpp>
#endif
#include <com/sun/star/style/ParagraphAdjust.hpp>
#include <com/sun/star/style/LineSpacing.hpp>
#include <com/sun/star/style/LineSpacingMode.hpp>
#ifndef _COM_SUN_STAR_STYLE_XSTYLEFAMILIESSUPPLIER_PP_
#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#endif
#include <com/sun/star/style/XStyle.hpp>
#include <com/sun/star/drawing/PointSequence.hpp>
#include <com/sun/star/drawing/FlagSequence.hpp>
#include <com/sun/star/drawing/PolygonFlags.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/drawing/XControlShape.hpp>
#include <comphelper/processfactory.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/i18n/XBreakIterator.hpp>
#include <com/sun/star/i18n/XScriptTypeDetector.hpp>
#include <com/sun/star/i18n/ScriptType.hpp>
#include <com/sun/star/i18n/ScriptDirection.hpp>
#include <com/sun/star/embed/Aspects.hpp>
#include <vcl/cvtgrf.hxx>
#include <tools/urlobj.hxx>
#ifndef _CPPUHELPER_EXTRACT_HXX_
#include <comphelper/extract.hxx>
#endif
#ifndef _CPPUHELPER_PROPTYPEHLP_HXX_
#include <cppuhelper/proptypehlp.hxx>
#endif
#ifndef _UCBHELPER_CONTENT_HXX_
#include <ucbhelper/content.hxx>
#endif
#ifndef _UCBHELPER_CONTENTBROKER_HXX_
#include <ucbhelper/contentbroker.hxx>
#endif
#ifndef _TOOLKIT_UNOHLP_HXX
#include <toolkit/unohlp.hxx>
#endif
#include <rtl/crc.h>
#include <sot/clsids.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <com/sun/star/text/FontRelief.hpp>
#include <editeng/frmdiritem.hxx>
/*
#include <editeng/outliner.hxx>
#include <editeng/outlobj.hxx>
#include <svx/svdmodel.hxx>
*/
#include <svtools/fltcall.hxx>
#include <com/sun/star/table/XTable.hpp>
#include <com/sun/star/table/XMergeableCell.hpp>
#include <com/sun/star/table/BorderLine.hpp>
#include <set>

//#include <svx/xbtmpit.hxx>

#include "i18npool/mslangid.hxx"

#include <vos/xception.hxx>
using namespace vos;

using namespace ::com::sun::star;

////////////////////////////////////////////////////////////////////////////////////////////////////

#define ANSI_CHARSET            0
#define DEFAULT_CHARSET         1
#define SYMBOL_CHARSET          2
#define SHIFTJIS_CHARSET        128
#define HANGEUL_CHARSET         129
#define CHINESEBIG5_CHARSET     136
#define OEM_CHARSET             255

////////////////////////////////////////////////////////////////////////////////////////////////////

/* Font Families */
#define FF_DONTCARE             0x00
#define FF_ROMAN                0x10
#define FF_SWISS                0x20
#define FF_MODERN               0x30
#define FF_SCRIPT               0x40
#define FF_DECORATIVE           0x50

////////////////////////////////////////////////////////////////////////////////////////////////////

#define DEFAULT_PITCH           0x00
#define FIXED_PITCH             0x01
#define VARIABLE_PITCH          0x02

// ---------------------------------------------------------------------------------------------

com::sun::star::uno::Reference< com::sun::star::i18n::XBreakIterator > xPPTBreakIter;
com::sun::star::uno::Reference< com::sun::star::i18n::XScriptTypeDetector > xScriptTypeDetector;

PPTExBulletProvider::PPTExBulletProvider()
{
    pGraphicProv = new EscherGraphicProvider( _E_GRAPH_PROV_USE_INSTANCES  | _E_GRAPH_PROV_DO_NOT_ROTATE_METAFILES );
}

PPTExBulletProvider::~PPTExBulletProvider()
{
    delete pGraphicProv;
}

sal_uInt16 PPTExBulletProvider::GetId( const ByteString& rUniqueId, Size& rGraphicSize )
{
    sal_uInt16 nRetValue = 0xffff;
    sal_uInt32 nId = 0;

    if ( rUniqueId.Len() )
    {
		Rectangle       aRect;
        GraphicObject   aGraphicObject( rUniqueId );
        Graphic         aMappedGraphic, aGraphic( aGraphicObject.GetGraphic() );
        Size            aPrefSize( aGraphic.GetPrefSize() );
        BitmapEx        aBmpEx( aGraphic.GetBitmapEx() );

		if ( rGraphicSize.Width() && rGraphicSize.Height() )
		{
			double          fQ1 = ( (double)aPrefSize.Width() / (double)aPrefSize.Height() );
			double          fQ2 = ( (double)rGraphicSize.Width() / (double)rGraphicSize.Height() );
			double          fXScale = 1;
			double          fYScale = 1;

			if ( fQ1 > fQ2 )
				fYScale = fQ1 / fQ2;
			else if ( fQ1 < fQ2 )
				fXScale = fQ2 / fQ1;

			if ( ( fXScale != 1.0 ) || ( fYScale != 1.0 ) )
			{
				aBmpEx.Scale( fXScale, fYScale );
				Size aNewSize( (sal_Int32)((double)rGraphicSize.Width() / fXScale + 0.5 ),
								(sal_Int32)((double)rGraphicSize.Height() / fYScale + 0.5 ) );

				rGraphicSize = aNewSize;

				aMappedGraphic = Graphic( aBmpEx );
				aGraphicObject = GraphicObject( aMappedGraphic );
			}
		}

		nId = pGraphicProv->GetBlibID( aBuExPictureStream, aGraphicObject.GetUniqueID(), aRect, NULL, NULL );

        if ( nId && ( nId < 0x10000 ) )
            nRetValue = (sal_uInt16)nId - 1;
    }
    return nRetValue;
}

// ---------------------------------------------------------------------------------------------

GroupTable::GroupTable() :
    mnCurrentGroupEntry ( 0 ),
    mnMaxGroupEntry     ( 0 ),
    mnGroupsClosed      ( 0 ),
    mpGroupEntry        ( NULL )
{
    ImplResizeGroupTable( 32 );
}

// ---------------------------------------------------------------------------------------------

GroupTable::~GroupTable()
{
    for ( sal_uInt32 i = 0; i < mnCurrentGroupEntry; delete mpGroupEntry[ i++ ] ) ;
    delete[] mpGroupEntry;
}

// ---------------------------------------------------------------------------------------------

void GroupTable::ImplResizeGroupTable( sal_uInt32 nEntrys )
{
    if ( nEntrys > mnMaxGroupEntry )
    {
        mnMaxGroupEntry         = nEntrys;
        GroupEntry** pTemp = new GroupEntry*[ nEntrys ];
        for ( sal_uInt32 i = 0; i < mnCurrentGroupEntry; i++ )
            pTemp[ i ] = mpGroupEntry[ i ];
        if ( mpGroupEntry )
            delete[] mpGroupEntry;
        mpGroupEntry = pTemp;
    }
}

// ---------------------------------------------------------------------------------------------

sal_Bool GroupTable::EnterGroup( ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess >& rXIndexAccessRef )
{
    sal_Bool bRet = sal_False;
    if ( rXIndexAccessRef.is() )
    {
        GroupEntry* pNewGroup = new GroupEntry( rXIndexAccessRef );
        if ( pNewGroup->mnCount )
        {
            if ( mnMaxGroupEntry == mnCurrentGroupEntry )
                ImplResizeGroupTable( mnMaxGroupEntry + 8 );
            mpGroupEntry[ mnCurrentGroupEntry++ ] = pNewGroup;
            bRet = sal_True;
        }
        else
            delete pNewGroup;
    }
    return bRet;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 GroupTable::GetGroupsClosed()
{
    sal_uInt32 nRet = mnGroupsClosed;
    mnGroupsClosed = 0;
    return nRet;
}

// ---------------------------------------------------------------------------------------------

void GroupTable::ClearGroupTable()
{
    for ( sal_uInt32 i = 0; i < mnCurrentGroupEntry; i++, delete mpGroupEntry[ i ] ) ;
    mnCurrentGroupEntry = 0;
}

// ---------------------------------------------------------------------------------------------

void GroupTable::ResetGroupTable( sal_uInt32 nCount )
{
    ClearGroupTable();
    mpGroupEntry[ mnCurrentGroupEntry++ ] = new GroupEntry( nCount );
}

// ---------------------------------------------------------------------------------------------

sal_Bool GroupTable::GetNextGroupEntry()
{
    while ( mnCurrentGroupEntry )
    {
        mnIndex = mpGroupEntry[ mnCurrentGroupEntry - 1 ]->mnCurrentPos++;

        if ( mpGroupEntry[ mnCurrentGroupEntry - 1 ]->mnCount > mnIndex )
            return sal_True;

        delete ( mpGroupEntry[ --mnCurrentGroupEntry ] );

        if ( mnCurrentGroupEntry )
            mnGroupsClosed++;
    }
    return sal_False;
}

// ---------------------------------------------------------------------------------------------

FontCollectionEntry::~FontCollectionEntry()
{
}

// ---------------------------------------------------------------------------------------------

void FontCollectionEntry::ImplInit( const String& rName )
{
    String aSubstName( GetSubsFontName( rName, SUBSFONT_ONLYONE | SUBSFONT_MS ) );
    if ( aSubstName.Len() )
    {
        Name = aSubstName;
        bIsConverted = sal_True;
    }
    else
    {
        Name = rName;
        bIsConverted = sal_False;
    }
}

FontCollection::~FontCollection()
{
    for( void* pStr = List::First(); pStr; pStr = List::Next() )
        delete (FontCollectionEntry*)pStr;
    delete pVDev;
	xPPTBreakIter = NULL;
	xScriptTypeDetector = NULL;
}

FontCollection::FontCollection() :
    pVDev ( NULL )
{
	com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >
		xMSF = ::comphelper::getProcessServiceFactory();
	com::sun::star::uno::Reference< com::sun::star::uno::XInterface >
		xInterface = xMSF->createInstance( rtl::OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) );
	if ( xInterface.is() )
		xPPTBreakIter = com::sun::star::uno::Reference< com::sun::star::i18n::XBreakIterator >
			( xInterface, com::sun::star::uno::UNO_QUERY );

	xInterface = xMSF->createInstance( rtl::OUString::createFromAscii( "com.sun.star.i18n.ScriptTypeDetector" ) );
	if ( xInterface.is() )
		xScriptTypeDetector = com::sun::star::uno::Reference< com::sun::star::i18n::XScriptTypeDetector >
			( xInterface, com::sun::star::uno::UNO_QUERY );
}

short FontCollection::GetScriptDirection( const String& rString ) const
{
	short nRet = com::sun::star::i18n::ScriptDirection::NEUTRAL;
	if ( xScriptTypeDetector.is() )
	{
		const rtl::OUString sT( rString );
		nRet = xScriptTypeDetector->getScriptDirection( sT, 0, com::sun::star::i18n::ScriptDirection::NEUTRAL );
	}
	return nRet;
}

sal_uInt32 FontCollection::GetId( FontCollectionEntry& rEntry )
{
    if( rEntry.Name.Len() )
    {
        const sal_uInt32 nFonts = GetCount();

        for( sal_uInt32 i = 0; i < nFonts; i++ )
        {
            const FontCollectionEntry* pEntry = GetById( i );
            if( pEntry->Name == rEntry.Name )
                return i;
        }
		Font aFont;
		aFont.SetCharSet( rEntry.CharSet );
		aFont.SetName( rEntry.Original );
//		aFont.SetFamily( rEntry.Family );
//		aFont.SetPitch( rEntry.Pitch );
        aFont.SetHeight( 100 );

        if ( !pVDev )
            pVDev = new VirtualDevice;

        pVDev->SetFont( aFont );
		FontMetric aMetric( pVDev->GetFontMetric() );

        sal_uInt16 nTxtHeight = (sal_uInt16)aMetric.GetAscent() + (sal_uInt16)aMetric.GetDescent();

        if ( nTxtHeight )
        {
		    double fScaling = (double)nTxtHeight / 120.0;
            if ( ( fScaling > 0.50 ) && ( fScaling < 1.5 ) )
                rEntry.Scaling = fScaling;
        }

        List::Insert( new FontCollectionEntry( rEntry ), LIST_APPEND );
        return nFonts;
    }
    return 0;
}

const FontCollectionEntry* FontCollection::GetById( sal_uInt32 nId )
{
    return (FontCollectionEntry*)List::GetObject( nId );
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplVBAInfoContainer( SvStream* pStrm )
{
    sal_uInt32 nSize = 28;
    if ( pStrm )
    {
        *pStrm << (sal_uInt32)( 0x1f | ( EPP_VBAInfo << 16 ) )
               << (sal_uInt32)( nSize - 8 )
               << (sal_uInt32)( 2 | ( EPP_VBAInfoAtom << 16 ) )
               << (sal_uInt32)12;
        mpPptEscherEx->InsertPersistOffset( EPP_Persist_VBAInfoAtom, pStrm->Tell() );
        *pStrm << (sal_uInt32)0
               << (sal_uInt32)0
               << (sal_uInt32)1;
    }
    return nSize;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplSlideViewInfoContainer( sal_uInt32 nInstance, SvStream* pStrm )
{
    sal_uInt32 nSize = 111;
    if ( pStrm )
    {
        sal_uInt8 bShowGuides = 0;
        sal_uInt8 bSnapToGrid = 1;
        sal_uInt8 bSnapToShape = 0;

        sal_Int32 nScaling = 85;
        sal_Int32 nMasterCoordinate = 0xdda;
        sal_Int32 nXOrigin = -780;
        sal_Int32 nYOrigin = -84;

        sal_Int32 nPosition1 = 0x870;
        sal_Int32 nPosition2 = 0xb40;

        if ( nInstance )
        {
            bShowGuides = 1;
            nScaling = 0x3b;
            nMasterCoordinate = 0xf0c;
            nXOrigin = -1752;
            nYOrigin = -72;
            nPosition1 = 0xb40;
            nPosition2 = 0x870;
        }
        *pStrm << (sal_uInt32)( 0xf | ( EPP_SlideViewInfo << 16 ) | ( nInstance << 4 ) )
               << (sal_uInt32)( nSize - 8 )
               << (sal_uInt32)( EPP_SlideViewInfoAtom << 16 ) << (sal_uInt32)3
               << bShowGuides << bSnapToGrid << bSnapToShape
               << (sal_uInt32)( EPP_ViewInfoAtom << 16 ) << (sal_uInt32)52
               << nScaling << (sal_Int32)100 << nScaling << (sal_Int32)100  // scaling atom - Keeps the current scale
               << nScaling << (sal_Int32)100 << nScaling << (sal_Int32)100  // scaling atom - Keeps the previous scale
               << (sal_Int32)0x17ac << nMasterCoordinate// Origin - Keeps the origin in master coordinates
               << nXOrigin << nYOrigin              // Origin
               << (sal_uInt8)1                          // Bool1 varScale - Set if zoom to fit is set
               << (sal_uInt8)0                          // bool1 draftMode - Not used
               << (sal_uInt16)0                         // padword
               << (sal_uInt32)( ( 7 << 4 ) | ( EPP_GuideAtom << 16 ) ) << (sal_uInt32)8
               << (sal_uInt32)0     // Type of the guide. If the guide is horizontal this value is zero. If it's vertical, it's one.
               << nPosition1    // Position of the guide in master coordinates. X coordinate if it's vertical, and Y coordinate if it's horizontal.
               << (sal_uInt32)( ( 7 << 4 ) | ( EPP_GuideAtom << 16 ) ) << (sal_uInt32)8
               << (sal_Int32)1      // Type of the guide. If the guide is horizontal this value is zero. If it's vertical, it's one.
               << nPosition2;   // Position of the guide in master coordinates. X coordinate if it's vertical, and Y coordinate if it's horizontal.
    }
    return nSize;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplOutlineViewInfoContainer( SvStream* pStrm )
{
    sal_uInt32 nSize = 68;
    if ( pStrm )
    {
        *pStrm << (sal_uInt32)( 0xf | ( EPP_OutlineViewInfo << 16 ) ) << (sal_uInt32)( nSize - 8 )
               << (sal_uInt32)( EPP_ViewInfoAtom << 16 ) << (sal_uInt32)52
               << (sal_Int32)170 << (sal_Int32)200 << (sal_Int32)170 << (sal_Int32)200  // scaling atom - Keeps the current scale
               << (sal_Int32)170 << (sal_Int32)200 << (sal_Int32)170 << (sal_Int32)200  // scaling atom - Keeps the previous scale
               << (sal_Int32)0x17ac << 0xdda    // Origin - Keeps the origin in master coordinates
               << (sal_Int32)-780 << (sal_Int32)-84 // Origin
               << (sal_uInt8)1                  // bool1 varScale - Set if zoom to fit is set
               << (sal_uInt8)0                  // bool1 draftMode - Not used
               << (sal_uInt16)0;                // padword
    }
    return nSize;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplProgBinaryTag( SvStream* pStrm )
{
    sal_uInt32 nPictureStreamSize, nOutlineStreamSize, nSize = 8;

    nPictureStreamSize = aBuExPictureStream.Tell();
    if ( nPictureStreamSize )
        nSize += nPictureStreamSize + 8;

    nOutlineStreamSize = aBuExOutlineStream.Tell();
    if ( nOutlineStreamSize )
        nSize += nOutlineStreamSize + 8;

    if ( pStrm )
    {
        *pStrm << (sal_uInt32)( EPP_BinaryTagData << 16 ) << (sal_uInt32)( nSize - 8 );
        if ( nPictureStreamSize )
        {
            *pStrm << (sal_uInt32)( 0xf | ( EPP_PST_ExtendedBuGraContainer << 16 ) ) << nPictureStreamSize;
            pStrm->Write( aBuExPictureStream.GetData(), nPictureStreamSize );
        }
        if ( nOutlineStreamSize )
        {
            *pStrm << (sal_uInt32)( 0xf | ( EPP_PST_ExtendedPresRuleContainer << 16 ) ) << nOutlineStreamSize;
            pStrm->Write( aBuExOutlineStream.GetData(), nOutlineStreamSize );
        }
    }
    return nSize;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplProgBinaryTagContainer( SvStream* pStrm, SvMemoryStream* pBinTagStrm )
{
    sal_uInt32 nSize = 8 + 8 + 14;
    if ( pStrm )
    {
        *pStrm << (sal_uInt32)( 0xf | ( EPP_ProgBinaryTag << 16 ) ) << (sal_uInt32)0
               << (sal_uInt32)( EPP_CString << 16 ) << (sal_uInt32)14
               << (sal_uInt32)0x5f005f << (sal_uInt32)0x50005f
               << (sal_uInt32)0x540050 << (sal_uInt16)0x39;
    }
    if ( pBinTagStrm )
    {
        sal_uInt32 nLen = pBinTagStrm->Tell();
        nSize += nLen + 8;
        *pStrm << (sal_uInt32)( EPP_BinaryTagData << 16 ) << nLen;
        pStrm->Write( pBinTagStrm->GetData(), nLen );
    }
    else
        nSize += ImplProgBinaryTag( pStrm );

    if ( pStrm )
    {
        pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
        *pStrm << (sal_uInt32)( nSize - 8 );
        pStrm->SeekRel( nSize - 8 );
    }
    return nSize;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplProgTagContainer( SvStream* pStrm, SvMemoryStream* pBinTagStrm )
{
    sal_uInt32 nSize = 0;
    if ( aBuExPictureStream.Tell() || aBuExOutlineStream.Tell() || pBinTagStrm )
    {
        nSize = 8;
        if ( pStrm )
        {
            *pStrm << (sal_uInt32)( 0xf | ( EPP_ProgTags << 16 ) ) << (sal_uInt32)0;
        }
        nSize += ImplProgBinaryTagContainer( pStrm, pBinTagStrm );
        if ( pStrm )
        {
            pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
            *pStrm << (sal_uInt32)( nSize - 8 );
            pStrm->SeekRel( nSize - 8 );
        }
    }
    return nSize;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplDocumentListContainer( SvStream* pStrm )
{
    sal_uInt32 nSize = 8;
    if ( pStrm )
    {
        *pStrm << (sal_uInt32)( ( EPP_List << 16 ) | 0xf ) << (sal_uInt32)0;
    }

    nSize += ImplVBAInfoContainer( pStrm );
    nSize += ImplSlideViewInfoContainer( 0, pStrm );
    nSize += ImplOutlineViewInfoContainer( pStrm );
    nSize += ImplSlideViewInfoContainer( 1, pStrm );
    nSize += ImplProgTagContainer( pStrm );

    if ( pStrm )
    {
        pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
        *pStrm << (sal_uInt32)( nSize - 8 );
        pStrm->SeekRel( nSize - 8 );
    }
    return nSize;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplMasterSlideListContainer( SvStream* pStrm )
{
    sal_uInt32 i, nSize = 28 * mnMasterPages + 8;
    if ( pStrm )
    {
        *pStrm << (sal_uInt32)( 0x1f | ( EPP_SlideListWithText << 16 ) ) << (sal_uInt32)( nSize - 8 );

        for ( i = 0; i < mnMasterPages; i++ )
        {
            *pStrm << (sal_uInt32)( EPP_SlidePersistAtom << 16 ) << (sal_uInt32)20;
            mpPptEscherEx->InsertPersistOffset( EPP_MAINMASTER_PERSIST_KEY | i, pStrm->Tell() );
            *pStrm << (sal_uInt32)0                 // psrReference - logical reference to the slide persist object ( EPP_MAINMASTER_PERSIST_KEY )
                   << (sal_uInt32)0                 // flags - only bit 3 used, if set then slide contains shapes other than placeholders
                   << (sal_Int32)0                  // numberTexts - number of placeholder texts stored with the persist object. Allows to display outline view without loading the slide persist objects
                   << (sal_Int32)( 0x80000000 | i ) // slideId - Unique slide identifier, used for OLE link monikers for example
                   << (sal_uInt32)0;                // reserved, usually 0
        }
    }
    return nSize;
}

// ---------------------------------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplInsertBookmarkURL( const String& rBookmarkURL, const sal_uInt32 nType,
	const String& rStringVer0, const String& rStringVer1, const String& rStringVer2, const String& rStringVer3 )
{
    sal_uInt32 nHyperId = ++mnExEmbed;

	rtl::OUString sBookmarkURL( rBookmarkURL );
	INetURLObject aBaseURI( maBaseURI );
	INetURLObject aBookmarkURI( rBookmarkURL );
	if( aBaseURI.GetProtocol() == aBookmarkURI.GetProtocol() )
	{
		rtl::OUString aRelUrl( INetURLObject::GetRelURL( maBaseURI, rBookmarkURL, 
			INetURLObject::WAS_ENCODED, INetURLObject::DECODE_TO_IURI, RTL_TEXTENCODING_UTF8, INetURLObject::FSYS_DETECT ) );
		if ( aRelUrl.getLength() )
			sBookmarkURL = aRelUrl;
	}
    maHyperlink.Insert( new EPPTHyperlink( sBookmarkURL, nType ), LIST_APPEND );

    *mpExEmbed  << (sal_uInt16)0xf
                << (sal_uInt16)EPP_ExHyperlink
                << (sal_uInt32)0;
	sal_uInt32 nHyperSize, nHyperStart = mpExEmbed->Tell();
    *mpExEmbed  << (sal_uInt16)0
                << (sal_uInt16)EPP_ExHyperlinkAtom
                << (sal_uInt32)4
                << nHyperId;

	sal_uInt16 i, nStringLen;
	nStringLen = rStringVer0.Len();
	if ( nStringLen )
	{
		*mpExEmbed << (sal_uInt32)( EPP_CString << 16 ) << (sal_uInt32)( nStringLen * 2 );
		for ( i = 0; i < nStringLen; i++ )
		{
			*mpExEmbed << rStringVer0.GetChar( i );
		}
	}
	nStringLen = rStringVer1.Len();
	if ( nStringLen )
	{
		*mpExEmbed << (sal_uInt32)( ( EPP_CString << 16 ) | 0x10 ) << (sal_uInt32)( nStringLen * 2 );
		for ( i = 0; i < nStringLen; i++ )
		{
			*mpExEmbed << rStringVer1.GetChar( i );
		}
	}
	nStringLen = rStringVer2.Len();
	if ( nStringLen )
	{
		*mpExEmbed << (sal_uInt32)( ( EPP_CString << 16 ) | 0x20 ) << (sal_uInt32)( nStringLen * 2 );
		for ( i = 0; i < nStringLen; i++ )
		{
			*mpExEmbed << rStringVer2.GetChar( i );
		}
	}
	nStringLen = rStringVer3.Len();
	if ( nStringLen )
	{
		*mpExEmbed << (sal_uInt32)( ( EPP_CString << 16 ) | 0x30 ) << (sal_uInt32)( nStringLen * 2 );
		for ( i = 0; i < nStringLen; i++ )
		{
			*mpExEmbed << rStringVer3.GetChar( i );
		}
	}
	nHyperSize = mpExEmbed->Tell() - nHyperStart;
	mpExEmbed->SeekRel( - ( (sal_Int32)nHyperSize + 4 ) );
	*mpExEmbed  << nHyperSize;
	mpExEmbed->SeekRel( nHyperSize );
	return nHyperId;
}

// ---------------------------------------------------------------------------------------------

sal_Bool PPTWriter::ImplCloseDocument()
{
    sal_uInt32 nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_Document );
    if ( nOfs )
    {
        mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_CurrentPos, mpStrm->Tell() );
        mpStrm->Seek( nOfs );

		// creating the TxMasterStyleAtom
		SvMemoryStream aTxMasterStyleAtomStrm( 0x200, 0x200 );
		{
			EscherExAtom aTxMasterStyleAtom( aTxMasterStyleAtomStrm, EPP_TxMasterStyleAtom, EPP_TEXTTYPE_Other );
			aTxMasterStyleAtomStrm << (sal_uInt16)5;		// paragraph count
			sal_uInt16 nLev;
			sal_Bool bFirst = sal_True;
			for ( nLev = 0; nLev < 5; nLev++ )
			{
				mpStyleSheet->mpParaSheet[ EPP_TEXTTYPE_Other ]->Write( aTxMasterStyleAtomStrm, mpPptEscherEx, nLev, bFirst, sal_False, mXPagePropSet );
				mpStyleSheet->mpCharSheet[ EPP_TEXTTYPE_Other ]->Write( aTxMasterStyleAtomStrm, mpPptEscherEx, nLev, bFirst, sal_False, mXPagePropSet );
				bFirst = sal_False;
			}
        }

        mpExEmbed->Seek( STREAM_SEEK_TO_END );
        sal_uInt32 nExEmbedSize = mpExEmbed->Tell();

        // nEnviroment : Gesamtgroesse des Environment Containers
        sal_uInt32 nEnvironment = maFontCollection.GetCount() * 76      // 68 bytes pro Fontenityatom und je 8 Bytes fuer die Header
                                + 8                                     // 1 FontCollection Container
                                + 20                                    // SrKinsoku Container
                                + 18                                    // 1 TxSiStyleAtom
                                + aTxMasterStyleAtomStrm.Tell()			// 1 TxMasterStyleAtom;
                                + mpStyleSheet->SizeOfTxCFStyleAtom();

        sal_uInt32 nBytesToInsert = nEnvironment + 8;

        if ( nExEmbedSize )
            nBytesToInsert += nExEmbedSize + 8 + 12;

        nBytesToInsert += maSoundCollection.GetSize();
        nBytesToInsert += mpPptEscherEx->DrawingGroupContainerSize();
        nBytesToInsert += ImplMasterSlideListContainer( NULL );
        nBytesToInsert += ImplDocumentListContainer( NULL );

        // nBytes im Stream einfuegen, und abhaengige Container anpassen
        mpPptEscherEx->InsertAtCurrentPos( nBytesToInsert, false );

        // CREATE HYPERLINK CONTAINER
        if ( nExEmbedSize )
        {
            *mpStrm << (sal_uInt16)0xf
                    << (sal_uInt16)EPP_ExObjList
                    << (sal_uInt32)( nExEmbedSize + 12 )
                    << (sal_uInt16)0
                    << (sal_uInt16)EPP_ExObjListAtom
                    << (sal_uInt32)4
                    << (sal_uInt32)mnExEmbed;
            mpPptEscherEx->InsertPersistOffset( EPP_Persist_ExObj, mpStrm->Tell() );
            mpStrm->Write( mpExEmbed->GetData(), nExEmbedSize );
        }

        // CREATE ENVIRONMENT
        *mpStrm << (sal_uInt16)0xf << (sal_uInt16)EPP_Environment << (sal_uInt32)nEnvironment;

        // Open Container ( EPP_SrKinsoku )
        *mpStrm << (sal_uInt16)0x2f << (sal_uInt16)EPP_SrKinsoku << (sal_uInt32)12;
        mpPptEscherEx->AddAtom( 4, EPP_SrKinsokuAtom, 0, 3 );
        *mpStrm << (sal_Int32)0;                        // SrKinsoku Level 0

        // Open Container ( EPP_FontCollection )
        *mpStrm << (sal_uInt16)0xf << (sal_uInt16)EPP_FontCollection << (sal_uInt32)maFontCollection.GetCount() * 76;

        for ( sal_uInt32 i = 0; i < maFontCollection.GetCount(); i++ )
        {
            mpPptEscherEx->AddAtom( 68, EPP_FontEnityAtom, 0, i );
            const FontCollectionEntry* pDesc = maFontCollection.GetById( i );
            sal_uInt32 nFontLen = pDesc->Name.Len();
            if ( nFontLen > 31 )
                nFontLen = 31;
            for ( sal_uInt16 n = 0; n < 32; n++ )
            {
                sal_Unicode nUniCode = 0;
                if ( n < nFontLen )
                    nUniCode = pDesc->Name.GetChar( n );
                *mpStrm << nUniCode;
            }
            sal_uInt8   lfCharSet = ANSI_CHARSET;
            sal_uInt8   lfClipPrecision = 0;
            sal_uInt8   lfQuality = 6;
            sal_uInt8   lfPitchAndFamily = 0;

            if ( pDesc->CharSet == RTL_TEXTENCODING_SYMBOL )
                lfCharSet = SYMBOL_CHARSET;

            switch( pDesc->Family )
            {
                case ::com::sun::star::awt::FontFamily::ROMAN :
                    lfPitchAndFamily |= FF_ROMAN;
                break;

                case ::com::sun::star::awt::FontFamily::SWISS :
                    lfPitchAndFamily |= FF_SWISS;
                break;

                case ::com::sun::star::awt::FontFamily::MODERN :
                    lfPitchAndFamily |= FF_MODERN;
                break;

                case ::com::sun::star::awt::FontFamily::SCRIPT:
                    lfPitchAndFamily |= FF_SCRIPT;
                break;

                case ::com::sun::star::awt::FontFamily::DECORATIVE:
                     lfPitchAndFamily |= FF_DECORATIVE;
                break;

                default:
                    lfPitchAndFamily |= FAMILY_DONTKNOW;
                break;
            }
            switch( pDesc->Pitch )
            {
                case ::com::sun::star::awt::FontPitch::FIXED:
                    lfPitchAndFamily |= FIXED_PITCH;
                break;

                default:
                    lfPitchAndFamily |= DEFAULT_PITCH;
                break;
            }
            *mpStrm << lfCharSet
                    << lfClipPrecision
                    << lfQuality
                    << lfPitchAndFamily;
        }
        mpStyleSheet->WriteTxCFStyleAtom( *mpStrm );        // create style that is used for new standard objects
        mpPptEscherEx->AddAtom( 10, EPP_TxSIStyleAtom );
        *mpStrm << (sal_uInt32)7                        // ?
                << (sal_Int16)2                         // ?
                << (sal_uInt8)9                         // ?
                << (sal_uInt8)8                         // ?
                << (sal_Int16)0;                        // ?

		mpStrm->Write( aTxMasterStyleAtomStrm.GetData(), aTxMasterStyleAtomStrm.Tell() );
		maSoundCollection.Write( *mpStrm );
        mpPptEscherEx->WriteDrawingGroupContainer( *mpStrm );
        ImplMasterSlideListContainer( mpStrm );
        ImplDocumentListContainer( mpStrm );

        sal_uInt32 nOldPos = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_CurrentPos );
        if ( nOldPos )
        {
            mpStrm->Seek( nOldPos );
            return sal_True;
        }
    }
    return sal_False;
}

// ---------------------------------------------------------------------------------------------

sal_Bool PropValue::GetPropertyValue(
    ::com::sun::star::uno::Any& rAny,
        const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
            const String& rString,
                    sal_Bool bTestPropertyAvailability )
{
    sal_Bool bRetValue = sal_True;
    if ( bTestPropertyAvailability )
    {
        bRetValue = sal_False;
        try
        {
            ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
                aXPropSetInfo( rXPropSet->getPropertySetInfo() );
            if ( aXPropSetInfo.is() )
                bRetValue = aXPropSetInfo->hasPropertyByName( rString );
        }
        catch( ::com::sun::star::uno::Exception& )
        {
            bRetValue = sal_False;
        }
    }
    if ( bRetValue )
    {
        try
        {
            rAny = rXPropSet->getPropertyValue( rString );
            if ( !rAny.hasValue() )
                bRetValue = sal_False;
        }
        catch( ::com::sun::star::uno::Exception& )
        {
            bRetValue = sal_False;
        }
    }
    return bRetValue;
}

// ---------------------------------------------------------------------------------------------

::com::sun::star::beans::PropertyState PropValue::GetPropertyState(
    const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
        const String& rPropertyName )
{
    ::com::sun::star::beans::PropertyState eRetValue = ::com::sun::star::beans::PropertyState_AMBIGUOUS_VALUE;
    try
    {
        ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState > aXPropState
                ( rXPropSet, ::com::sun::star::uno::UNO_QUERY );
        if ( aXPropState.is() )
            eRetValue = aXPropState->getPropertyState( rPropertyName );
    }
    catch( ::com::sun::star::uno::Exception& )
    {
        //...
    }
    return eRetValue;
}

// ---------------------------------------------------------------------------------------------

sal_Bool PropValue::ImplGetPropertyValue( const String& rString )
{
    return GetPropertyValue( mAny, mXPropSet, rString );
}

// ---------------------------------------------------------------------------------------------

sal_Bool PropValue::ImplGetPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & aXPropSet, const String& rString )
{
    return GetPropertyValue( mAny, aXPropSet, rString );
}

// ---------------------------------------------------------------------------------------------

sal_Bool PropStateValue::ImplGetPropertyValue( const String& rString, sal_Bool bGetPropertyState )
{
    ePropState = ::com::sun::star::beans::PropertyState_AMBIGUOUS_VALUE;
    sal_Bool bRetValue = sal_True;
#ifdef UNX
        ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
            aXPropSetInfo( mXPropSet->getPropertySetInfo() );
        if ( !aXPropSetInfo.is() )
            return sal_False;
#endif
    try
    {
        mAny = mXPropSet->getPropertyValue( rString );
        if ( !mAny.hasValue() )
            bRetValue = sal_False;
        else if ( bGetPropertyState )
            ePropState = mXPropState->getPropertyState( rString );
        else
            ePropState = ::com::sun::star::beans::PropertyState_DIRECT_VALUE;
    }
    catch( ::com::sun::star::uno::Exception& )
    {
        bRetValue = sal_False;
    }
    return bRetValue;
}

// ---------------------------------------------------------------------------------------------

sal_Bool PPTWriter::ImplInitSOIface()
{
    while( sal_True )
    {
        mXDrawPagesSupplier = ::com::sun::star::uno::Reference<
            ::com::sun::star::drawing::XDrawPagesSupplier >
                ( mXModel, ::com::sun::star::uno::UNO_QUERY );
        if ( !mXDrawPagesSupplier.is() )
            break;

        mXMasterPagesSupplier = ::com::sun::star::uno::Reference<
            ::com::sun::star::drawing::XMasterPagesSupplier >
                ( mXModel, ::com::sun::star::uno::UNO_QUERY );
        if ( !mXMasterPagesSupplier.is() )
            break;
        mXDrawPages = mXMasterPagesSupplier->getMasterPages();
        if ( !mXDrawPages.is() )
            break;
        mnMasterPages = mXDrawPages->getCount();
        mXDrawPages = mXDrawPagesSupplier->getDrawPages();
        if( !mXDrawPages.is() )
            break;
        mnPages =  mXDrawPages->getCount();
        if ( !ImplGetPageByIndex( 0, NORMAL ) )
            break;

        return sal_True;
    }
    return sal_False;
}

// ---------------------------------------------------------------------------------------------

sal_Bool PPTWriter::ImplSetCurrentStyleSheet( sal_uInt32 nPageNum )
{
	sal_Bool bRet = sal_False;
	if ( nPageNum >= maStyleSheetList.size() )
		nPageNum = 0;
	else
		bRet = sal_True;
	mpStyleSheet = maStyleSheetList[ nPageNum ];
	return bRet;
}

// ---------------------------------------------------------------------------------------------

sal_Bool PPTWriter::ImplGetPageByIndex( sal_uInt32 nIndex, PageType ePageType )
{
    while( sal_True )
    {
        if ( ePageType != meLatestPageType )
        {
            switch( ePageType )
            {
                case NORMAL :
                case NOTICE :
                {
                    mXDrawPages = mXDrawPagesSupplier->getDrawPages();
                    if( !mXDrawPages.is() )
                        return sal_False;
                }
                break;

                case MASTER :
                {
                    mXDrawPages = mXMasterPagesSupplier->getMasterPages();
                    if( !mXDrawPages.is() )
                        return sal_False;
                }
                break;
				default:
					break;
            }
            meLatestPageType = ePageType;
        }
        ::com::sun::star::uno::Any aAny( mXDrawPages->getByIndex( nIndex ) );
        aAny >>= mXDrawPage;
        if ( !mXDrawPage.is() )
            break;
        if ( ePageType == NOTICE )
        {
            ::com::sun::star::uno::Reference< ::com::sun::star::presentation::XPresentationPage >
                aXPresentationPage( mXDrawPage, ::com::sun::star::uno::UNO_QUERY );
            if ( !aXPresentationPage.is() )
                break;
            mXDrawPage = aXPresentationPage->getNotesPage();
            if ( !mXDrawPage.is() )
                break;
        }
        mXPagePropSet = ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
            ( mXDrawPage, ::com::sun::star::uno::UNO_QUERY );
        if ( !mXPagePropSet.is() )
            break;

        mXShapes = ::com::sun::star::uno::Reference<
            ::com::sun::star::drawing::XShapes >
                ( mXDrawPage, ::com::sun::star::uno::UNO_QUERY );
        if ( !mXShapes.is() )
            break;

		/* try to get the "real" background PropertySet. If the normal page is not supporting this property, it is
		   taken the property from the master */
		sal_Bool bHasBackground = GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Background" ) ), sal_True );
		if ( bHasBackground )
			bHasBackground = ( aAny >>= mXBackgroundPropSet );
		if ( !bHasBackground )
		{
		    ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XMasterPageTarget >
				aXMasterPageTarget( mXDrawPage, ::com::sun::star::uno::UNO_QUERY );
		    if ( aXMasterPageTarget.is() )
			{
				::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > aXMasterDrawPage;
				aXMasterDrawPage = aXMasterPageTarget->getMasterPage();
				if ( aXMasterDrawPage.is() )
				{
					::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > aXMasterPagePropSet;
					aXMasterPagePropSet = ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
						( aXMasterDrawPage, ::com::sun::star::uno::UNO_QUERY );
					if ( aXMasterPagePropSet.is() )
					{
						sal_Bool bBackground = GetPropertyValue( aAny, aXMasterPagePropSet,
								String( RTL_CONSTASCII_USTRINGPARAM( "Background" ) ) );
						if ( bBackground )
						{
							aAny >>= mXBackgroundPropSet;
						}
					}
				}
			}
		}
        return sal_True;
    }
    return sal_False;
}

// ---------------------------------------------------------------------------------------------

sal_Bool PPTWriter::ImplGetShapeByIndex( sal_uInt32 nIndex, sal_Bool bGroup )
{
    while(sal_True)
    {
        if (  ( bGroup == sal_False ) || ( GetCurrentGroupLevel() == 0 ) )
        {
            ::com::sun::star::uno::Any aAny( mXShapes->getByIndex( nIndex ) );
            aAny >>= mXShape;
        }
        else
        {
            ::com::sun::star::uno::Any aAny( GetCurrentGroupAccess()->getByIndex( GetCurrentGroupIndex() ) );
            aAny >>= mXShape;
        }
        if ( !mXShape.is() )
            break;

        ::com::sun::star::uno::Any aAny( mXShape->queryInterface( ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >*) 0 ) ));
        aAny >>= mXPropSet;

        if ( !mXPropSet.is() )
            break;
        maPosition = ImplMapPoint( mXShape->getPosition() );
        maSize = ImplMapSize( mXShape->getSize() );
        maRect = Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
        mType = ByteString( String( mXShape->getShapeType() ), RTL_TEXTENCODING_UTF8 );
        mType.Erase( 0, 13 );                                   // "com.sun.star." entfernen
        sal_uInt16 nPos = mType.Search( (const char*)"Shape" );
        mType.Erase( nPos, 5 );

        mbPresObj = mbEmptyPresObj = sal_False;
        if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "IsPresentationObject" ) ) ) )
            mAny >>= mbPresObj;

        if ( mbPresObj && ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "IsEmptyPresentationObject" ) ) ) )
            mAny >>= mbEmptyPresObj;

        mnAngle = ( PropValue::GetPropertyValue( aAny,
            mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "RotateAngle" ) ), sal_True ) )
                ? *((sal_Int32*)aAny.getValue() )
                : 0;

        return sal_True;
    }
    return sal_False;
}

//  -----------------------------------------------------------------------

sal_uInt32 PPTWriter::ImplGetMasterIndex( PageType ePageType )
{
    sal_uInt32 nRetValue = 0;
    ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XMasterPageTarget >
        aXMasterPageTarget( mXDrawPage, ::com::sun::star::uno::UNO_QUERY );

    if ( aXMasterPageTarget.is() )
    {
        ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >
            aXDrawPage = aXMasterPageTarget->getMasterPage();
        if ( aXDrawPage.is() )
        {
            ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
                aXPropertySet( aXDrawPage, ::com::sun::star::uno::UNO_QUERY );

            if ( aXPropertySet.is() )
            {
                if ( ImplGetPropertyValue( aXPropertySet, String( RTL_CONSTASCII_USTRINGPARAM( "Number" ) ) ) )
                    nRetValue |= *(sal_Int16*)mAny.getValue();
                if ( nRetValue & 0xffff )           // ueberlauf vermeiden
                    nRetValue--;
            }
        }
    }
    if ( ePageType == NOTICE )
        nRetValue += mnMasterPages;
    return nRetValue;
}

//  -----------------------------------------------------------------------

sal_Bool PPTWriter::ImplGetStyleSheets()
{
    int             nInstance, nLevel;
    sal_Bool        bRetValue = sal_False;
	sal_uInt32		nPageNum;

	for ( nPageNum = 0; nPageNum < mnMasterPages; nPageNum++ )
	{
		::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed >
			aXNamed;

		::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
			aXNameAccess;

		::com::sun::star::uno::Reference< ::com::sun::star::style::XStyleFamiliesSupplier >
			aXStyleFamiliesSupplier( mXModel, ::com::sun::star::uno::UNO_QUERY );

		::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
			aXPropSet( mXModel, ::com::sun::star::uno::UNO_QUERY );

		sal_uInt16 nDefaultTab = ( aXPropSet.is() && ImplGetPropertyValue( aXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TabStop" ) ) ) )
			? (sal_uInt16)( *(sal_Int32*)mAny.getValue() / 4.40972 )
			: 1250;

		maStyleSheetList.push_back( new PPTExStyleSheet( nDefaultTab, (PPTExBulletProvider&)*this ) );
		ImplSetCurrentStyleSheet( nPageNum );
		if ( ImplGetPageByIndex( nPageNum, MASTER ) )
			aXNamed = ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed >
						( mXDrawPage, ::com::sun::star::uno::UNO_QUERY );

		if ( aXStyleFamiliesSupplier.is() )
			aXNameAccess = aXStyleFamiliesSupplier->getStyleFamilies();

		bRetValue = aXNamed.is() && aXNameAccess.is() && aXStyleFamiliesSupplier.is();
		if  ( bRetValue )
		{
			for ( nInstance = EPP_TEXTTYPE_Title; nInstance <= EPP_TEXTTYPE_CenterTitle; nInstance++ )
			{
				String aStyle;
				String aFamily;
				switch ( nInstance )
				{
					case EPP_TEXTTYPE_CenterTitle :
					case EPP_TEXTTYPE_Title :
					{
						aStyle = String( RTL_CONSTASCII_USTRINGPARAM( "title" ) );
						aFamily = aXNamed->getName();
					}
					break;
					case EPP_TEXTTYPE_Body :
					{
						aStyle = String( RTL_CONSTASCII_USTRINGPARAM( "outline1" ) );      // SD_LT_SEPARATOR
						aFamily = aXNamed->getName();
					}
					break;
					case EPP_TEXTTYPE_Other :
					{
						aStyle = String( RTL_CONSTASCII_USTRINGPARAM( "standard" ) );
						aFamily = String( RTL_CONSTASCII_USTRINGPARAM( "graphics" ) );
					}
					break;
					case EPP_TEXTTYPE_CenterBody :
					{
						aStyle = String( RTL_CONSTASCII_USTRINGPARAM( "subtitle" ) );
						aFamily = aXNamed->getName();
					}
					break;
				}
				if ( aStyle.Len() && aFamily.Len() )
				{
					try
					{
						::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >xNameAccess;
						if ( aXNameAccess->hasByName( aFamily ) )
						{
							::com::sun::star::uno::Any aAny( aXNameAccess->getByName( aFamily ) );
							if( aAny.getValue() && ::cppu::extractInterface( xNameAccess, aAny ) )
							{
								::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > aXFamily;
								if ( aAny >>= aXFamily )
								{
									if ( aXFamily->hasByName( aStyle ) )
									{
										::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle > xStyle;
										aAny = aXFamily->getByName( aStyle );
										if( aAny.getValue() && ::cppu::extractInterface( xStyle, aAny ) )
										{
											::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle > aXStyle;
											aAny >>= aXStyle;
											::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
												xPropSet( aXStyle, ::com::sun::star::uno::UNO_QUERY );
											if( xPropSet.is() )
												mpStyleSheet->SetStyleSheet( xPropSet, maFontCollection, nInstance, 0 );
											for ( nLevel = 1; nLevel < 5; nLevel++ )
											{
												if ( nInstance == EPP_TEXTTYPE_Body )
												{
													sal_Unicode cTemp = aStyle.GetChar( aStyle.Len() - 1 );
													aStyle.SetChar( aStyle.Len() - 1, ++cTemp );
													if ( aXFamily->hasByName( aStyle ) )
													{
														aXFamily->getByName( aStyle ) >>= xStyle;
														if( xStyle.is() )
														{
															::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
																xPropertySet( xStyle, ::com::sun::star::uno::UNO_QUERY );
															if ( xPropertySet.is() )
																mpStyleSheet->SetStyleSheet( xPropertySet, maFontCollection, nInstance, nLevel );
														}
													}
												}
												else
													mpStyleSheet->SetStyleSheet( xPropSet, maFontCollection, nInstance, nLevel );
											}
										}
									}
								}
							}
						}
					}
					catch( ::com::sun::star::uno::Exception& )
					{
					//
					}
				}
			}
			for ( ; nInstance <= EPP_TEXTTYPE_QuarterBody; nInstance++ )
			{

			}
		}
	}
    return bRetValue;
}

//  -----------------------------------------------------------------------

void PPTWriter::ImplWriteParagraphs( SvStream& rOut, TextObj& rTextObj )
{
    sal_Bool            bFirstParagraph = sal_True;
    sal_uInt32          nCharCount;
    sal_uInt32          nPropertyFlags = 0;
    sal_uInt16          nDepth = 0;
    sal_Int16           nLineSpacing;
    int                 nInstance = rTextObj.GetInstance();

    for ( ParagraphObj* pPara = rTextObj.First() ; pPara; pPara = rTextObj.Next(), bFirstParagraph = sal_False )
    {
        PortionObj* pPortion = (PortionObj*)pPara->First();
        nCharCount = pPara->Count();

        nDepth = pPara->nDepth;
        if ( nDepth > 4)
            nDepth = 4;

        if ( ( pPara->meTextAdjust == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
            ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_Adjust, pPara->mnTextAdjust ) ) )
            nPropertyFlags |= 0x00000800;
        nLineSpacing = pPara->mnLineSpacing;

        const FontCollectionEntry* pDesc = maFontCollection.GetById( pPortion->mnFont );
        sal_Int16 nNormalSpacing = 100;
        if ( !mbFontIndependentLineSpacing && pDesc )
        {
            double fN = 100.0;
            fN *= pDesc->Scaling;
            nNormalSpacing = (sal_Int16)( fN + 0.5 );
        }
        if ( !mbFontIndependentLineSpacing && bFirstParagraph && ( nLineSpacing > nNormalSpacing ) )	// sj: i28747, no replacement for fixed linespacing
        {
            nLineSpacing = nNormalSpacing;
            nPropertyFlags |= 0x00001000;
        }
        else
        {
            if ( nLineSpacing > 0 )
            {
                if ( !mbFontIndependentLineSpacing && pDesc )
                     nLineSpacing = (sal_Int16)( (double)nLineSpacing * pDesc->Scaling + 0.5 );
            }
            else
            {
                if ( pPortion && pPortion->mnCharHeight > (sal_uInt16)( ((double)-nLineSpacing) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
                    nLineSpacing = nNormalSpacing;
                else
                    nLineSpacing = (sal_Int16)( (double)nLineSpacing / 4.40972 );
            }
            if ( ( pPara->meLineSpacing == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
                ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_LineFeed, nLineSpacing ) ) )
                nPropertyFlags |= 0x00001000;
        }
        if ( ( pPara->meLineSpacingTop == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
            ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mnLineSpacingTop ) ) )
            nPropertyFlags |= 0x00002000;
        if ( ( pPara->meLineSpacingBottom == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
            ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_LowerDist, pPara->mnLineSpacingBottom ) ) )
            nPropertyFlags |= 0x00004000;
        if ( ( pPara->meForbiddenRules == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
            ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mbForbiddenRules ) ) )
            nPropertyFlags |= 0x00020000;
        if ( ( pPara->meParagraphPunctation == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
            ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mbParagraphPunctation ) ) )
            nPropertyFlags |= 0x00080000;
		if ( ( pPara->meBiDi == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
			( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_BiDi, pPara->mnBiDi ) ) )
			nPropertyFlags |= 0x00200000;


        sal_Int32 nBuRealSize = pPara->nBulletRealSize;
        sal_Int16 nBulletFlags = pPara->nBulletFlags;

        if ( pPara->bExtendedParameters )
            nPropertyFlags |= pPara->nParaFlags;
        else
        {
            nPropertyFlags |= 1;            // turn off bullet explicit
            nBulletFlags = 0;
        }

        // Write nTextOfs and nBullets 
        if ( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_TextOfs, pPara->nTextOfs ) )
            nPropertyFlags |= 0x100;
        if ( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_BulletOfs, pPara->nBulletOfs ))
            nPropertyFlags |= 0x400;

        FontCollectionEntry aFontDescEntry( pPara->aFontDesc.Name, pPara->aFontDesc.Family, pPara->aFontDesc.Pitch, pPara->aFontDesc.CharSet );
        sal_uInt16  nFontId = (sal_uInt16)maFontCollection.GetId( aFontDescEntry );

        rOut << nCharCount
             << nDepth                          // Level
             << (sal_uInt32)nPropertyFlags;     // Paragraph Attribut Set

        if ( nPropertyFlags & 0xf )
            rOut << nBulletFlags;
        if ( nPropertyFlags & 0x80 )
            rOut << (sal_uInt16)( pPara->cBulletId );
        if ( nPropertyFlags & 0x10 )
            rOut << nFontId;
        if ( nPropertyFlags & 0x40 )
            rOut << (sal_Int16)nBuRealSize;
        if ( nPropertyFlags & 0x20 )
        {
            sal_uInt32 nBulletColor = pPara->nBulletColor;
            if ( nBulletColor == COL_AUTO )
            {
                sal_Bool bIsDark = sal_False;
                ::com::sun::star::uno::Any aAny;
                if ( PropValue::GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsBackgroundDark" ) ), sal_True ) )
                    aAny >>= bIsDark;
                nBulletColor = bIsDark ? 0xffffff : 0x000000;
            }
            nBulletColor &= 0xffffff;
            nBulletColor |= 0xfe000000;
            rOut << nBulletColor;
        }
        if ( nPropertyFlags & 0x00000800 )
            rOut << (sal_uInt16)( pPara->mnTextAdjust );
        if ( nPropertyFlags & 0x00001000 )
            rOut << (sal_uInt16)( nLineSpacing );
        if ( nPropertyFlags & 0x00002000 )
            rOut << (sal_uInt16)( pPara->mnLineSpacingTop );
        if ( nPropertyFlags & 0x00004000 )
            rOut << (sal_uInt16)( pPara->mnLineSpacingBottom );
        if ( nPropertyFlags & 0x100 )
            rOut << (sal_uInt16)(pPara->nTextOfs);
        if (  nPropertyFlags & 0x400 )
            rOut << (sal_uInt16)(pPara->nBulletOfs);
        if ( nPropertyFlags & 0x000e0000 )
        {
            sal_uInt16 nAsianSettings = 0;
            if ( pPara->mbForbiddenRules )
                nAsianSettings |= 1;
            if ( pPara->mbParagraphPunctation )
                nAsianSettings |= 4;
            rOut << nAsianSettings;
        }
		if ( nPropertyFlags & 0x200000 )
			rOut << pPara->mnBiDi;
    }
}

//  -----------------------------------------------------------------------

void PPTWriter::ImplWritePortions( SvStream& rOut, TextObj& rTextObj )
{
    sal_uInt32  nPropertyFlags, i = 0;
    int nInstance = rTextObj.GetInstance();

    for ( ParagraphObj* pPara = rTextObj.First(); pPara; pPara = rTextObj.Next(), i++ )
    {
        for ( PortionObj* pPortion = (PortionObj*)pPara->First(); pPortion; pPortion = (PortionObj*)pPara->Next() )
        {
            nPropertyFlags = 0;
            sal_uInt32 nCharAttr = pPortion->mnCharAttr;
            sal_uInt32 nCharColor = pPortion->mnCharColor;

            if ( nCharColor == COL_AUTO )   // nCharColor depends to the background color
            {
                sal_Bool bIsDark = sal_False;
                ::com::sun::star::uno::Any aAny;
                if ( PropValue::GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsBackgroundDark" ) ), sal_True ) )
                    aAny >>= bIsDark;
                nCharColor = bIsDark ? 0xffffff : 0x000000;
            }

            nCharColor &= 0xffffff;

			/* the portion is using the embossed or engraved attribute, which we want to map to the relief feature of PPT.
			Because the relief feature of PPT is dependent to the background color, such a mapping can not always be used. */
			if ( nCharAttr & 0x200 )
			{
				sal_uInt32 nBackgroundColor = 0xffffff;

				if ( !nCharColor )			// special threatment for
					nCharColor = 0xffffff;	// black fontcolor

				::com::sun::star::uno::Any aAny;
				::com::sun::star::drawing::FillStyle aFS( ::com::sun::star::drawing::FillStyle_NONE );
				if ( PropValue::GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ) ) ) )
					aAny >>= aFS;
				switch( aFS )
				{
					case ::com::sun::star::drawing::FillStyle_GRADIENT :
					{
						Point aEmptyPoint = Point();
						Rectangle aRect( aEmptyPoint, Size( 28000, 21000 ) );
                        EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect );
						aPropOpt.CreateGradientProperties( mXPropSet );
						aPropOpt.GetOpt( ESCHER_Prop_fillColor, nBackgroundColor );
					}
					break;
					case ::com::sun::star::drawing::FillStyle_SOLID :
					{
						if ( PropValue::GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ) ) ) )
							nBackgroundColor = mpPptEscherEx->GetColor( *((sal_uInt32*)aAny.getValue()) );
					}
					break;
					case ::com::sun::star::drawing::FillStyle_NONE :
					{
						::com::sun::star::uno::Any aBackAny;
						::com::sun::star::drawing::FillStyle aBackFS( ::com::sun::star::drawing::FillStyle_NONE );
						if ( PropValue::GetPropertyValue( aBackAny, mXBackgroundPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ) ) ) )
							aBackAny >>= aBackFS;
						switch( aBackFS )
						{
							case ::com::sun::star::drawing::FillStyle_GRADIENT :
							{
								Point aEmptyPoint = Point();
								Rectangle aRect( aEmptyPoint, Size( 28000, 21000 ) );
                                EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect );
								aPropOpt.CreateGradientProperties( mXBackgroundPropSet );
								aPropOpt.GetOpt( ESCHER_Prop_fillColor, nBackgroundColor );
							}
							break;
							case ::com::sun::star::drawing::FillStyle_SOLID :
							{
								if ( PropValue::GetPropertyValue( aAny, mXBackgroundPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ) ) ) )
									nBackgroundColor = mpPptEscherEx->GetColor( *((sal_uInt32*)aAny.getValue()) );
							}
							break;
							default:
								break;
						}
					}
					break;
					default:
						break;
				}

				sal_Int32 nB = nBackgroundColor & 0xff;
				nB += (sal_uInt8)( nBackgroundColor >> 8  );
				nB += (sal_uInt8)( nBackgroundColor >> 16 );
				// if the background color is nearly black, relief can't been used, because the text would not be visible
				if ( nB < 0x60 || ( nBackgroundColor != nCharColor ) )
				{
					nCharAttr &=~ 0x200;

					// now check if the text is part of a group, and if the previous object has the same color than the fontcolor
					// ( and if fillcolor is not available the background color ), it is sometimes
					// not possible to export the 'embossed' flag
					if ( ( GetCurrentGroupLevel() > 0 ) && ( GetCurrentGroupIndex() >= 1 ) )
					{
						::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape	> aGroupedShape( GetCurrentGroupAccess()->getByIndex( GetCurrentGroupIndex() - 1 ), uno::UNO_QUERY );
						if( aGroupedShape.is() )
						{
							::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > aPropSetOfNextShape
								( aGroupedShape, ::com::sun::star::uno::UNO_QUERY );
							if ( aPropSetOfNextShape.is() )
							{
								if ( PropValue::GetPropertyValue( aAny, aPropSetOfNextShape,
													String( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ) ), sal_True ) )
								{
									if ( nCharColor == mpPptEscherEx->GetColor( *((sal_uInt32*)aAny.getValue()) ) )
									{
										nCharAttr |= 0x200;
									}
								}
							}
						}
					}
				}
			}
            nCharColor |= 0xfe000000;
            if ( nInstance == 4 )                       // special handling for normal textobjects:
                nPropertyFlags |= nCharAttr & 0x217;    // not all attributes ar inherited
            else
            {
                if ( /* ( pPortion->mnCharAttrHard & 1 ) || */
                    ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Bold, nCharAttr ) ) )
                    nPropertyFlags |= 1;
                if ( /* ( pPortion->mnCharAttrHard & 2 ) || */
                    ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Italic, nCharAttr ) ) )
                    nPropertyFlags |= 2;
                if ( /* ( pPortion->mnCharAttrHard & 4 ) || */
                    ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Underline, nCharAttr ) ) )
                    nPropertyFlags |= 4;
                if ( /* ( pPortion->mnCharAttrHard & 0x10 ) || */
                    ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Shadow, nCharAttr ) ) )
                    nPropertyFlags |= 0x10;
                if ( /* ( pPortion->mnCharAttrHard & 0x200 ) || */
                    ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Embossed, nCharAttr ) ) )
                    nPropertyFlags |= 512;
            }
            if ( rTextObj.HasExtendedBullets() )
            {
                nPropertyFlags |= ( i & 0x3f ) << 10 ;
                nCharAttr  |= ( i & 0x3f ) << 10;
            }
            if ( ( pPortion->meFontName == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
                ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Font, pPortion->mnFont ) ) )
                nPropertyFlags |= 0x00010000;
            if ( ( pPortion->meAsianOrComplexFont == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
                ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_AsianOrComplexFont, pPortion->mnAsianOrComplexFont ) ) )
                nPropertyFlags |= 0x00200000;
            if ( ( pPortion->meCharHeight == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
                ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontHeight, pPortion->mnCharHeight ) ) )
                nPropertyFlags |= 0x00020000;
            if ( ( pPortion->meCharColor == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
                ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontColor, nCharColor & 0xffffff ) ) )
                nPropertyFlags |= 0x00040000;
            if ( ( pPortion->meCharEscapement == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
                ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Escapement, pPortion->mnCharEscapement ) ) )
                nPropertyFlags |= 0x00080000;

            sal_uInt32 nCharCount = pPortion->Count();

            rOut << nCharCount
                 << nPropertyFlags;          //PropertyFlags

            if ( nPropertyFlags & 0xffff )
                rOut << (sal_uInt16)( nCharAttr );
            if ( nPropertyFlags & 0x00010000 )
                rOut << pPortion->mnFont;
            if ( nPropertyFlags & 0x00200000 )
                rOut << pPortion->mnAsianOrComplexFont;
            if ( nPropertyFlags & 0x00020000 )
                rOut << (sal_uInt16)( pPortion->mnCharHeight );
            if ( nPropertyFlags & 0x00040000 )
                rOut << (sal_uInt32)nCharColor;
            if ( nPropertyFlags & 0x00080000 )
                rOut << pPortion->mnCharEscapement;
        }
    }
}

//  ----------------------------------------------------------------------------------------
//  laedt und konvertiert text aus shape, ergebnis ist mnTextSize gespeichert;
sal_Bool PPTWriter::ImplGetText()
{
    mnTextSize = 0;
	mbFontIndependentLineSpacing = sal_False;
    mXText = ::com::sun::star::uno::Reference<
        ::com::sun::star::text::XSimpleText >
            ( mXShape, ::com::sun::star::uno::UNO_QUERY );

    if ( mXText.is() )
	{
        mnTextSize = mXText->getString().getLength();
		::com::sun::star::uno::Any aAny;
		if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FontIndependentLineSpacing" ) ) ), sal_True )
			aAny >>= mbFontIndependentLineSpacing;
	}
    return ( mnTextSize != 0 );
}

//  -----------------------------------------------------------------------

void PPTWriter::ImplFlipBoundingBox( EscherPropertyContainer& rPropOpt )
{
    if ( mnAngle < 0 )
        mnAngle = ( 36000 + mnAngle ) % 36000;
    else
        mnAngle = ( 36000 - ( mnAngle % 36000 ) );

    double  fCos = cos( (double)mnAngle * F_PI18000 );
    double  fSin = sin( (double)mnAngle * F_PI18000 );

    double  fWidthHalf = maRect.GetWidth() / 2;
    double  fHeightHalf = maRect.GetHeight() / 2;

    double  fXDiff = fCos * fWidthHalf + fSin * (-fHeightHalf);
    double  fYDiff = - ( fSin * fWidthHalf - fCos * ( -fHeightHalf ) );

    maRect.Move( (sal_Int32)( -( fWidthHalf - fXDiff ) ), (sal_Int32)(  - ( fHeightHalf + fYDiff ) ) );
    mnAngle *= 655;
    mnAngle += 0x8000;
    mnAngle &=~0xffff;                                  // nAngle auf volle Gradzahl runden
    rPropOpt.AddOpt( ESCHER_Prop_Rotation, mnAngle );

    if ( ( mnAngle >= ( 45 << 16 ) && mnAngle < ( 135 << 16 ) ) ||
            ( mnAngle >= ( 225 << 16 ) && mnAngle < ( 315 << 16 ) ) )
    {
        // In diesen beiden Bereichen steht in PPT gemeinerweise die
        // BoundingBox bereits senkrecht. Daher muss diese VOR
        // DER ROTATION flachgelegt werden.
        ::com::sun::star::awt::Point
            aTopLeft( (sal_Int32)( maRect.Left() + fWidthHalf - fHeightHalf ), (sal_Int32)( maRect.Top() + fHeightHalf - fWidthHalf ) );
        Size    aNewSize( maRect.GetHeight(), maRect.GetWidth() );
        maRect = Rectangle( Point( aTopLeft.X, aTopLeft.Y ), aNewSize );
    }
}

//  -----------------------------------------------------------------------

struct FieldEntry
{
    sal_uInt32  nFieldType;
    sal_uInt32  nFieldStartPos;
    sal_uInt32  nFieldEndPos;
	String		aRepresentation;
    String      aFieldUrl;

    FieldEntry( sal_uInt32 nType, sal_uInt32 nStart, sal_uInt32 nEnd )
    {
        nFieldType = nType;
        nFieldStartPos = nStart;
        nFieldEndPos = nEnd;
    }
};

//  -----------------------------------------------------------------------

PortionObj::PortionObj( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
                FontCollection& rFontCollection ) :
    mnCharAttrHard      ( 0 ),
    mnCharAttr          ( 0 ),
	mnFont              ( 0 ),
	mnAsianOrComplexFont( 0xffff ),
    mnTextSize          ( 0 ),
	mbLastPortion       ( sal_True ),
    mpText              ( NULL ),
    mpFieldEntry        ( NULL )
{
    mXPropSet = rXPropSet;

    ImplGetPortionValues( rFontCollection, sal_False );
}

PortionObj::PortionObj( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & rXTextRange,
                            sal_Bool bLast, FontCollection& rFontCollection ) :
    mnCharAttrHard          ( 0 ),
    mnCharAttr              ( 0 ),
    mnFont                  ( 0 ),
    mnAsianOrComplexFont    ( 0xffff ),
	mbLastPortion           ( bLast ),
    mpText                  ( NULL ),
    mpFieldEntry            ( NULL )
{
    String aString( rXTextRange->getString() );
    String aURL;
	sal_Bool bRTL_endingParen = sal_False;

    mnTextSize = aString.Len();
    if ( bLast )
        mnTextSize++;

    if ( mnTextSize )
    {
        mpFieldEntry = NULL;
        sal_uInt32 nFieldType = 0;

        mXPropSet = ::com::sun::star::uno::Reference<
            ::com::sun::star::beans::XPropertySet >
                ( rXTextRange, ::com::sun::star::uno::UNO_QUERY );
        mXPropState = ::com::sun::star::uno::Reference<
            ::com::sun::star::beans::XPropertyState >
                ( rXTextRange, ::com::sun::star::uno::UNO_QUERY );

        sal_Bool bPropSetsValid = ( mXPropSet.is() && mXPropState.is() );
        if ( bPropSetsValid )
            nFieldType = ImplGetTextField( rXTextRange, mXPropSet, aURL );
        if ( nFieldType )
        {
            mpFieldEntry = new FieldEntry( nFieldType, 0, mnTextSize );
            if ( ( nFieldType >> 28 == 4 ) )
			{
				mpFieldEntry->aRepresentation = aString;
                mpFieldEntry->aFieldUrl = aURL;
			}
        }
        sal_Bool bSymbol = sal_False;

        if ( bPropSetsValid && ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontCharSet" ) ), sal_False ) )
        {
            sal_Int16 nCharset;
            mAny >>= nCharset;
            if ( nCharset == ::com::sun::star::awt::CharSet::SYMBOL )
                bSymbol = sal_True;
        }
        if ( mpFieldEntry && ( nFieldType & 0x800000 ) )    // placeholder ?
        {
            mnTextSize = 1;
            if ( bLast )
                mnTextSize++;
            mpText = new sal_uInt16[ mnTextSize ];
            mpText[ 0 ] = 0x2a;
        }
        else
        {
            const sal_Unicode* pText = aString.GetBuffer();
			// For i39516 - a closing parenthesis that ends an RTL string is displayed backwards by PPT
			// Solution: add a Unicode Right-to-Left Mark, following the method described in i18024
			if ( bLast && pText[ aString.Len() - 1 ] == sal_Unicode(')') && rFontCollection.GetScriptDirection( aString ) == com::sun::star::i18n::ScriptDirection::RIGHT_TO_LEFT )
			{
				mnTextSize++;
				bRTL_endingParen = sal_True;
			}
            mpText = new sal_uInt16[ mnTextSize ];
            sal_uInt16 nChar;
            for ( int i = 0; i < aString.Len(); i++ )
            {
                nChar = (sal_uInt16)pText[ i ];
                if ( nChar == 0xa )
                    nChar++;
                else if ( !bSymbol )
                {
                    switch ( nChar )
                    {
                        // Currency
                        case 128:   nChar = 0x20AC; break;
                        // Punctuation and other
                        case 130:   nChar = 0x201A; break;// SINGLE LOW-9 QUOTATION MARK
                        case 131:   nChar = 0x0192; break;// LATIN SMALL LETTER F WITH HOOK
                        case 132:   nChar = 0x201E; break;// DOUBLE LOW-9 QUOTATION MARK
                                                              // LOW DOUBLE PRIME QUOTATION MARK
                        case 133:   nChar = 0x2026; break;// HORIZONTAL ELLIPSES
                        case 134:   nChar = 0x2020; break;// DAGGER
                        case 135:   nChar = 0x2021; break;// DOUBLE DAGGER
                        case 136:   nChar = 0x02C6; break;// MODIFIER LETTER CIRCUMFLEX ACCENT
                        case 137:   nChar = 0x2030; break;// PER MILLE SIGN
                        case 138:   nChar = 0x0160; break;// LATIN CAPITAL LETTER S WITH CARON
                        case 139:   nChar = 0x2039; break;// SINGLE LEFT-POINTING ANGLE QUOTATION MARK
                        case 140:   nChar = 0x0152; break;// LATIN CAPITAL LIGATURE OE
                        case 142:   nChar = 0x017D; break;// LATIN CAPITAL LETTER Z WITH CARON
                        case 145:   nChar = 0x2018; break;// LEFT SINGLE QUOTATION MARK
                                                              // MODIFIER LETTER TURNED COMMA
                        case 146:   nChar = 0x2019; break;// RIGHT SINGLE QUOTATION MARK
                                                              // MODIFIER LETTER APOSTROPHE
                        case 147:   nChar = 0x201C; break;// LEFT DOUBLE QUOTATION MARK
                                                              // REVERSED DOUBLE PRIME QUOTATION MARK
                        case 148:   nChar = 0x201D; break;// RIGHT DOUBLE QUOTATION MARK
                                                              // REVERSED DOUBLE PRIME QUOTATION MARK
                        case 149:   nChar = 0x2022; break;// BULLET
                        case 150:   nChar = 0x2013; break;// EN DASH
                        case 151:   nChar = 0x2014; break;// EM DASH
                        case 152:   nChar = 0x02DC; break;// SMALL TILDE
                        case 153:   nChar = 0x2122; break;// TRADE MARK SIGN
                        case 154:   nChar = 0x0161; break;// LATIN SMALL LETTER S WITH CARON
                        case 155:   nChar = 0x203A; break;// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
                        case 156:   nChar = 0x0153; break;// LATIN SMALL LIGATURE OE
                        case 158:   nChar = 0x017E; break;// LATIN SMALL LETTER Z WITH CARON
                        case 159:   nChar = 0x0178; break;// LATIN CAPITAL LETTER Y WITH DIAERESIS
//                      case 222:   nChar = 0x00B6; break;// PILCROW SIGN / PARAGRAPH SIGN
                    }
                }
                mpText[ i ] = nChar;
            }
        }
		if ( bRTL_endingParen )
            mpText[ mnTextSize - 2 ] = 0x200F; // Unicode Right-to-Left mark

        if ( bLast )
            mpText[ mnTextSize - 1 ] = 0xd;

        if ( bPropSetsValid )
            ImplGetPortionValues( rFontCollection, sal_True );
    }
}

PortionObj::PortionObj( const PortionObj& rPortionObj )
: PropStateValue( rPortionObj )
{
    ImplConstruct( rPortionObj );
}

PortionObj::~PortionObj()
{
    ImplClear();
}

void PortionObj::Write( SvStream* pStrm, sal_Bool bLast )
{
    sal_uInt32 nCount = mnTextSize;
    if ( bLast && mbLastPortion )
        nCount--;
    for ( sal_uInt32 i = 0; i < nCount; i++ )
        *pStrm << (sal_uInt16)mpText[ i ];
}

void PortionObj::ImplGetPortionValues( FontCollection& rFontCollection, sal_Bool bGetPropStateValue )
{

    sal_Bool bOk = ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontName" ) ), bGetPropStateValue );
    meFontName = ePropState;
    if ( bOk )
    {
        FontCollectionEntry aFontDesc( *(::rtl::OUString*)mAny.getValue() );
        sal_uInt32  nCount = rFontCollection.GetCount();
        mnFont = (sal_uInt16)rFontCollection.GetId( aFontDesc );
        if ( mnFont == nCount )
        {
            FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontCharSet" ) ), sal_False ) )
                mAny >>= rFontDesc.CharSet;
            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontFamily" ) ), sal_False ) )
                mAny >>= rFontDesc.Family;
            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontPitch" ) ), sal_False ) )
                mAny >>= rFontDesc.Pitch;
        }
    }

	sal_Int16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( Application::GetSettings().GetLanguage() );
	if ( mpText && mnTextSize && xPPTBreakIter.is() )
	{
		rtl::OUString sT( mpText, mnTextSize );
		nScriptType = xPPTBreakIter->getScriptType( sT, 0 );
	}
	if ( nScriptType != com::sun::star::i18n::ScriptType::COMPLEX )
	{
		bOk = ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontNameAsian" ) ), bGetPropStateValue );
		meAsianOrComplexFont = ePropState;
		if ( bOk )
		{
			FontCollectionEntry aFontDesc( *(::rtl::OUString*)mAny.getValue() );
			sal_uInt32  nCount = rFontCollection.GetCount();
			mnAsianOrComplexFont = (sal_uInt16)rFontCollection.GetId( aFontDesc );
			if ( mnAsianOrComplexFont == nCount )
			{
				FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
				if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontCharSetAsian" ) ), sal_False ) )
					mAny >>= rFontDesc.CharSet;
				if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontFamilyAsian" ) ), sal_False ) )
					mAny >>= rFontDesc.Family;
				if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontPitchAsian" ) ), sal_False ) )
					mAny >>= rFontDesc.Pitch;
			}
		}
	}
	else
	{
		bOk = ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontNameComplex" ) ), bGetPropStateValue );
		meAsianOrComplexFont = ePropState;
		if ( bOk )
		{
			FontCollectionEntry aFontDesc( *(::rtl::OUString*)mAny.getValue() );
			sal_uInt32  nCount = rFontCollection.GetCount();
			mnAsianOrComplexFont = (sal_uInt16)rFontCollection.GetId( aFontDesc );
			if ( mnAsianOrComplexFont == nCount )
			{
				FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
				if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontCharSetComplex" ) ), sal_False ) )
					mAny >>= rFontDesc.CharSet;
				if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontFamilyComplex" ) ), sal_False ) )
					mAny >>= rFontDesc.Family;
				if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontPitchComplex" ) ), sal_False ) )
					mAny >>= rFontDesc.Pitch;
			}
		}
	}

	rtl::OUString aCharHeightName, aCharWeightName, aCharLocaleName, aCharPostureName;
	switch( nScriptType )
	{
		case com::sun::star::i18n::ScriptType::ASIAN :
		{
			aCharHeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharHeightAsian" ) );
			aCharWeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharWeightAsian" ) );
			aCharLocaleName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharLocaleAsian" ) );
			aCharPostureName = String( RTL_CONSTASCII_USTRINGPARAM( "CharPostureAsian" ) );
			break;
		}
		case com::sun::star::i18n::ScriptType::COMPLEX :
		{
			aCharHeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharHeightComplex" ) );
			aCharWeightName	 = String( RTL_CONSTASCII_USTRINGPARAM( "CharWeightComplex" ) );
			aCharLocaleName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharLocaleComplex" ) );
			aCharPostureName = String( RTL_CONSTASCII_USTRINGPARAM( "CharPostureComplex" ) );
			break;
		}
		default:
		{
			aCharHeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharHeight" ) );
			aCharWeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharWeight" ) );
			aCharLocaleName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharLocale" ) );
			aCharPostureName = String( RTL_CONSTASCII_USTRINGPARAM( "CharPosture" ) );
			break;
		}
	}

    mnCharHeight = 24;
	if ( GetPropertyValue( mAny, mXPropSet, aCharHeightName, sal_False ) )
	{
		float fVal(0.0);
		if ( mAny >>= fVal )
		{
	        mnCharHeight = (sal_uInt16)( fVal + 0.5 );
			meCharHeight = GetPropertyState( mXPropSet, aCharHeightName );
		}
	}
	if ( GetPropertyValue( mAny, mXPropSet, aCharWeightName, sal_False ) )
	{
		float fFloat(0.0);
		if ( mAny >>= fFloat )
		{
			if ( fFloat >= ::com::sun::star::awt::FontWeight::SEMIBOLD )
				mnCharAttr |= 1;
			if ( GetPropertyState( mXPropSet, aCharWeightName ) == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
				mnCharAttrHard |= 1;
		}
	}
	if ( GetPropertyValue( mAny, mXPropSet, aCharLocaleName, sal_False ) )
	{
		com::sun::star::lang::Locale eLocale;
		if ( mAny >>= eLocale )
			meCharLocale = eLocale;
	}
	if ( GetPropertyValue( mAny, mXPropSet, aCharPostureName, sal_False ) )
	{
		::com::sun::star::awt::FontSlant aFS;
		if ( mAny >>= aFS )
		{
			switch( aFS )
			{
				case ::com::sun::star::awt::FontSlant_OBLIQUE :
				case ::com::sun::star::awt::FontSlant_ITALIC :
					mnCharAttr |= 2;
					break;
				default:
					break;
			}
			if ( GetPropertyState( mXPropSet, aCharPostureName ) == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
				mnCharAttrHard |= 2;
		}
	}

	if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharUnderline" ) ), bGetPropStateValue ) )
    {
        sal_Int16 nVal(0);
        mAny >>= nVal;
        switch ( nVal )
        {
            case ::com::sun::star::awt::FontUnderline::SINGLE :
            case ::com::sun::star::awt::FontUnderline::DOUBLE :
            case ::com::sun::star::awt::FontUnderline::DOTTED :
                mnCharAttr |= 4;
        }
    }
    if ( ePropState == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
        mnCharAttrHard |= 4;

    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharShadowed" ) ), bGetPropStateValue ) )
    {
        sal_Bool bBool(sal_False);
        mAny >>= bBool;
        if ( bBool )
            mnCharAttr |= 0x10;
    }
    if ( ePropState == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
        mnCharAttrHard |= 16;

    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharRelief" ) ), bGetPropStateValue ) )
    {
        sal_Int16 nVal(0);
        mAny >>= nVal;
        if ( nVal != ::com::sun::star::text::FontRelief::NONE )
            mnCharAttr |= 512;
    }
    if ( ePropState == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
        mnCharAttrHard |= 512;

    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharColor" ) ), bGetPropStateValue ) )
    {
        sal_uInt32 nSOColor = *( (sal_uInt32*)mAny.getValue() );
        mnCharColor = nSOColor & 0xff00ff00;                            // green and hibyte
        mnCharColor |= (sal_uInt8)( nSOColor ) << 16;                   // red and blue is switched
        mnCharColor |= (sal_uInt8)( nSOColor >> 16 );
    }
    meCharColor = ePropState;

    mnCharEscapement = 0;
    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharEscapement" ) ), bGetPropStateValue ) )
    {
        mAny >>= mnCharEscapement;
        if ( mnCharEscapement > 100 )
            mnCharEscapement = 33;
        else if ( mnCharEscapement < -100 )
            mnCharEscapement = -33;
    }
    meCharEscapement = ePropState;
}

void PortionObj::ImplClear()
{
    delete (FieldEntry*)mpFieldEntry;
    delete[] mpText;
}

void PortionObj::ImplConstruct( const PortionObj& rPortionObj )
{
    mbLastPortion = rPortionObj.mbLastPortion;
    mnTextSize = rPortionObj.mnTextSize;
    mnCharColor = rPortionObj.mnCharColor;
    mnCharEscapement = rPortionObj.mnCharEscapement;
    mnCharAttr = rPortionObj.mnCharAttr;
    mnCharHeight = rPortionObj.mnCharHeight;
    mnFont = rPortionObj.mnFont;
    mnAsianOrComplexFont = rPortionObj.mnAsianOrComplexFont;

    if ( rPortionObj.mpText )
    {
        mpText = new sal_uInt16[ mnTextSize ];
        memcpy( mpText, rPortionObj.mpText, mnTextSize << 1 );
    }
    else
        mpText = NULL;

    if ( rPortionObj.mpFieldEntry )
        mpFieldEntry = new FieldEntry( *( rPortionObj.mpFieldEntry ) );
    else
        mpFieldEntry = NULL;
}

sal_uInt32 PortionObj::ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition )
{
    if ( mpFieldEntry && ( !mpFieldEntry->nFieldStartPos ) )
    {
        mpFieldEntry->nFieldStartPos += nCurrentTextPosition;
        mpFieldEntry->nFieldEndPos += nCurrentTextPosition;
    }
    return mnTextSize;
}

//  -----------------------------------------------------------------------
// Rueckgabe:                           0 = kein TextField
//  bit28->31   text field type :
//                                      1 = Date
//                                      2 = Time
//                                      3 = SlideNumber
//                                      4 = Url
//										5 = DateTime
//										6 = header
//										7 = footer
//  bit24->27   text field sub type	(optional)
//     23->     PPT Textfield needs a placeholder

sal_uInt32 PortionObj::ImplGetTextField( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & ,
	const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, String& rURL )
{
    sal_uInt32 nRetValue = 0;
    sal_Int32 nFormat;
	::com::sun::star::uno::Any aAny;
	if ( GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextPortionType" ) ), sal_True ) )
	{
		String  aTextFieldType( *(::rtl::OUString*)aAny.getValue() );
		if ( aTextFieldType == String( RTL_CONSTASCII_USTRINGPARAM( "TextField" ) ) )
		{
			if ( GetPropertyValue( aAny, rXPropSet, aTextFieldType, sal_True ) )
			{
				::com::sun::star::uno::Reference< ::com::sun::star::text::XTextField > aXTextField;
				if ( aAny >>= aXTextField )
				{
					if ( aXTextField.is() )
					{
						::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
							xFieldPropSet( aXTextField, ::com::sun::star::uno::UNO_QUERY );
						if ( xFieldPropSet.is() )
						{
							String aFieldKind( aXTextField->getPresentation( sal_True ) );
							if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Date" ) ) )
							{
								if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFix" ) ) ), sal_True )
								{
									sal_Bool bBool;
									aAny >>= bBool;
									if ( !bBool )  // Fixed DateFields gibt es in PPT nicht
									{
										if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Format" ) ) ), sal_True )
										{
											nFormat = *(sal_Int32*)aAny.getValue();
											switch ( nFormat )
											{
												default:
												case 5 :
												case 4 :
												case 2 : nFormat = 0; break;
												case 8 :
												case 9 :
												case 3 : nFormat = 1; break;
												case 7 :
												case 6 : nFormat = 2; break;
											}
											nRetValue |= ( ( ( 1 << 4 ) | nFormat ) << 24 ) | 0x800000;
										}
									}
								}
							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "URL" ) ) )
							{
								if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "URL" ) ) ), sal_True )
									rURL = String( *(::rtl::OUString*)aAny.getValue() );
								nRetValue = 4 << 28;
							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Page" ) ) )
							{
								nRetValue = 3 << 28 | 0x800000;
							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Pages" ) ) )
							{

							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Time" ) ) )
							{
								if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFix" ) ) ), sal_True )
								{
									sal_Bool bBool;
									aAny >>= bBool;
									if ( !bBool )
									{
										if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFix" ) ) ), sal_True )
										{
											nFormat = *(sal_Int32*)aAny.getValue();
											nRetValue |= ( ( ( 2 << 4 ) | nFormat ) << 24 ) | 0x800000;
										}
									}
								}
							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "File" ) ) )
							{

							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Table" ) ) )
							{

							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "ExtTime" ) ) )
							{
								if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFix" ) ) ), sal_True )
								{
									sal_Bool bBool;
									aAny >>= bBool;
									if ( !bBool )
									{
										if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Format" ) ) ), sal_True )
										{
											nFormat = *(sal_Int32*)aAny.getValue();
											switch ( nFormat )
											{
												default:
												case 6 :
												case 7 :
												case 8 :
												case 2 : nFormat = 12; break;
												case 3 : nFormat = 9; break;
												case 5 :
												case 4 : nFormat = 10; break;

											}
											nRetValue |= ( ( ( 2 << 4 ) | nFormat ) << 24 ) | 0x800000;
										}
									}
								}
							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "ExtFile" ) ) )
							{

							}
							else if ( aFieldKind ==  String( RTL_CONSTASCII_USTRINGPARAM( "Author" ) ) )
							{

							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "DateTime" ) ) )
							{
								nRetValue = 5 << 28 | 0x800000;
							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Header" ) ) )
							{
								nRetValue = 6 << 28 | 0x800000;
							}
							else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Footer" ) ) )
							{
								nRetValue = 7 << 28 | 0x800000;
							}
						}
					}
				}
			}
		}
	}
    return nRetValue;
}

PortionObj& PortionObj::operator=( const PortionObj& rPortionObj )
{
    if ( this != &rPortionObj )
    {
        ImplClear();
        ImplConstruct( rPortionObj );
    }
    return *this;
}

//  -----------------------------------------------------------------------

ParagraphObj::ParagraphObj( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
                PPTExBulletProvider& rProv ) :
    maMapModeSrc        ( MAP_100TH_MM ),
    maMapModeDest       ( MAP_INCH, Point(), Fraction( 1, 576 ), Fraction( 1, 576 ) )
{
    mXPropSet = rXPropSet;

    bExtendedParameters = sal_False;

    nDepth = 0;
    nBulletFlags = 0;
    nParaFlags = 0;

    ImplGetParagraphValues( rProv, sal_False );
}

    ParagraphObj::ParagraphObj( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > & rXTextContent,
                    ParaFlags aParaFlags, FontCollection& rFontCollection, PPTExBulletProvider& rProv ) :
    maMapModeSrc        ( MAP_100TH_MM ),
    maMapModeDest       ( MAP_INCH, Point(), Fraction( 1, 576 ), Fraction( 1, 576 ) ),
    mbFirstParagraph    ( aParaFlags.bFirstParagraph ),
    mbLastParagraph     ( aParaFlags.bLastParagraph )
{
    bExtendedParameters = sal_False;

    nDepth = 0;
    nBulletFlags = 0;
    nParaFlags = 0;

    mXPropSet = ::com::sun::star::uno::Reference<
        ::com::sun::star::beans::XPropertySet >
            ( rXTextContent, ::com::sun::star::uno::UNO_QUERY );

    mXPropState = ::com::sun::star::uno::Reference<
        ::com::sun::star::beans::XPropertyState >
            ( rXTextContent, ::com::sun::star::uno::UNO_QUERY );

    if ( mXPropSet.is() && mXPropState.is() )
    {
        ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumerationAccess >
            aXTextPortionEA( rXTextContent, ::com::sun::star::uno::UNO_QUERY );
        if ( aXTextPortionEA.is() )
        {
            ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >
                aXTextPortionE( aXTextPortionEA->createEnumeration() );
            if ( aXTextPortionE.is() )
            {
                while ( aXTextPortionE->hasMoreElements() )
                {
                    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > aXCursorText;
                    ::com::sun::star::uno::Any aAny( aXTextPortionE->nextElement() );
                    if ( aAny >>= aXCursorText )
                    {
                        PortionObj* pPortionObj = new PortionObj( aXCursorText, !aXTextPortionE->hasMoreElements(), rFontCollection );
                        if ( pPortionObj->Count() )
                            Insert( pPortionObj, LIST_APPEND );
                        else
                            delete pPortionObj;
                    }
                }
            }
        }
        ImplGetParagraphValues( rProv, sal_True );//
    }
}

ParagraphObj::ParagraphObj( const ParagraphObj& rObj )
: List()
, PropStateValue()
, SOParagraph()
{
    ImplConstruct( rObj );
}

ParagraphObj::~ParagraphObj()
{
    ImplClear();
}

void ParagraphObj::Write( SvStream* pStrm )
{
    for ( void* pPtr = First(); pPtr; pPtr = Next() )
        ((PortionObj*)pPtr)->Write( pStrm, mbLastParagraph );
}

void ParagraphObj::ImplClear()
{
    for ( void* pPtr = First(); pPtr; pPtr = Next() )
        delete (PortionObj*)pPtr;
}

void ParagraphObj::CalculateGraphicBulletSize( sal_uInt16 nFontHeight )
{
    if ( ( (SvxExtNumType)nNumberingType == SVX_NUM_BITMAP ) && ( nBulletId != 0xffff ) )
    {
        // calculate the bulletrealsize for this grafik
        if ( aBuGraSize.Width() && aBuGraSize.Height() )
        {
            double fCharHeight = nFontHeight;
            double fLen = aBuGraSize.Height();
            fCharHeight = fCharHeight * 0.2540;
            double fQuo = fLen / fCharHeight;
            nBulletRealSize = (sal_Int16)( fQuo + 0.5 );
            if ( (sal_uInt16)nBulletRealSize > 400 )
                nBulletRealSize = 400;
        }
    }
}

// from sw/source/filter/ww8/wrtw8num.cxx for default bullets to export to MS intact
static void lcl_SubstituteBullet(String& rNumStr, rtl_TextEncoding& rChrSet, String& rFontName)
{
	sal_Unicode cChar = rNumStr.GetChar(0);
	StarSymbolToMSMultiFont *pConvert = CreateStarSymbolToMSMultiFont();
	String sFont = pConvert->ConvertChar(cChar);
	delete pConvert;
	if (sFont.Len())
	{
		rNumStr = static_cast< sal_Unicode >(cChar | 0xF000);
		rFontName = sFont;
		rChrSet = RTL_TEXTENCODING_SYMBOL;
	}
	else if ( (rNumStr.GetChar(0) < 0xE000 || rNumStr.GetChar(0) > 0xF8FF) )
	{
		/*
		Ok we can't fit into a known windows unicode font, but
		we are not in the private area, so we are a
		standardized symbol, so turn off the symbol bit and
		let words own font substitution kick in
		*/
		rChrSet = RTL_TEXTENCODING_UNICODE;
		rFontName = ::GetFontToken(rFontName, 0);
	}
	else
	{
		/*
		Well we don't have an available substition, and we're
		in our private area, so give up and show a standard
		bullet symbol
		*/
		rFontName.AssignAscii(RTL_CONSTASCII_STRINGPARAM("Wingdings"));
		rNumStr = static_cast< sal_Unicode >(0x6C);
     }
}

void ParagraphObj::ImplGetNumberingLevel( PPTExBulletProvider& rBuProv, sal_Int16 nNumberingDepth, sal_Bool bIsBullet, sal_Bool bGetPropStateValue )
{
	::com::sun::star::uno::Any aAny;
	if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "ParaLeftMargin" ) ) ) )
	{
		sal_Int32 nVal;
        if ( aAny >>= nVal )
			nTextOfs = static_cast< sal_Int16 >( nVal / ( 2540.0 / 576 ) + 0.5 ) ;
	}
    if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "ParaFirstLineIndent" ) ) ) )
	{
        if ( aAny >>= nBulletOfs )
			nBulletOfs = static_cast< sal_Int32 >( nBulletOfs / ( 2540.0 / 576 ) + 0.5 );
	}
	if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "NumberingIsNumber" ) ) ) )
		aAny >>= bNumberingIsNumber;

	::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexReplace > aXIndexReplace;

    if ( bIsBullet && ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "NumberingRules" ) ), bGetPropStateValue ) )
    {
        if ( ( mAny >>= aXIndexReplace ) && nNumberingDepth < aXIndexReplace->getCount() )
        {
            mAny <<= aXIndexReplace->getByIndex( nNumberingDepth );
            ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>
                aPropertySequence( *( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>*)mAny.getValue() );

            const ::com::sun::star::beans::PropertyValue* pPropValue = aPropertySequence.getArray();

            sal_Int32 nPropertyCount = aPropertySequence.getLength();
            if ( nPropertyCount )
            {
                bExtendedParameters = sal_True;
                nBulletRealSize = 100;
                nMappedNumType = 0;

                String aGraphicURL;
                for ( sal_Int32 i = 0; i < nPropertyCount; i++ )
                {
                    const void* pValue = pPropValue[ i ].Value.getValue();
                    if ( pValue )
                    {
                        ::rtl::OUString aPropName( pPropValue[ i ].Name );
                        if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "NumberingType" ) ) )
                            nNumberingType = *( (sal_Int16*)pValue );
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Adjust" ) ) )
                            nHorzAdjust = *( (sal_Int16*)pValue );
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletChar" ) ) )
                        {
                            String aString( *( (String*)pValue ) );
                            if ( aString.Len() )
                                cBulletId = aString.GetChar( 0 );
                        }
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletFont" ) ) )
                        {
                            aFontDesc = *( (::com::sun::star::awt::FontDescriptor*)pValue );

                            // Our numbullet dialog has set the wrong textencoding for our "StarSymbol" font,
                            // instead of a Unicode encoding the encoding RTL_TEXTENCODING_SYMBOL was used.
                            // Because there might exist a lot of damaged documemts I added this two lines
                            // which fixes the bullet problem for the export.
                            if ( aFontDesc.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ) )
                                aFontDesc.CharSet = RTL_TEXTENCODING_MS_1252;

                        }
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GraphicURL" ) ) )
                            aGraphicURL = ( *(::rtl::OUString*)pValue );
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GraphicSize" ) ) )
                        {
                            if ( pPropValue[ i ].Value.getValueType() == ::getCppuType( (::com::sun::star::awt::Size*)0) )
                            {
                                // don't cast awt::Size to Size as on 64-bits they are not the same.
                                ::com::sun::star::awt::Size aSize;
                                pPropValue[ i ].Value >>= aSize;
                                aBuGraSize.nA = aSize.Width;
                                aBuGraSize.nB = aSize.Height;
                            }
                        }
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "StartWith" ) ) )
                            nStartWith = *( (sal_Int16*)pValue );
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LeftMargin" ) ) )
                            nTextOfs = nTextOfs + static_cast< sal_Int16 >( *( (sal_Int32*)pValue ) / ( 2540.0 / 576 ) );
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FirstLineOffset" ) ) )
                            nBulletOfs += (sal_Int16)( *( (sal_Int32*)pValue ) / ( 2540.0 / 576 ) );
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletColor" ) ) )
                        {
                            sal_uInt32 nSOColor = *( (sal_uInt32*)pValue );
                            nBulletColor = nSOColor & 0xff00ff00;                       // green and hibyte
                            nBulletColor |= (sal_uInt8)( nSOColor ) << 16;              // red
                            nBulletColor |= (sal_uInt8)( nSOColor >> 16 ) | 0xfe000000; // blue
                        }
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletRelSize" ) ) )
                        {
                            nBulletRealSize = *( (sal_Int16*)pValue );
                            nParaFlags |= 0x40;
                            nBulletFlags |= 8;
                        }
                        else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Prefix" ) ) )
                            sPrefix = ( *(::rtl::OUString*)pValue );
                        else if  ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Suffix" ) ) )
                            sSuffix = ( *(::rtl::OUString*)pValue );
#ifdef DBG_UTIL
                        else if ( ! (
                                ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "SymbolTextDistance" ) ) )
                            ||  ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Graphic" ) ) ) ) )
                        {
                            DBG_ERROR( "Unbekanntes Property" );
                        }
#endif
                    }
                }

                if ( aGraphicURL.Len() )
                {
					if ( aBuGraSize.Width() && aBuGraSize.Height() )
					{
						xub_StrLen nIndex = aGraphicURL.Search( (sal_Unicode)':', 0 );
						if ( nIndex != STRING_NOTFOUND )
						{
							nIndex++;
							if ( aGraphicURL.Len() > nIndex  )
							{
								ByteString aUniqueId( aGraphicURL, nIndex, aGraphicURL.Len() - nIndex, RTL_TEXTENCODING_UTF8 );
								if ( aUniqueId.Len() )
								{
									nBulletId = rBuProv.GetId( aUniqueId, aBuGraSize );
									if ( nBulletId != 0xffff )
										bExtendedBulletsUsed = sal_True;
								}
							}
						}
					}
					else
					{
						nNumberingType = SVX_NUM_NUMBER_NONE;
					}
                }

                PortionObj* pPortion = (PortionObj*)First();
                CalculateGraphicBulletSize( ( pPortion ) ? pPortion->mnCharHeight : 24 );

                switch( (SvxExtNumType)nNumberingType )
                {
                    case SVX_NUM_NUMBER_NONE : nParaFlags |= 0xf; break;

                    case SVX_NUM_CHAR_SPECIAL :                           // Bullet
                    {
						if ( aFontDesc.Name.equalsIgnoreAsciiCaseAscii("starsymbol") ||
							aFontDesc.Name.equalsIgnoreAsciiCaseAscii("opensymbol") )
						{
							String sFontName = aFontDesc.Name;
							String sNumStr = cBulletId;
							rtl_TextEncoding eChrSet = aFontDesc.CharSet;
                            lcl_SubstituteBullet(sNumStr,eChrSet,sFontName);
							aFontDesc.Name = sFontName;
							cBulletId = sNumStr.GetChar( 0 );
							aFontDesc.CharSet = eChrSet;
						 }

                        if ( aFontDesc.Name.getLength() )
                        {
/*
                            if ( aFontDesc.CharSet != ::com::sun::star::awt::CharSet::SYMBOL )
                            {
                                switch ( cBulletId )
                                {
                                    // Currency
                                    case 128:   cBulletId = 0x20AC; break;
                                    // Punctuation and other
                                    case 130:   cBulletId = 0x201A; break;// SINGLE LOW-9 QUOTATION MARK
                                    case 131:   cBulletId = 0x0192; break;// LATIN SMALL LETTER F WITH HOOK
                                    case 132:   cBulletId = 0x201E; break;// DOUBLE LOW-9 QUOTATION MARK
                                                                          // LOW DOUBLE PRIME QUOTATION MARK
                                    case 133:   cBulletId = 0x2026; break;// HORIZONTAL ELLIPSES
                                    case 134:   cBulletId = 0x2020; break;// DAGGER
                                    case 135:   cBulletId = 0x2021; break;// DOUBLE DAGGER
                                    case 136:   cBulletId = 0x02C6; break;// MODIFIER LETTER CIRCUMFLEX ACCENT
                                    case 137:   cBulletId = 0x2030; break;// PER MILLE SIGN
                                    case 138:   cBulletId = 0x0160; break;// LATIN CAPITAL LETTER S WITH CARON
                                    case 139:   cBulletId = 0x2039; break;// SINGLE LEFT-POINTING ANGLE QUOTATION MARK
                                    case 140:   cBulletId = 0x0152; break;// LATIN CAPITAL LIGATURE OE
                                    case 142:   cBulletId = 0x017D; break;// LATIN CAPITAL LETTER Z WITH CARON
                                    case 145:   cBulletId = 0x2018; break;// LEFT SINGLE QUOTATION MARK
                                                                          // MODIFIER LETTER TURNED COMMA
                                    case 146:   cBulletId = 0x2019; break;// RIGHT SINGLE QUOTATION MARK
                                                                          // MODIFIER LETTER APOSTROPHE
                                    case 147:   cBulletId = 0x201C; break;// LEFT DOUBLE QUOTATION MARK
                                                                          // REVERSED DOUBLE PRIME QUOTATION MARK
                                    case 148:   cBulletId = 0x201D; break;// RIGHT DOUBLE QUOTATION MARK
                                                                          // REVERSED DOUBLE PRIME QUOTATION MARK
                                    case 149:   cBulletId = 0x2022; break;// BULLET
                                    case 150:   cBulletId = 0x2013; break;// EN DASH
                                    case 151:   cBulletId = 0x2014; break;// EM DASH
                                    case 152:   cBulletId = 0x02DC; break;// SMALL TILDE
                                    case 153:   cBulletId = 0x2122; break;// TRADE MARK SIGN
                                    case 154:   cBulletId = 0x0161; break;// LATIN SMALL LETTER S WITH CARON
                                    case 155:   cBulletId = 0x203A; break;// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
                                    case 156:   cBulletId = 0x0153; break;// LATIN SMALL LIGATURE OE
                                    case 158:   cBulletId = 0x017E; break;// LATIN SMALL LETTER Z WITH CARON
                                    case 159:   cBulletId = 0x0178; break;// LATIN CAPITAL LETTER Y WITH DIAERESIS
//                                  case 222:   cBulletId = 0x00B6; break;// PILCROW SIGN / PARAGRAPH SIGN
                                }
                            }
*/
                            nParaFlags |= 0x90; // wir geben den Font und den Charset vor
                        }
                    }
                    case SVX_NUM_CHARS_UPPER_LETTER :       // zaehlt von a-z, aa - az, ba - bz, ...
                    case SVX_NUM_CHARS_LOWER_LETTER :
                    case SVX_NUM_ROMAN_UPPER :
                    case SVX_NUM_ROMAN_LOWER :
                    case SVX_NUM_ARABIC :
                    case SVX_NUM_PAGEDESC :                 // Numerierung aus der Seitenvorlage
                    case SVX_NUM_BITMAP :
                    case SVX_NUM_CHARS_UPPER_LETTER_N :     // zaehlt von  a-z, aa-zz, aaa-zzz
                    case SVX_NUM_CHARS_LOWER_LETTER_N :
					case SVX_NUM_NUMBER_UPPER_ZH:
					case SVX_NUM_CIRCLE_NUMBER:
					case SVX_NUM_NUMBER_UPPER_ZH_TW:
					case SVX_NUM_NUMBER_LOWER_ZH:
					case SVX_NUM_FULL_WIDTH_ARABIC:
                    {
                        if ( nNumberingType != SVX_NUM_CHAR_SPECIAL )
                        {
                            bExtendedBulletsUsed = sal_True;
                            if ( nNumberingDepth & 1 )
                                cBulletId = 0x2013;         // defaulting bullet characters for ppt97
                            else if ( nNumberingDepth == 4 )
                                cBulletId = 0xbb;
                            else
                                cBulletId = 0x2022;

                            switch( (SvxExtNumType)nNumberingType )
                            {
                                case SVX_NUM_CHARS_UPPER_LETTER :
                                case SVX_NUM_CHARS_UPPER_LETTER_N :
                                {
                                    if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
                                    {
                                        if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
                                            nMappedNumType = 0xa0001;   // (A)
                                        else
                                            nMappedNumType = 0xb0001;   // A)
                                    }
                                    else
                                        nMappedNumType = 0x10001;       // A.
                                }
                                break;
                                case SVX_NUM_CHARS_LOWER_LETTER :
                                case SVX_NUM_CHARS_LOWER_LETTER_N :
                                {
                                    if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
                                    {
                                        if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
                                            nMappedNumType = 0x80001;   // (a)
                                        else
                                            nMappedNumType = 0x90001;   // a)
                                    }
                                    else
                                        nMappedNumType = 0x00001;       // a.
                                }
                                break;
                                case SVX_NUM_ROMAN_UPPER :
                                {
                                    if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
                                    {
                                        if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
                                            nMappedNumType = 0xe0001;   // (I)
                                        else
                                            nMappedNumType = 0xf0001;   // I)
                                    }
                                    else
                                        nMappedNumType = 0x70001;       // I.
                                }
                                break;
                                case SVX_NUM_ROMAN_LOWER :
                                {
                                    if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
                                    {
                                        if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
                                            nMappedNumType = 0x40001;   // (i)
                                        else
                                            nMappedNumType = 0x50001;   // i)
                                    }
                                    else
                                        nMappedNumType = 0x60001;       // i.
                                }
                                break;
                                case SVX_NUM_ARABIC :
                                {
                                    if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
                                    {
                                        if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
                                            nMappedNumType = 0xc0001;   // (1)
                                        else
                                            nMappedNumType = 0x20001;   // 1)
                                    }
                                    else
                                    {
                                        if ( ! ( sSuffix.Len() + sPrefix.Len() ) )
                                            nMappedNumType = 0xd0001;   // 1
                                        else
                                            nMappedNumType = 0x30001;   // 1.
                                    }
                                }
                                break;
								case SVX_NUM_NUMBER_UPPER_ZH :
								{
									if ( sSuffix.Len() )			
										nMappedNumType = 0x110001;   // Simplified Chinese with single-byte period.
									else
										nMappedNumType = 0x100001;   // Simplified Chinese.
								}
								break;
								case SVX_NUM_CIRCLE_NUMBER :
                                {
									nMappedNumType = 0x120001;   // Double byte circle numbers.
                                }
                                break;								
								case SVX_NUM_NUMBER_UPPER_ZH_TW :
								{
									if ( sSuffix.Len() )			
										nMappedNumType = 0x160001;   // Traditional Chinese with single-byte period.
									else
										nMappedNumType = 0x150001;   // Traditional Chinese.
								}
								break;
								case SVX_NUM_NUMBER_LOWER_ZH :
								{
									if ( sSuffix == String( sal_Unicode(0xff0e)) )
										nMappedNumType = 0x260001;   // Japanese with double-byte period.
									else if ( sSuffix.Len() )
										nMappedNumType = 0x1B0001;   // Japanese/Korean with single-byte period.
									else
										nMappedNumType = 0x1A0001;   // Japanese/Korean.
								}
								break;
								case SVX_NUM_FULL_WIDTH_ARABIC :
								{
									if ( sSuffix.Len() )			
										nMappedNumType = 0x1D0001;   // Double-byte Arabic numbers with double-byte period.
									else
										nMappedNumType = 0x1C0001;   // Double-byte Arabic numbers.
								}
								break;
								default:
									break;
                            }
                        }
                        nParaFlags |= 0x2f;
                        nBulletFlags |= 6;
                        if ( mbIsBullet && bNumberingIsNumber )
                            nBulletFlags |= 1;
                    }
		default: break;
                }
            }
        }
    }
    nBulletOfs = nTextOfs + nBulletOfs;
    if ( nBulletOfs < 0 )
        nBulletOfs = 0;
}

void ParagraphObj::ImplGetParagraphValues( PPTExBulletProvider& rBuProv, sal_Bool bGetPropStateValue )
{
    static String sNumberingLevel   ( RTL_CONSTASCII_USTRINGPARAM( "NumberingLevel" ) );

	::com::sun::star::uno::Any aAny;
	if ( GetPropertyValue( aAny, mXPropSet, sNumberingLevel, sal_True ) )
    {
        if ( bGetPropStateValue )
            meBullet = GetPropertyState( mXPropSet, sNumberingLevel );
        nDepth = *( (sal_Int16*)aAny.getValue() );

		if ( nDepth < 0 )
		{
			mbIsBullet = sal_False;
			nDepth = 0;
		}
		else
		{
			if ( nDepth > 4 )
				nDepth = 4;
			mbIsBullet = sal_True;
		}
    }
    else
	{
        nDepth = 0;
		mbIsBullet = sal_False;
	}
    ImplGetNumberingLevel( rBuProv, nDepth, mbIsBullet, bGetPropStateValue );

	if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaTabStops" ) ), bGetPropStateValue ) )
        maTabStop = *( ::com::sun::star::uno::Sequence< ::com::sun::star::style::TabStop>*)mAny.getValue();
    sal_Int16 eTextAdjust( ::com::sun::star::style::ParagraphAdjust_LEFT );
    if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "ParaAdjust" ) ), bGetPropStateValue ) )
        aAny >>= eTextAdjust;
    switch ( (::com::sun::star::style::ParagraphAdjust)eTextAdjust )
    {
        case ::com::sun::star::style::ParagraphAdjust_CENTER :
            mnTextAdjust = 1;
        break;
        case ::com::sun::star::style::ParagraphAdjust_RIGHT :
            mnTextAdjust = 2;
        break;
        case ::com::sun::star::style::ParagraphAdjust_BLOCK :
            mnTextAdjust = 3;
        break;
        default :
        case ::com::sun::star::style::ParagraphAdjust_LEFT :
            mnTextAdjust = 0;
        break;
    }
    meTextAdjust = ePropState;

    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaLineSpacing" ) ), bGetPropStateValue ) )
    {
        ::com::sun::star::style::LineSpacing aLineSpacing
            = *( (::com::sun::star::style::LineSpacing*)mAny.getValue() );
        switch ( aLineSpacing.Mode )
        {
            case ::com::sun::star::style::LineSpacingMode::MINIMUM :
            case ::com::sun::star::style::LineSpacingMode::LEADING :
            case ::com::sun::star::style::LineSpacingMode::FIX :
                mnLineSpacing = (sal_Int16)(-( aLineSpacing.Height ) );
            break;

            case ::com::sun::star::style::LineSpacingMode::PROP :
            default:
                mnLineSpacing = (sal_Int16)( aLineSpacing.Height );
            break;
        }
    }
    meLineSpacing = ePropState;

    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaBottomMargin" ) ), bGetPropStateValue ) )
    {
        double fSpacing = *( (sal_uInt32*)mAny.getValue() ) + ( 2540.0 / 576.0 ) - 1;
        mnLineSpacingBottom = (sal_Int16)(-( fSpacing * 576.0 / 2540.0 ) );
    }
    meLineSpacingBottom = ePropState;

    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaTopMargin" ) ), bGetPropStateValue ) )
    {
        double fSpacing = *( (sal_uInt32*)mAny.getValue() ) + ( 2540.0 / 576.0 ) - 1;
        mnLineSpacingTop = (sal_Int16)(-( fSpacing * 576.0 / 2540.0 ) );
    }
    meLineSpacingTop = ePropState;

    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaIsForbiddenRules" ) ), bGetPropStateValue ) )
        mAny >>= mbForbiddenRules;
    meForbiddenRules = ePropState;

    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaIsHangingPunctuation" ) ), bGetPropStateValue ) )
        mAny >>= mbParagraphPunctation;
    meParagraphPunctation = ePropState;

	mnBiDi = 0;
	if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "WritingMode" ) ), bGetPropStateValue ) )
	{
		sal_Int16 nWritingMode;
		mAny >>= nWritingMode;

		SvxFrameDirection eWritingMode( (SvxFrameDirection)nWritingMode );
		if ( ( eWritingMode == FRMDIR_HORI_RIGHT_TOP )
			|| ( eWritingMode == FRMDIR_VERT_TOP_RIGHT ) )
		{
			mnBiDi = 1;
		}
	}
	meBiDi = ePropState;
}

void ParagraphObj::ImplConstruct( const ParagraphObj& rParagraphObj )
{
    mnTextSize = rParagraphObj.mnTextSize;
    mnTextAdjust = rParagraphObj.mnTextAdjust;
    mnLineSpacing = rParagraphObj.mnLineSpacing;
    mnLineSpacingTop = rParagraphObj.mnLineSpacingTop;
    mnLineSpacingBottom = rParagraphObj.mnLineSpacingBottom;
    mbFirstParagraph = rParagraphObj.mbFirstParagraph;
    mbLastParagraph = rParagraphObj.mbLastParagraph;
    mbParagraphPunctation = rParagraphObj.mbParagraphPunctation;
    mbForbiddenRules = rParagraphObj.mbForbiddenRules;
    mnBiDi = rParagraphObj.mnBiDi;

    ParagraphObj& rOther = const_cast<ParagraphObj&>(rParagraphObj);
    for ( const void* pPtr = rOther.First(); pPtr; pPtr = rOther.Next() )
        Insert( new PortionObj( *(const PortionObj*)pPtr ), LIST_APPEND );

    maTabStop = rParagraphObj.maTabStop;
    bExtendedParameters = rParagraphObj.bExtendedParameters;
    nParaFlags = rParagraphObj.nParaFlags;
    nBulletFlags = rParagraphObj.nBulletFlags;
    sPrefix = rParagraphObj.sPrefix;
    sSuffix = rParagraphObj.sSuffix;
    sGraphicUrl = rParagraphObj.sGraphicUrl;            // String auf eine Graphic
    aBuGraSize = rParagraphObj.aBuGraSize;
    nNumberingType = rParagraphObj.nNumberingType;      // in wirlichkeit ist dies ein SvxEnum
    nHorzAdjust = rParagraphObj.nHorzAdjust;
    nBulletColor = rParagraphObj.nBulletColor;
    nBulletOfs = rParagraphObj.nBulletOfs;
    nStartWith = rParagraphObj.nStartWith;              // Start der nummerierung
    nTextOfs = rParagraphObj.nTextOfs;
    nBulletRealSize = rParagraphObj.nBulletRealSize;    // GroessenVerhaeltnis in Proz
    nDepth = rParagraphObj.nDepth;                      // aktuelle tiefe
    cBulletId = rParagraphObj.cBulletId;                // wenn Numbering Type == CharSpecial
    aFontDesc = rParagraphObj.aFontDesc;

    bExtendedBulletsUsed = rParagraphObj.bExtendedBulletsUsed;
    nBulletId = rParagraphObj.nBulletId;
}

sal_uInt32 ParagraphObj::ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition )
{
    mnTextSize = 0;
    for ( void* pPtr = First(); pPtr; pPtr = Next() )
        mnTextSize += ((PortionObj*)pPtr)->ImplCalculateTextPositions( nCurrentTextPosition + mnTextSize );
    return mnTextSize;
}

ParagraphObj& ParagraphObj::operator=( const ParagraphObj& rParagraphObj )
{
    if ( this != &rParagraphObj )
    {
        ImplClear();
        ImplConstruct( rParagraphObj );
    }
    return *this;
}

//  -----------------------------------------------------------------------

ImplTextObj::ImplTextObj( int nInstance )
{
    mnRefCount = 1;
    mnTextSize = 0;
    mnInstance = nInstance;
    mpList = new List;
    mbHasExtendedBullets = sal_False;
	mbFixedCellHeightUsed = sal_False;
}

ImplTextObj::~ImplTextObj()
{
    for ( ParagraphObj* pPtr = (ParagraphObj*)mpList->First(); pPtr; pPtr = (ParagraphObj*)mpList->Next() )
        delete pPtr;
    delete mpList;
}

TextObj::TextObj( ::com::sun::star::uno::Reference< ::com::sun::star::text::XSimpleText > & rXTextRef,
            int nInstance, FontCollection& rFontCollection, PPTExBulletProvider& rProv )
{
    mpImplTextObj = new ImplTextObj( nInstance );

    ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumerationAccess >
        aXTextParagraphEA( rXTextRef, ::com::sun::star::uno::UNO_QUERY );

    if ( aXTextParagraphEA.is()  )
    {
        ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >
            aXTextParagraphE( aXTextParagraphEA->createEnumeration() );
        if ( aXTextParagraphE.is() )
        {
            ParaFlags aParaFlags;
            while ( aXTextParagraphE->hasMoreElements() )
            {
                ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > aXParagraph;
                ::com::sun::star::uno::Any aAny( aXTextParagraphE->nextElement() );
                if ( aAny >>= aXParagraph )
                {
                    if ( !aXTextParagraphE->hasMoreElements() )
                        aParaFlags.bLastParagraph = sal_True;
                    ParagraphObj* pPara = new ParagraphObj( aXParagraph, aParaFlags, rFontCollection, rProv );
                    mpImplTextObj->mbHasExtendedBullets |= pPara->bExtendedBulletsUsed;
                    mpImplTextObj->mpList->Insert( pPara, LIST_APPEND );
                    aParaFlags.bFirstParagraph = sal_False;
                }
            }
        }
    }
    ImplCalculateTextPositions();
}

TextObj::TextObj( const TextObj& rTextObj )
{
    mpImplTextObj = rTextObj.mpImplTextObj;
    mpImplTextObj->mnRefCount++;
}

TextObj::~TextObj()
{
    if ( ! ( --mpImplTextObj->mnRefCount ) )
        delete mpImplTextObj;
}

void TextObj::Write( SvStream* pStrm )
{
    sal_uInt32 nSize, nPos = pStrm->Tell();
    *pStrm << (sal_uInt32)( EPP_TextCharsAtom << 16 ) << (sal_uInt32)0;
    for ( void* pPtr = First(); pPtr; pPtr = Next() )
        ((ParagraphObj*)pPtr)->Write( pStrm );
    nSize = pStrm->Tell() - nPos;
    pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
    *pStrm << (sal_uInt32)( nSize - 8 );
    pStrm->SeekRel( nSize - 8 );
}

void TextObj::ImplCalculateTextPositions()
{
    mpImplTextObj->mnTextSize = 0;
    for ( void* pPtr = First(); pPtr; pPtr = Next() )
        mpImplTextObj->mnTextSize += ((ParagraphObj*)pPtr)->ImplCalculateTextPositions( mpImplTextObj->mnTextSize );
}

TextObj& TextObj::operator=( TextObj& rTextObj )
{
    if ( this != &rTextObj )
    {
        if ( ! ( --mpImplTextObj->mnRefCount ) )
            delete mpImplTextObj;
        mpImplTextObj = rTextObj.mpImplTextObj;
        mpImplTextObj->mnRefCount++;
    }
    return *this;
}

void TextObj::WriteTextSpecInfo( SvStream* pStrm )
{
	sal_uInt32 nCharactersLeft( Count() );
	if ( nCharactersLeft >= 1 )
	{
		EscherExAtom aAnimationInfoAtom( *pStrm, EPP_TextSpecInfoAtom, 0, 0 );
		for ( ParagraphObj* pPtr = static_cast < ParagraphObj * >( First() ); nCharactersLeft && pPtr; pPtr = static_cast< ParagraphObj* >( Next() ) )
		{
			for ( PortionObj* pPortion = static_cast< PortionObj* >( pPtr->First() ); nCharactersLeft && pPortion; pPortion = static_cast< PortionObj* >( pPtr->Next() ) )
			{
				sal_Int32 nPortionSize = pPortion->mnTextSize >= nCharactersLeft ? nCharactersLeft : pPortion->mnTextSize;
				sal_Int32 nFlags = 7;
				nCharactersLeft -= nPortionSize;
				*pStrm  << static_cast< sal_uInt32 >( nPortionSize )
						<< nFlags
						<< static_cast< sal_Int16 >( 1 )	// spellinfo -> needs rechecking
						<< static_cast< sal_Int16 >( MsLangId::convertLocaleToLanguageWithFallback( pPortion->meCharLocale ) )
						<< static_cast< sal_Int16 >( 0 );	// alt language
			}
		}
		if ( nCharactersLeft )
			*pStrm << nCharactersLeft << static_cast< sal_Int32 >( 1 ) << static_cast< sal_Int16 >( 1 );

	}
}

//  -----------------------------------------------------------------------

void PPTWriter::ImplAdjustFirstLineLineSpacing( TextObj& rTextObj, EscherPropertyContainer& rPropOpt )
{
	if ( !mbFontIndependentLineSpacing )
	{
		ParagraphObj* pPara = rTextObj.First();
		if ( pPara )
		{
			PortionObj* pPortion = (PortionObj*)pPara->First();
			if ( pPortion )
			{
				sal_Int16 nLineSpacing = pPara->mnLineSpacing;
				const FontCollectionEntry* pDesc = maFontCollection.GetById( pPortion->mnFont );
				if ( pDesc )
					 nLineSpacing = (sal_Int16)( (double)nLineSpacing * pDesc->Scaling + 0.5 );

				if ( ( nLineSpacing > 0 ) && ( nLineSpacing < 100 ) )
				{
	/*
					if ( rxText.is() )
					{
						::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape( rxText, ::com::sun::star::uno::UNO_QUERY );
						if ( xShape.is() )
						{
							SdrObject* pObj = GetSdrObjectFromXShape( mXShape );
							if ( pObj )
							{
								const OutlinerParaObject* pParaObj = pObj->GetOutlinerParaObject();
								if ( pParaObj )
								{
									SdrModel* pModel = pObj->GetModel();
									if ( pModel )
									{
										Outliner aOutliner( &pModel->GetItemPool(), pParaObj->GetOutlinerMode() );
										aOutliner.SetText( *pParaObj );
										sal_uLong nTextHeight = aOutliner.GetLineHeight( 0, 0 );
										if ( nTextHeight )
										{
										}
									}
								}
							}
						}
					}
	*/
					double fCharHeight = pPortion->mnCharHeight;
					fCharHeight *= 2540 / 72;
					fCharHeight *= 100 - nLineSpacing;
					fCharHeight /= 100;

					sal_uInt32 nUpperDistance = 0;
					rPropOpt.GetOpt( ESCHER_Prop_dyTextTop, nUpperDistance );
					nUpperDistance += static_cast< sal_uInt32 >( fCharHeight * 360.0 );
					rPropOpt.AddOpt( ESCHER_Prop_dyTextTop, nUpperDistance );
				}
			}
		}
	}
}

//  -----------------------------------------------------------------------

void PPTWriter::ImplWriteTextStyleAtom( SvStream& rOut, int nTextInstance, sal_uInt32 nAtomInstance,
	TextRuleEntry* pTextRule, SvStream& rExtBuStr, EscherPropertyContainer* pPropOpt )
{
    PPTExParaSheet& rParaSheet = mpStyleSheet->GetParaSheet( nTextInstance );

    rOut << (sal_uInt32)( ( EPP_TextHeaderAtom << 16 ) | ( nAtomInstance << 4 ) ) << (sal_uInt32)4
         << nTextInstance;

	if ( mbEmptyPresObj )
        mnTextSize = 0;
    if ( !mbEmptyPresObj )
    {
        ParagraphObj* pPara;
        TextObj aTextObj( mXText, nTextInstance, maFontCollection, (PPTExBulletProvider&)*this );

        // leaving out EPP_TextCharsAtom w/o text - still write out
        // attribute info though
        if ( mnTextSize )
            aTextObj.Write( &rOut );

		if ( pPropOpt )
			ImplAdjustFirstLineLineSpacing( aTextObj, *pPropOpt );

		sal_uInt32 nSize, nPos = rOut.Tell();

        rOut << (sal_uInt32)( EPP_StyleTextPropAtom << 16 ) << (sal_uInt32)0;
        ImplWriteParagraphs( rOut, aTextObj );
        ImplWritePortions( rOut, aTextObj );
        nSize = rOut.Tell() - nPos;
        rOut.SeekRel( - ( (sal_Int32)nSize - 4 ) );
        rOut << (sal_uInt32)( nSize - 8 );
        rOut.SeekRel( nSize - 8 );

        for ( pPara = aTextObj.First(); pPara; pPara = aTextObj.Next() )
        {
            for ( PortionObj* pPortion = (PortionObj*)pPara->First(); pPortion; pPortion = (PortionObj*)pPara->Next() )
            {
                if ( pPortion->mpFieldEntry )
                {
                    const FieldEntry* pFieldEntry = pPortion->mpFieldEntry;

                    switch ( pFieldEntry->nFieldType >> 28 )
                    {
                        case 1 :
                        case 2 :
                        {
                            rOut << (sal_uInt32)( EPP_DateTimeMCAtom << 16 ) << (sal_uInt32)8
                                 << (sal_uInt32)( pFieldEntry->nFieldStartPos )			// TxtOffset auf TxtField;
                                 << (sal_uInt8)( pFieldEntry->nFieldType & 0xff )		// Type
                                 << (sal_uInt8)0 << (sal_uInt16)0;						// PadBytes
                        }
                        break;
                        case 3 :
                        {
                            rOut << (sal_uInt32)( EPP_SlideNumberMCAtom << 16 ) << (sal_uInt32 ) 4
                                 << (sal_uInt32)( pFieldEntry->nFieldStartPos );
                        }
                        break;
                        case 4 :
                        {
							sal_uInt32 nPageIndex = 0;
							String aPageUrl;
							String aEmpty;
							String aFile( pFieldEntry->aFieldUrl );
							INetURLObject aUrl( pFieldEntry->aFieldUrl );
							if ( INET_PROT_FILE == aUrl.GetProtocol() )
								aFile = aUrl.PathToFileName();
							else if ( pFieldEntry->aFieldUrl.GetChar( 0 ) == '#' )
							{
								String aPage( INetURLObject::decode( pFieldEntry->aFieldUrl, '%', INetURLObject::DECODE_WITH_CHARSET ) );
								aPage.Erase( 0, 1 );
								for ( String* pStr = (String*)maSlideNameList.First(); pStr; pStr = (String*)maSlideNameList.Next(), nPageIndex++ )
								{
									if ( *pStr == aPage )
									{
										aPageUrl = UniString::CreateFromInt32( 256 + nPageIndex );
										aPageUrl.Append( String( RTL_CONSTASCII_USTRINGPARAM( "," ) ) );
										aPageUrl.Append( String::CreateFromInt32( nPageIndex + 1 ) );
										aPageUrl.Append( String( RTL_CONSTASCII_USTRINGPARAM( ",Slide " ) ) );
										aPageUrl.Append( String::CreateFromInt32( nPageIndex + 1 ) );
									}
								}
							}
							sal_uInt32 nHyperId;
							if ( aPageUrl.Len() )
								nHyperId = ImplInsertBookmarkURL( aPageUrl, 1 | ( nPageIndex << 8 ) | ( 1 << 31 ), pFieldEntry->aRepresentation, aEmpty, aEmpty, aPageUrl );
							else
								nHyperId = ImplInsertBookmarkURL( pFieldEntry->aFieldUrl, 2 | ( nHyperId << 8 ), aFile, pFieldEntry->aFieldUrl, aEmpty, aEmpty );

                            rOut << (sal_uInt32)( ( EPP_InteractiveInfo << 16 ) | 0xf ) << (sal_uInt32)24
                                 << (sal_uInt32)( EPP_InteractiveInfoAtom << 16 ) << (sal_uInt32)16
                                 << (sal_uInt32)0									// soundref
                                 << nHyperId										// hyperlink id
                                 << (sal_uInt8)4									// hyperlink action
                                 << (sal_uInt8)0                                    // ole verb
                                 << (sal_uInt8)0                                    // jump
                                 << (sal_uInt8)0                                    // flags
                                 << (sal_uInt8)8                                    // hyperlink type ?
                                 << (sal_uInt8)0 << (sal_uInt8)0 << (sal_uInt8)0
                                 << (sal_uInt32)( EPP_TxInteractiveInfoAtom << 16 ) << (sal_uInt32)8
                                 << (sal_uInt32)( pFieldEntry->nFieldStartPos )
                                 << (sal_uInt32)( pFieldEntry->nFieldEndPos );
                        }
						break;
						case 5 :
						{
                            rOut << (sal_uInt32)( EPP_GenericDateMCAtom << 16 ) << (sal_uInt32)4
                                 << (sal_uInt32)( pFieldEntry->nFieldStartPos );
						}
						break;
						case 6 :
						{
                            rOut << (sal_uInt32)( EPP_HeaderMCAtom << 16 ) << (sal_uInt32 ) 4
                                 << (sal_uInt32)( pFieldEntry->nFieldStartPos );
						}
						break;
						case 7 :
						{
                            rOut << (sal_uInt32)( EPP_FooterMCAtom << 16 ) << (sal_uInt32 ) 4
                                 << (sal_uInt32)( pFieldEntry->nFieldStartPos );
						}
						break;
                        default:
                        break;
                    }
                }
            }
        }

		aTextObj.WriteTextSpecInfo( &rOut );

        // Star Office Default TabSizes schreiben ( wenn noetig )
        pPara = aTextObj.First();
        if ( pPara )
        {
            sal_uInt32  nParaFlags = 0x1f;
            sal_Int16   nDepth, nMask, nNumberingRule[ 10 ];
            sal_uInt32  nTextOfs = pPara->nTextOfs;
            sal_uInt32  nTabs = pPara->maTabStop.getLength();
            const ::com::sun::star::style::TabStop* pTabStop = ( const ::com::sun::star::style::TabStop* )pPara->maTabStop.getConstArray();

            for ( ; pPara; pPara = aTextObj.Next() )
            {
                if ( pPara->bExtendedParameters )
                {
                    nDepth = pPara->nDepth;
                    if ( nDepth < 5 )
                    {
                        nMask = 1 << nDepth;
                        if ( nParaFlags & nMask )
                        {
                            nParaFlags &=~ nMask;
                            if ( ( rParaSheet.maParaLevel[ nDepth ].mnTextOfs != pPara->nTextOfs ) ||
                                ( rParaSheet.maParaLevel[ nDepth ].mnBulletOfs != pPara->nBulletOfs ) )
                            {
                                nParaFlags |= nMask << 16;
                                nNumberingRule[ nDepth << 1 ] = pPara->nTextOfs;
                                nNumberingRule[ ( nDepth << 1 ) + 1 ] = (sal_Int16)pPara->nBulletOfs;
                            }
                        }
                    }
                }
            }
            nParaFlags >>= 16;

            sal_uInt32  nDefaultTabSize = ImplMapSize( ::com::sun::star::awt::Size( 2011, 1 ) ).Width;
            sal_uInt32  nDefaultTabs = abs( maRect.GetWidth() ) / nDefaultTabSize;
            if ( nTabs )
                nDefaultTabs -= (sal_Int32)( ( ( pTabStop[ nTabs - 1 ].Position / 4.40972 ) + nTextOfs ) / nDefaultTabSize );
            if ( (sal_Int32)nDefaultTabs < 0 )
                nDefaultTabs = 0;

            sal_uInt32 nTabCount = nTabs + nDefaultTabs;
            sal_uInt32 i, nTextRulerAtomFlags = 0;

            if ( nTabCount )
                nTextRulerAtomFlags |= 4;
            if ( nParaFlags )
                nTextRulerAtomFlags |= ( ( nParaFlags << 3 ) | ( nParaFlags << 8 ) );

            if ( nTextRulerAtomFlags )
            {
                SvStream* pRuleOut = &rOut;
                if ( pTextRule )
                    pRuleOut = pTextRule->pOut = new SvMemoryStream( 0x100, 0x100 );

                sal_uInt32 nRulePos = pRuleOut->Tell();
                *pRuleOut << (sal_uInt32)( EPP_TextRulerAtom << 16 ) << (sal_uInt32)0;
                *pRuleOut << nTextRulerAtomFlags;
                if ( nTextRulerAtomFlags & 4 )
                {
                    *pRuleOut << (sal_uInt16)nTabCount;
                    for ( i = 0; i < nTabs; i++ )
                    {
                        sal_uInt16 nPosition = (sal_uInt16)( ( pTabStop[ i ].Position / 4.40972 ) + nTextOfs );
                        sal_uInt16 nType;
                        switch ( pTabStop[ i ].Alignment )
                        {
                            case ::com::sun::star::style::TabAlign_DECIMAL :    nType = 3; break;
                            case ::com::sun::star::style::TabAlign_RIGHT :      nType = 2; break;
                            case ::com::sun::star::style::TabAlign_CENTER :     nType = 1; break;

                            case ::com::sun::star::style::TabAlign_LEFT :
                            default:                                            nType = 0;
                        };
                        *pRuleOut << nPosition
                                  << nType;
                    }

                    sal_uInt32 nWidth = 1;
                    if ( nTabs )
                        nWidth += (sal_Int32)( ( ( pTabStop[ nTabs - 1 ].Position / 4.40972 + nTextOfs ) / nDefaultTabSize ) );
                    nWidth *= nDefaultTabSize;
                    for ( i = 0; i < nDefaultTabs; i++, nWidth += nDefaultTabSize )
                        *pRuleOut << nWidth;
                }
                for ( i = 0; i < 5; i++ )
                {
                    if ( nTextRulerAtomFlags & ( 8 << i ) )
                        *pRuleOut << nNumberingRule[ i << 1 ];
                    if ( nTextRulerAtomFlags & ( 256 << i ) )
                        *pRuleOut << nNumberingRule[ ( i << 1 ) + 1 ];
                }
                sal_uInt32 nBufSize = pRuleOut->Tell() - nRulePos;
                pRuleOut->SeekRel( - ( (sal_Int32)nBufSize - 4 ) );
                *pRuleOut << (sal_uInt32)( nBufSize - 8 );
                pRuleOut->SeekRel( nBufSize - 8 );
            }
        }
        if ( aTextObj.HasExtendedBullets() )
        {
            ParagraphObj* pBulletPara = aTextObj.First();
            if ( pBulletPara )
            {
                sal_uInt32  nBulletFlags = 0;
                sal_uInt32  nNumberingType = 0, nPos2 = rExtBuStr.Tell();

                rExtBuStr << (sal_uInt32)( EPP_PST_ExtendedParagraphAtom << 16 ) << (sal_uInt32)0;

                for ( ; pBulletPara; pBulletPara = aTextObj.Next() )
                {
                    nBulletFlags = 0;
                    sal_uInt16 nBulletId = pBulletPara->nBulletId;
                    if ( pBulletPara->bExtendedBulletsUsed )
                    {
                        nBulletFlags = 0x800000;
                        if ( pBulletPara->nNumberingType != SVX_NUM_BITMAP )
                            nBulletFlags = 0x3000000;
                    }
                    rExtBuStr << (sal_uInt32)nBulletFlags;

                    if ( nBulletFlags & 0x800000 )
                        rExtBuStr << nBulletId;
                    if ( nBulletFlags & 0x1000000 )
                    {
                        switch( pBulletPara->nNumberingType )
                        {
                            case SVX_NUM_NUMBER_NONE :
                            case SVX_NUM_CHAR_SPECIAL :
                                nNumberingType = 0;
                            break;
                            case SVX_NUM_CHARS_UPPER_LETTER :
                            case SVX_NUM_CHARS_UPPER_LETTER_N :
                            case SVX_NUM_CHARS_LOWER_LETTER :
                            case SVX_NUM_CHARS_LOWER_LETTER_N :
                            case SVX_NUM_ROMAN_UPPER :
                            case SVX_NUM_ROMAN_LOWER :
                            case SVX_NUM_ARABIC :
							case SVX_NUM_NUMBER_UPPER_ZH:
							case SVX_NUM_CIRCLE_NUMBER:
							case SVX_NUM_NUMBER_UPPER_ZH_TW:
							case SVX_NUM_NUMBER_LOWER_ZH:
							case SVX_NUM_FULL_WIDTH_ARABIC:
                                nNumberingType = pBulletPara->nMappedNumType;
                            break;

    //                      case SVX_NUM_PAGEDESC :
                            case SVX_NUM_BITMAP :
                                nNumberingType = 0;
                            break;

                        }
                        rExtBuStr << (sal_uInt32)nNumberingType;
                    }
                    if ( nBulletFlags & 0x2000000 )
                        rExtBuStr << (sal_uInt16)pBulletPara->nStartWith;
                    rExtBuStr << (sal_uInt32)0 << (sal_uInt32)0;
                }
                sal_uInt32 nBulletSize = ( rExtBuStr.Tell() - nPos2 ) - 8;
                rExtBuStr.SeekRel( - ( (sal_Int32)nBulletSize + 4 ) );
                rExtBuStr << nBulletSize;
                rExtBuStr.SeekRel( nBulletSize );
            }
        }
    }
}

//  -----------------------------------------------------------------------

void PPTWriter::ImplWriteObjectEffect( SvStream& rSt,
    ::com::sun::star::presentation::AnimationEffect eAe,
    ::com::sun::star::presentation::AnimationEffect eTe,
    sal_uInt16 nOrder )
{
	EscherExContainer aAnimationInfo( rSt, EPP_AnimationInfo );
	EscherExAtom aAnimationInfoAtom( rSt, EPP_AnimationInfoAtom, 0, 1 );
	sal_uInt32  nDimColor = 0x7000000;  // color to use for dimming
	sal_uInt32  nFlags = 0x4400;        // set of flags that determine type of build
	sal_uInt32  nSoundRef = 0;          // 0 if storage is from clipboard. Otherwise index(ID) in SoundCollection list.
	sal_uInt32  nDelayTime = 0;         // delay before playing object
	sal_uInt16  nSlideCount = 1;        // number of slides to play object
	sal_uInt8   nBuildType = 1;         // type of build
	sal_uInt8   nFlyMethod = 0;         // animation effect( fly, zoom, appear, etc )
	sal_uInt8   nFlyDirection = 0;      // Animation direction( left, right, up, down, etc )
	sal_uInt8   nAfterEffect = 0;       // what to do after build
	sal_uInt8   nSubEffect = 0;         // build by word or letter
	sal_uInt8   nOleVerb = 0;           // Determines object's class (sound, video, other)

	if ( eAe == ::com::sun::star::presentation::AnimationEffect_NONE )
	{
		nBuildType = 0;
		eAe = eTe;
	}
	switch ( eAe )
	{
		case ::com::sun::star::presentation::AnimationEffect_NONE :
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LEFT :
		{
			nFlyDirection = 2;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_TOP :
		{
			nFlyDirection = 3;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_RIGHT :
		{
			nFlyDirection = 0;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_BOTTOM :
		{
			nFlyDirection = 1;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_TO_CENTER :
		{
			nFlyDirection = 1;
			nFlyMethod = 11;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_CENTER :
		{
			nFlyDirection = 0;
			nFlyMethod = 11;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LEFT :
		{
			nFlyDirection = 0;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_TOP :
		{
			nFlyDirection = 1;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_RIGHT :
		{
			nFlyDirection = 2;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_BOTTOM :
		{
			nFlyDirection = 3;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_VERTICAL_STRIPES :
		{
			nFlyDirection = 0;
			nFlyMethod = 2;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_STRIPES :
		{
			nFlyDirection = 1;
			nFlyMethod = 2;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_CLOCKWISE :
		{
			nFlyDirection = 1;
			nFlyMethod = 3;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_COUNTERCLOCKWISE :
		{
			nFlyDirection = 0;
			nFlyMethod = 3;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_UPPERLEFT :
		{
			nFlyDirection = 7;
			nFlyMethod = 9;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_UPPERRIGHT :
		{
			nFlyDirection = 6;
			nFlyMethod = 9;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LOWERLEFT :
		{
			nFlyDirection = 5;
			nFlyMethod = 9;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LOWERRIGHT :
		{
			nFlyDirection = 4;
			nFlyMethod = 9;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_CLOSE_VERTICAL :
		{
			nFlyDirection = 1;
			nFlyMethod = 13;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_CLOSE_HORIZONTAL :
		{
			nFlyDirection = 3;
			nFlyMethod = 13;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_OPEN_VERTICAL :
		{
			nFlyDirection = 0;
			nFlyMethod = 13;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_OPEN_HORIZONTAL :
		{
			nFlyDirection = 2;
			nFlyMethod = 13;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_PATH :
		{
			nFlyDirection = 28;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LEFT :
		{
			nFlyDirection = 0;
			nFlyMethod = 1;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_TOP :
		{
			nFlyDirection = 0;
			nFlyMethod = 1;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_RIGHT :
		{
			nFlyDirection = 0;
			nFlyMethod = 1;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_BOTTOM :
		{
			nFlyDirection = 0;
			nFlyMethod = 1;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_SPIRALIN_LEFT :
		case ::com::sun::star::presentation::AnimationEffect_SPIRALIN_RIGHT :
		case ::com::sun::star::presentation::AnimationEffect_SPIRALOUT_LEFT :
		case ::com::sun::star::presentation::AnimationEffect_SPIRALOUT_RIGHT :
		{
			nFlyDirection = 0x1c;
			nFlyMethod = 0xc;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_DISSOLVE :
		{
			nFlyDirection = 0;
			nFlyMethod = 5;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_LEFT :
		{
			nFlyDirection = 2;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_TOP :
		{
			nFlyDirection = 3;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_RIGHT :
		{
			nFlyDirection = 0;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_BOTTOM :
		{
			nFlyDirection = 1;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_RANDOM :
		{
			nFlyDirection = 0;
			nFlyMethod = 1;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_VERTICAL_LINES :
		{
			nFlyDirection = 1;
			nFlyMethod = 8;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_LINES :
		{
			nFlyDirection = 0;
			nFlyMethod = 8;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LEFT :
		{
			nFlyDirection = 2;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_TOP :
		{
			nFlyDirection = 3;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_RIGHT :
		{
			nFlyDirection = 0;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_BOTTOM :
		{
			nFlyDirection = 1;
			nFlyMethod = 10;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_UPPERLEFT :
		{
			nFlyDirection = 7;
			nFlyMethod = 9;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_UPPERRIGHT :
		{
			nFlyDirection = 6;
			nFlyMethod = 9;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LOWERLEFT :
		{
			nFlyDirection = 5;
			nFlyMethod = 9;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LOWERRIGHT :
		{
			nFlyDirection = 4;
			nFlyMethod = 9;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_APPEAR :
		break;
		case ::com::sun::star::presentation::AnimationEffect_HIDE :
		{
			nFlyDirection = 0;
			nFlyMethod = 1;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_UPPERLEFT :
		{
			nFlyDirection = 4;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_UPPERRIGHT :
		{
			nFlyDirection = 5;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LOWERRIGHT :
		{
			nFlyDirection = 7;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LOWERLEFT :
		{
			nFlyDirection = 6;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_UPPERLEFT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_UPPERRIGHT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LOWERRIGHT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LOWERLEFT :
			nAfterEffect |= 2;
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LEFT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_UPPERLEFT :
		{
			nFlyDirection = 8;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_TOP :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_UPPERRIGHT :
		{
			nFlyDirection = 11;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_RIGHT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LOWERRIGHT :
		{
			nFlyDirection = 10;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_BOTTOM :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LOWERLEFT :
		{
			nFlyDirection = 9;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LEFT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_UPPERLEFT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_TOP :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_UPPERRIGHT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_RIGHT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LOWERRIGHT :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_BOTTOM :
		case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LOWERLEFT :
			nAfterEffect |= 2;
		break;
		case ::com::sun::star::presentation::AnimationEffect_VERTICAL_CHECKERBOARD :
		{
			nFlyDirection = 1;
			nFlyMethod = 3;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_CHECKERBOARD :
		{
			nFlyDirection = 0;
			nFlyMethod = 3;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_ROTATE :
		case ::com::sun::star::presentation::AnimationEffect_VERTICAL_ROTATE :
		{
			nFlyDirection = 27;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_STRETCH :
		case ::com::sun::star::presentation::AnimationEffect_VERTICAL_STRETCH :
		{
			nFlyDirection = 22;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LEFT :
		case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_UPPERLEFT :
		{
			nFlyDirection = 23;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_TOP :
		case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_UPPERRIGHT :
		{
			nFlyDirection = 24;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_RIGHT :
		case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LOWERRIGHT :
		{
			nFlyDirection = 25;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_BOTTOM :
		case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LOWERLEFT :
		{
			nFlyDirection = 26;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN :
		{
			nFlyDirection = 16;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_SMALL :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_SPIRAL :
		{
			nFlyDirection = 17;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT :
		{
			nFlyDirection = 18;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_SMALL :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_SPIRAL :
		{
			nFlyDirection = 19;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LEFT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_UPPERLEFT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_TOP :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_UPPERRIGHT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_RIGHT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LOWERRIGHT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_BOTTOM :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LOWERLEFT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_CENTER :
		{
			nFlyDirection = 16;
			nFlyMethod = 12;
		}
		break;
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LEFT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_UPPERLEFT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_TOP :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_UPPERRIGHT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_RIGHT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LOWERRIGHT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_BOTTOM :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LOWERLEFT :
		case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_CENTER :
			nAfterEffect |= 2;
			break;
		default:
			break;
	}
	if ( mnDiaMode >= 1 )
		nFlags |= 4;
	if ( eTe != ::com::sun::star::presentation::AnimationEffect_NONE )
		nBuildType = 2;
	if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "SoundOn" ) ) ) )
	{
		sal_Bool bBool;
		mAny >>= bBool;
		if ( bBool )
		{
			if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "Sound" ) ) ) )
			{
				nSoundRef = maSoundCollection.GetId( *(::rtl::OUString*)mAny.getValue() );
				if ( nSoundRef )
					nFlags |= 0x10;
			}
		}
	}
	sal_Bool bDimHide = sal_False;
	sal_Bool bDimPrevious = sal_False;
	if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "DimHide" ) ) ) )
		mAny >>= bDimHide;
	if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "DimPrevious" ) ) ) )
		mAny >>= bDimPrevious;
	if ( bDimPrevious )
		nAfterEffect |= 1;
	if ( bDimHide )
		nAfterEffect |= 2;
	if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "DimColor" ) ) ) )
		nDimColor = mpPptEscherEx->GetColor( *((sal_uInt32*)mAny.getValue()) ) | 0xfe000000;

	rSt << nDimColor << nFlags << nSoundRef << nDelayTime
		<< nOrder                                   // order of build ( 1.. )
		<< nSlideCount << nBuildType << nFlyMethod << nFlyDirection
		<< nAfterEffect << nSubEffect << nOleVerb
		<< (sal_uInt16)0;                               // PadWord
}

//  -----------------------------------------------------------------------

void PPTWriter::ImplWriteClickAction( SvStream& rSt, ::com::sun::star::presentation::ClickAction eCa, sal_Bool bMediaClickAction )
{
    sal_uInt32 nSoundRef = 0;   // a reference to a sound in the sound collection, or NULL.
    sal_uInt32 nHyperLinkID = 0;// a persistent unique identifier to an external hyperlink object (only valid when action == HyperlinkAction).
    sal_uInt8   nAction = 0;     // Action See Action Table
    sal_uInt8   nOleVerb = 0;    // OleVerb Only valid when action == OLEAction. OLE verb to use, 0 = first verb, 1 = second verb, etc.
    sal_uInt8   nJump = 0;       // Jump See Jump Table
    sal_uInt8   nFlags = 0;      // Bit 1: Animated. If 1, then button is animated
                            // Bit 2: Stop sound. If 1, then stop current sound when button is pressed.
                            // Bit 3: CustomShowReturn. If 1, and this is a jump to custom show, then return to this slide after custom show.
    sal_uInt8   nHyperLinkType = 0;// HyperlinkType a value from the LinkTo enum, such as LT_URL (only valid when action == HyperlinkAction).

    String  aFile;

    /*
        Action Table:       Action Value
        NoAction            0
        MacroAction         1
        RunProgramAction    2
        JumpAction          3
        HyperlinkAction     4
        OLEAction           5
        MediaAction         6
        CustomShowAction    7

        Jump Table:     Jump Value
        NoJump          0
        NextSlide,      1
        PreviousSlide,  2
        FirstSlide,     3
        LastSlide,      4
        LastSlideViewed 5
        EndShow         6
    */

	if ( bMediaClickAction )
		nAction = 6;
	else switch( eCa )
    {
        case ::com::sun::star::presentation::ClickAction_STOPPRESENTATION :
            nJump += 2;
        case ::com::sun::star::presentation::ClickAction_LASTPAGE :
            nJump++;
        case ::com::sun::star::presentation::ClickAction_FIRSTPAGE :
            nJump++;
        case ::com::sun::star::presentation::ClickAction_PREVPAGE :
            nJump++;
        case ::com::sun::star::presentation::ClickAction_NEXTPAGE :
        {
            nJump++;
            nAction = 3;
        }
        break;
        case ::com::sun::star::presentation::ClickAction_SOUND :
        {
            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "Bookmark" ) ) ) )
                nSoundRef = maSoundCollection.GetId( *(::rtl::OUString*)mAny.getValue() );
        }
        break;
        case ::com::sun::star::presentation::ClickAction_PROGRAM :
        {
            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "Bookmark" ) ) ) )
            {
                INetURLObject aUrl( *(::rtl::OUString*)mAny.getValue() );
                if ( INET_PROT_FILE == aUrl.GetProtocol() )
                {
                    aFile = aUrl.PathToFileName();
                    nAction = 2;
                }
            }
        }
        break;

        case ::com::sun::star::presentation::ClickAction_BOOKMARK :
        {
            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "Bookmark" ) ) ) )
            {
                String  aBookmark( *(::rtl::OUString*)mAny.getValue() );
                sal_uInt32 nIndex = 0;
                for ( String* pStr = (String*)maSlideNameList.First(); pStr; pStr = (String*)maSlideNameList.Next(), nIndex++ )
                {
                    if ( *pStr == aBookmark )
                    {
                        // Bookmark ist ein link zu einer Dokumentseite
                        nAction = 4;
                        nHyperLinkType = 7;

						String aEmpty;
						String aHyperString = UniString::CreateFromInt32( 256 + nIndex );
                        aHyperString.Append( String( RTL_CONSTASCII_USTRINGPARAM( "," ) ) );
                        aHyperString.Append( String::CreateFromInt32( nIndex + 1 ) );
                        aHyperString.Append( String( RTL_CONSTASCII_USTRINGPARAM( ",Slide " ) ) );
                        aHyperString.Append( String::CreateFromInt32( nIndex + 1 ) );
						nHyperLinkID = ImplInsertBookmarkURL( aHyperString, 1 | ( nIndex << 8 ) | ( 1 << 31 ), aBookmark, aEmpty, aEmpty, aHyperString );
                    }
                }
            }
        }
        break;

        case ::com::sun::star::presentation::ClickAction_DOCUMENT :
		{
            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "Bookmark" ) ) ) )
            {
                String aBookmark( *(::rtl::OUString*)mAny.getValue() );
				if ( aBookmark.Len() )
				{
					nAction = 4;
					nHyperLinkType = 8;

					String aEmpty;
					String aBookmarkFile( aBookmark );
		            INetURLObject aUrl( aBookmark );
			        if ( INET_PROT_FILE == aUrl.GetProtocol() )
					    aBookmarkFile = aUrl.PathToFileName();
					nHyperLinkID = ImplInsertBookmarkURL( aBookmark, (sal_uInt32)(2 | ( 1 << 31 )), aBookmarkFile, aBookmark, aEmpty, aEmpty );
				}
			}
		}
		break;

        case ::com::sun::star::presentation::ClickAction_INVISIBLE :
        case ::com::sun::star::presentation::ClickAction_VERB :
        case ::com::sun::star::presentation::ClickAction_VANISH :
        case ::com::sun::star::presentation::ClickAction_MACRO :
        default :
        break;
    }

    sal_uInt32 nContainerSize = 24;
    if ( nAction == 2 )
        nContainerSize += ( aFile.Len() * 2 ) + 8;
    rSt << (sal_uInt32)( ( EPP_InteractiveInfo << 16 ) | 0xf ) << (sal_uInt32)nContainerSize
        << (sal_uInt32)( EPP_InteractiveInfoAtom << 16 ) << (sal_uInt32)16
        << nSoundRef
        << nHyperLinkID
        << nAction
        << nOleVerb
        << nJump
        << nFlags
        << (sal_uInt32)nHyperLinkType;

    if ( nAction == 2 )		// run program Action
    {
        sal_uInt16 i, nLen = aFile.Len();
        rSt << (sal_uInt32)( ( EPP_CString << 16 ) | 0x20 ) << (sal_uInt32)( nLen * 2 );
        for ( i = 0; i < nLen; i++ )
            rSt << aFile.GetChar( i );
    }

    rSt << (sal_uInt32)( ( EPP_InteractiveInfo << 16 ) | 0x1f ) << (sal_uInt32)24   // Mouse Over Action
        << (sal_uInt32)( EPP_InteractiveInfo << 16 ) << (sal_uInt32)16;
    for ( int i = 0; i < 4; i++, rSt << (sal_uInt32)0 ) ;
}

//  -----------------------------------------------------------------------

sal_Bool PPTWriter::ImplGetEffect( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rPropSet,
                                ::com::sun::star::presentation::AnimationEffect& eEffect,
                                ::com::sun::star::presentation::AnimationEffect& eTextEffect,
                                sal_Bool& bIsSound )
{
    ::com::sun::star::uno::Any aAny;
    if ( GetPropertyValue( aAny, rPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Effect" ) ) ) )
        aAny >>= eEffect;
    else
        eEffect = ::com::sun::star::presentation::AnimationEffect_NONE;

    if ( GetPropertyValue( aAny, rPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextEffect" ) ) ) )
        aAny >>= eTextEffect;
    else
        eTextEffect = ::com::sun::star::presentation::AnimationEffect_NONE;
    if ( GetPropertyValue( aAny, rPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "SoundOn" ) ) ) )
        aAny >>= bIsSound;
    else
        bIsSound = sal_False;

    sal_Bool bHasEffect = ( ( eEffect != ::com::sun::star::presentation::AnimationEffect_NONE )
                        || ( eTextEffect != ::com::sun::star::presentation::AnimationEffect_NONE )
                        || bIsSound );
    return bHasEffect;
};

//  -----------------------------------------------------------------------

sal_Bool PPTWriter::ImplCreatePresentationPlaceholder( const sal_Bool bMasterPage, const PageType /* ePageType */,
														const sal_uInt32 nStyleInstance, const sal_uInt8 nPlaceHolderId )
{
	sal_Bool bRet = ImplGetText();
	if ( bRet && bMasterPage )
	{
		mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
        sal_uInt32 nPresShapeID = mpPptEscherEx->GenerateShapeId();
		mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, nPresShapeID );// Flags: HaveAnchor | HasSpt
		EscherPropertyContainer aPropOpt;
		aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
		aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
		aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
		aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
		aPropOpt.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
		aPropOpt.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
		aPropOpt.CreateFillProperties( mXPropSet, sal_True, mXShape );
		sal_uInt32 nLineFlags = 0x90001;
		if ( aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
			nLineFlags |= 0x10001;  // draw dashed line if no line
		aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );

		SvMemoryStream  aExtBu( 0x200, 0x200 );
		SvMemoryStream	aClientTextBox( 0x200, 0x200 );
        ImplWriteTextStyleAtom( aClientTextBox, nStyleInstance, 0, NULL, aExtBu, &aPropOpt );

		aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_True );
		aPropOpt.CreateShapeProperties( mXShape );
		aPropOpt.Commit( *mpStrm );
		mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
		*mpStrm << (sal_Int16)maRect.Top() << (sal_Int16)maRect.Left() << (sal_Int16)maRect.Right() << (sal_Int16)maRect.Bottom();      // oben, links, rechts, unten ????
		mpPptEscherEx->OpenContainer( ESCHER_ClientData );
		mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
		*mpStrm << (sal_uInt32)0                // PlacementID
				<< (sal_uInt8)nPlaceHolderId	// PlaceHolderID
				<< (sal_uInt8)0					// Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
				<< (sal_uInt16)0;               // padword
		mpPptEscherEx->CloseContainer();		// ESCHER_ClientData
/*
		if ( aExtBu.Tell() )
        {
            if ( !pClientData )
                pClientData = new SvMemoryStream( 0x200, 0x200 );
            ImplProgTagContainer( pClientData, &aExtBu );
        }
*/
        if ( aClientTextBox.Tell() )
        {
            *mpStrm << (sal_uInt32)( ( ESCHER_ClientTextbox << 16 ) | 0xf )
                    << (sal_uInt32)aClientTextBox.Tell();

            mpStrm->Write( aClientTextBox.GetData(), aClientTextBox.Tell() );
        }
		mpPptEscherEx->CloseContainer();    // ESCHER_SpContainer
	}
	else
		bRet = sal_False;
	return bRet;
}

//  -----------------------------------------------------------------------

void PPTWriter::ImplCreateShape( sal_uInt32 nType, sal_uInt32 nFlags, EscherSolverContainer& rSolver )
{
    sal_uInt32 nId = mpPptEscherEx->GenerateShapeId();
    mpPptEscherEx->AddShape( nType, nFlags, nId );
    rSolver.AddShape( mXShape, nId );
}

void PPTWriter::ImplCreateTextShape( EscherPropertyContainer& rPropOpt, EscherSolverContainer& rSolver, sal_Bool bFill )
{
    mnTextStyle = EPP_TEXTSTYLE_TEXT;
    mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    ImplCreateShape( ESCHER_ShpInst_TextBox, 0xa00, rSolver );
    if ( bFill )
        rPropOpt.CreateFillProperties( mXPropSet, sal_True, mXShape );
	if ( ImplGetText() )
		rPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_True );
}

void PPTWriter::ImplWritePage( const PHLayout& rLayout, EscherSolverContainer& aSolverContainer, PageType ePageType, sal_Bool bMasterPage, int nPageNumber )
{
    // #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
    // sal_uInt32  nGroupLevel = 0;

    sal_uInt32  nInstance, nGroups, nShapes, nShapeCount, nPer, nLastPer, nIndices, nOlePictureId;
    sal_uInt16  nEffectCount;
    ::com::sun::star::awt::Point   aTextRefPoint;

    ResetGroupTable( nShapes = mXShapes->getCount() );

    nIndices = nInstance = nLastPer = nShapeCount = nEffectCount = 0;

    sal_Bool bIsTitlePossible = sal_True;           // bei mehr als einem title geht powerpoint in die knie

    sal_uInt32  nOutlinerCount = 0;             // die gliederungsobjekte muessen dem layout entsprechen,
    sal_uInt32  nPrevTextStyle = 0;                // es darf nicht mehr als zwei geben

    nOlePictureId = 0;

    sal_Bool bAdditionalText = sal_False;

	sal_Bool bSecOutl = sal_False;
	sal_uInt32 nPObjects = 0;

    SvMemoryStream* pClientTextBox = NULL;
    SvMemoryStream* pClientData = NULL;

    while( GetNextGroupEntry() )
    {
        nShapeCount++;

        nPer = ( 5 * nShapeCount ) / nShapes;
        if ( nPer != nLastPer )
        {
            nLastPer = nPer;
            sal_uInt32 nValue = mnPagesWritten * 5 + nPer;
            if ( nValue > mnStatMaxValue )
                nValue = mnStatMaxValue;
            if ( mbStatusIndicator && ( nValue > mnLatestStatValue ) )
            {
                mXStatusIndicator->setValue( nValue );
                mnLatestStatValue = nValue;
            }
        }
        nGroups = GetGroupsClosed();
        for ( sal_uInt32 i = 0; i < nGroups; i++, mpPptEscherEx->LeaveGroup() ) ;

        if ( ImplGetShapeByIndex( GetCurrentGroupIndex(), sal_True ) )
        {
            sal_Bool bIsSound;
			sal_Bool bMediaClickAction = sal_False;
            ::com::sun::star::presentation::AnimationEffect eAe;
            ::com::sun::star::presentation::AnimationEffect eTe;

            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "PresentationOrder" ) ) ) )
                nEffectCount = *(sal_uInt16*)mAny.getValue();

            sal_Bool bEffect = ImplGetEffect( mXPropSet, eAe, eTe, bIsSound );
			::com::sun::star::presentation::ClickAction eCa = ::com::sun::star::presentation::ClickAction_NONE;
            if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) ) ) )
                mAny >>= eCa;

            sal_Bool bGroup = mType == "drawing.Group";
            sal_Bool bOpenBezier   = mType == "drawing.OpenBezier";
            sal_Bool bClosedBezier = mType == "drawing.ClosedBezier";
            sal_Bool bPolyPolygon  = mType == "drawing.PolyPolygon";
            sal_Bool bPolyLine = mType == "drawing.PolyLine";

			List        aAdjustmentList;
            Rectangle   aPolyBoundRect;

            const ::com::sun::star::awt::Size   aSize100thmm( mXShape->getSize() );
            const ::com::sun::star::awt::Point  aPoint100thmm( mXShape->getPosition() );
            Rectangle   aRect100thmm( Point( aPoint100thmm.X, aPoint100thmm.Y ), Size( aSize100thmm.Width, aSize100thmm.Height ) );
            EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect100thmm );

            if ( bGroup )
            {
                SvMemoryStream* pTmp = NULL;
                ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess >
                    aXIndexAccess( mXShape, ::com::sun::star::uno::UNO_QUERY );
                if ( EnterGroup( aXIndexAccess ) )
                {
                    if ( bEffect && !mbUseNewAnimations )
                    {
                        pTmp = new SvMemoryStream( 0x200, 0x200 );
						ImplWriteObjectEffect( *pTmp, eAe, eTe, ++nEffectCount );
                    }
					if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
					{
						if ( !pTmp )
							pTmp = new SvMemoryStream( 0x200, 0x200 );
						ImplWriteClickAction( *pTmp, eCa, bMediaClickAction );
					}
                    sal_uInt32 nShapeId = mpPptEscherEx->EnterGroup( &maRect, pTmp );
					aSolverContainer.AddShape( mXShape, nShapeId );
                    delete pTmp;
                }
            }
            else
            {
                sal_Bool bIsFontwork = sal_False;
				sal_Bool bIsHatching = sal_False;
                ::com::sun::star::uno::Any aAny;
				::com::sun::star::drawing::FillStyle eFS;
                if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFontwork" ) ), sal_True ) )
                    aAny >>= bIsFontwork;
				if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ) ), sal_True ) )
				{
					aAny >>= eFS;
					bIsHatching = eFS == ::com::sun::star::drawing::FillStyle_HATCH;
				}
                if ( bIsHatching || bIsFontwork || ( mType == "drawing.Measure" ) || ( mType == "drawing.Caption" ) )
                {
                    if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "BoundRect" ) ) ) )
                    {
                        ::com::sun::star::awt::Rectangle aRect( *(::com::sun::star::awt::Rectangle*)mAny.getValue() );
                        maPosition = ImplMapPoint( ::com::sun::star::awt::Point( aRect.X, aRect.Y ) );
                        maSize = ImplMapSize( ::com::sun::star::awt::Size( aRect.Width, aRect.Height ) );
                        maRect = Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
                    }
					mType = "drawing.dontknow";
                }
            }
            sal_uInt8 nPlaceHolderAtom = EPP_PLACEHOLDER_NONE;

            mnTextSize = 0;
            mnTextStyle = EPP_TEXTSTYLE_NORMAL;

            if ( mType == "drawing.Custom" )
            {
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
				sal_uInt32 nMirrorFlags;
				rtl::OUString sCustomShapeType;
				MSO_SPT eShapeType = aPropOpt.GetCustomShapeType( mXShape, nMirrorFlags, sCustomShapeType );
				if ( sCustomShapeType.equalsAscii( "col-502ad400" ) || sCustomShapeType.equalsAscii( "col-60da8460" ) )
				{	// sj: creating metafile for customshapes that can't be saved to ms format properly
					ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
					if ( aPropOpt.CreateGraphicProperties( mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "MetaFile" ) ), sal_False ) )
					{
						aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
						SdrObject* pObj = GetSdrObjectFromXShape( mXShape );
						if ( pObj )
						{
							Rectangle aBound = pObj->GetCurrentBoundRect();
							maPosition = ImplMapPoint( ::com::sun::star::awt::Point( aBound.Left(), aBound.Top() ) );
					        maSize = ImplMapSize( ::com::sun::star::awt::Size ( aBound.GetWidth(), aBound.GetHeight() ) );
							maRect = Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
							mnAngle = 0;
						}
					}
				}
				else
				{
	                ImplCreateShape( eShapeType, nMirrorFlags | 0xa00, aSolverContainer );
					aPropOpt.CreateCustomShapeProperties( eShapeType, mXShape );
					aPropOpt.CreateFillProperties( mXPropSet, sal_True, mXShape);
					if ( ImplGetText() )
					{
						if ( !aPropOpt.IsFontWork() )
							aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_True, sal_True );
					}
				}
            }
            else if ( mType == "drawing.Rectangle" )
            {
                sal_Int32 nRadius = 0;
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CornerRadius" ) ) ) )
                {
                    mAny >>= nRadius;
                    nRadius = ImplMapSize( ::com::sun::star::awt::Size( nRadius, 0 ) ).Width;
                }
                if ( nRadius )
                {
                    ImplCreateShape( ESCHER_ShpInst_RoundRectangle, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
                    sal_Int32 nLenght = maRect.GetWidth();
                    if ( nLenght > maRect.GetHeight() )
                        nLenght = maRect.GetHeight();
                    nLenght >>= 1;
                    if ( nRadius >= nLenght )
                        nRadius = 0x2a30;                           // 0x2a30 ist PPTs maximum radius
                    else
                        nRadius = ( 0x2a30 * nRadius ) / nLenght;
                    aPropOpt.AddOpt( ESCHER_Prop_adjustValue, nRadius );
                }
                else
                {
                    ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa00, aSolverContainer );          // Flags: Connector | HasSpt
                }
                aPropOpt.CreateFillProperties( mXPropSet, sal_True, mXShape );
				if ( ImplGetText() )
					aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_False );
            }
            else if ( mType == "drawing.Ellipse" )
            {
                ::com::sun::star::drawing::CircleKind  eCircleKind( ::com::sun::star::drawing::CircleKind_FULL );
                PolyStyle ePolyKind = POLY_CHORD;
                if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CircleKind" ) ) ) )
                {
                    mAny >>= eCircleKind;
                    switch ( eCircleKind )
                    {
                        case ::com::sun::star::drawing::CircleKind_SECTION :
                        {
                            ePolyKind = POLY_PIE;
                        }
                        break;
                        case ::com::sun::star::drawing::CircleKind_ARC :
                        {
                            ePolyKind = POLY_ARC;
                        }
                        break;

                        case ::com::sun::star::drawing::CircleKind_CUT :
                        {
                            ePolyKind = POLY_CHORD;
                        }
                        break;

                        default:
                            eCircleKind = ::com::sun::star::drawing::CircleKind_FULL;
                    }
                }
                if ( eCircleKind == ::com::sun::star::drawing::CircleKind_FULL )
                {
                    mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                    ImplCreateShape( ESCHER_ShpInst_Ellipse, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
                    aPropOpt.CreateFillProperties( mXPropSet, sal_True, mXShape );
					if ( ImplGetText() )
						aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_False );
				}
                else
                {
                    sal_Int32 nStartAngle, nEndAngle;
                    if ( !ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CircleStartAngle" ) ) ) )
                        continue;
                    nStartAngle = *( (sal_Int32*)mAny.getValue() );
                    if( !ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CircleEndAngle" ) ) ) )
                        continue;
                    nEndAngle = *( (sal_Int32*)mAny.getValue() );
                    ::com::sun::star::awt::Point aPoint( mXShape->getPosition() );
                    ::com::sun::star::awt::Size  aSize( mXShape->getSize() );
                    ::com::sun::star::awt::Point aStart, aEnd, aCenter;
                    Rectangle aRect( Point( aPoint.X, aPoint.Y ), Size( aSize.Width, aSize.Height ) );
                    aStart.X = (sal_Int32)( ( cos( (double)( nStartAngle * F_PI18000 ) ) * 100.0 ) );
                    aStart.Y = - (sal_Int32)( ( sin( (double)( nStartAngle * F_PI18000 ) ) * 100.0 ) );
                    aEnd.X = (sal_Int32)( ( cos( (double)( nEndAngle * F_PI18000 ) ) * 100.0 ) );
                    aEnd.Y = - (sal_Int32)( ( sin( (double)( nEndAngle * F_PI18000 ) ) * 100.0 ) );
                    aCenter.X = aPoint.X + ( aSize.Width / 2 );
                    aCenter.Y = aPoint.Y + ( aSize.Height / 2 );
                    aStart.X += aCenter.X;
                    aStart.Y += aCenter.Y;
                    aEnd.X += aCenter.X;
                    aEnd.Y += aCenter.Y;
                    Polygon aPolygon( aRect, Point( aStart.X, aStart.Y ), Point( aEnd.X, aEnd.Y ), ePolyKind );
					sal_Bool bNeedText = sal_True;
					if ( mnAngle )
					{
						aPolygon.Rotate( aRect.TopLeft(), (sal_uInt16)( mnAngle / 10 ) );
						if ( ImplGetText() )
						{
							// #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
                            // mpPptEscherEx->EnterGroup( 0,0 );
							// nGroupLevel = mpPptEscherEx->GetGroupLevel();
							bNeedText = sal_False;
							bAdditionalText = sal_True;
							mnTextSize = 0;
						}
						mnAngle = 0;
					}
                    mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                    ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );       // Flags: Connector | HasSpt
                    ::com::sun::star::awt::Rectangle aNewRect;
                    switch ( ePolyKind )
                    {
                        case POLY_PIE :
                        case POLY_CHORD :
                        {
                            if ( aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, sal_False, aNewRect, &aPolygon ) )
                                aPropOpt.CreateFillProperties( mXPropSet, sal_True , mXShape );
                        }
                        break;

                        case POLY_ARC :
                        {
                            if ( aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, sal_False, aNewRect, &aPolygon ) )
                                aPropOpt.CreateLineProperties( mXPropSet, sal_False );
                        }
                        break;
                    }
                    maRect = ImplMapRectangle( aNewRect );
                    maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
                    maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
					if ( bNeedText && ImplGetText() )
						aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_False );
                }
            }
            else if ( mType == "drawing.Control" )
            {
                ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XControlShape  >
                    aXControlShape( mXShape, ::com::sun::star::uno::UNO_QUERY );
                if ( !aXControlShape.is() )
                    continue;
                ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >
                    aXControlModel( aXControlShape->getControl() );
                if ( !aXControlModel.is() )
                    continue;

				sal_Int64 nAspect = ::com::sun::star::embed::Aspects::MSOLE_CONTENT;
				try
				{
					// try to get the aspect when available
					::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
						xShapeProps( mXShape, ::com::sun::star::uno::UNO_QUERY_THROW );
					xShapeProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Aspect" ) ) ) >>= nAspect;
				}
				catch( ::com::sun::star::uno::Exception& )
				{}

                *mpExEmbed  << (sal_uInt32)( 0xf | ( EPP_ExControl << 16 ) )
                            << (sal_uInt32)0;               // Size of this container

                sal_uInt32 nSize, nOldPos = mpExEmbed->Tell();

                sal_uInt32 nPageId = nPageNumber;
                if ( ePageType == MASTER )
                    nPageId |= 0x80000000;
                else
                    nPageId += 0x100;
                *mpExEmbed  << (sal_uInt32)( EPP_ExControlAtom << 16 )
                            << (sal_uInt32)4
                            << nPageId;
                PPTExOleObjEntry* pEntry = new PPTExOleObjEntry( OCX_CONTROL, mpExEmbed->Tell() );
                pEntry->xControlModel = aXControlModel;
                pEntry->xShape = mXShape;
                maExOleObj.Insert( pEntry );

                mnExEmbed++;

                *mpExEmbed  << (sal_uInt32)( 1 | ( EPP_ExOleObjAtom << 16 ) )
                            << (sal_uInt32)24
                            << (sal_uInt32)nAspect
                            << (sal_uInt32)2
                            << (sal_uInt32)mnExEmbed
                            << (sal_uInt32)0
                            << (sal_uInt32)4    // index to the persist table
                            << (sal_uInt32)0x0012de00;


                ::com::sun::star::awt::Size     aSize;
                String          aControlName;
                SvStorageRef    xTemp( new SvStorage( new SvMemoryStream(), sal_True ) );
                if ( SvxMSConvertOCXControls::WriteOCXStream( xTemp, aXControlModel, aSize, aControlName ) )
                {
                    String  aUserName( xTemp->GetUserName() );
                    String  aOleIdentifier;
                    if ( aUserName.Len() )
                    {
                        SvStorageStreamRef xCompObj = xTemp->OpenSotStream(
                            String( RTL_CONSTASCII_USTRINGPARAM( "\1CompObj" ) ),
                                STREAM_READ | STREAM_NOCREATE | STREAM_SHARE_DENYALL );
                        xCompObj->Seek( STREAM_SEEK_TO_END );
                        sal_uInt32  nStreamLen = xCompObj->Tell();
                        xCompObj->Seek( 0 );
                        sal_Int16   nVersion, nByteOrder;
                        sal_Int32   nWinVersion, nVal, nStringLen;
                        *xCompObj   >> nVersion
                                    >> nByteOrder
                                    >> nWinVersion
                                    >> nVal;
                        xCompObj->SeekRel( 16 );    // skipping clsid
                        *xCompObj   >> nStringLen;
                        if ( ( xCompObj->Tell() + nStringLen ) < nStreamLen )
                        {
                            xCompObj->SeekRel( nStringLen );        // now skipping the UserName;
                            *xCompObj >> nStringLen;
                            if ( ( xCompObj->Tell() + nStringLen ) < nStreamLen )
                            {
                                xCompObj->SeekRel( nStringLen );    // now skipping the clipboard formatname
                                *xCompObj   >> nStringLen;
                                if ( ( nStringLen > 1 ) && ( ( xCompObj->Tell() + nStringLen ) < nStreamLen ) )
                                {   // i think that the OleIdentifier will follow
                                    ByteString aTemp;
                                    sal_Char* p = aTemp.AllocBuffer( (sal_uInt16)(nStringLen - 1) );
                                    xCompObj->Read( p, nStringLen - 1 );
                                    aOleIdentifier = String( aTemp, gsl_getSystemTextEncoding() );
                                }
                            }
                        }
                    }
                    if ( aControlName.Len() )
                        PPTWriter::WriteCString( *mpExEmbed, aControlName, 1 );
                    if ( aOleIdentifier.Len() )
                        PPTWriter::WriteCString( *mpExEmbed, aOleIdentifier, 2 );
                    if ( aUserName.Len() )
                        PPTWriter::WriteCString( *mpExEmbed, aUserName, 3 );
                }
                nSize = mpExEmbed->Tell() - nOldPos;
                mpExEmbed->Seek( nOldPos - 4 );
                *mpExEmbed << nSize;
                mpExEmbed->Seek( STREAM_SEEK_TO_END );
                nOlePictureId = mnExEmbed;

                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                sal_uInt32 nSpFlags = SHAPEFLAG_HAVESPT | SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_OLESHAPE;
                ImplCreateShape( ESCHER_ShpInst_HostControl, nSpFlags, aSolverContainer );
                if ( aPropOpt.CreateGraphicProperties( mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "MetaFile" ) ), sal_False  ) )
                    aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
                //export form control graphic
                else if ( aPropOpt.CreateBlipPropertiesforOLEControl(mXPropSet,mXShape))
                    aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
                aPropOpt.AddOpt( ESCHER_Prop_pictureId, mnExEmbed );
                aPropOpt.AddOpt( ESCHER_Prop_pictureActive, 0x10000 );

                if ( aControlName.Len() )
                {
                    sal_uInt16 i, nBufSize;
                    nBufSize = ( aControlName.Len() + 1 ) << 1;
                    sal_uInt8* pBuf = new sal_uInt8[ nBufSize ];
                    sal_uInt8* pTmp = pBuf;
                    for ( i = 0; i < aControlName.Len(); i++ )
                    {
                        sal_Unicode nUnicode = aControlName.GetChar( i );
                        *pTmp++ = (sal_uInt8)nUnicode;
                        *pTmp++ = (sal_uInt8)( nUnicode >> 8 );
                    }
                    *pTmp++ = 0;
                    *pTmp = 0;
                    aPropOpt.AddOpt( ESCHER_Prop_wzName, sal_True, nBufSize, pBuf, nBufSize );
                }
            }
            else if ( mType == "drawing.Connector" )
            {
                sal_uInt16 nSpType, nSpFlags;
                ::com::sun::star::awt::Rectangle aNewRect;
                if ( aPropOpt.CreateConnectorProperties( mXShape, aSolverContainer, aNewRect, nSpType, nSpFlags ) == sal_False )
                    continue;

                maRect = ImplMapRectangle( aNewRect );
                maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
                maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );

                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                ImplCreateShape( nSpType, nSpFlags, aSolverContainer );

                // #119459# for connector shape, the start point and end point is fixed, and should not be rotated.
                mnAngle = 0;
            }
            else if ( mType == "drawing.Measure" )
            {
                continue;
            }
            else if ( mType == "drawing.Line" )
            {
                ::com::sun::star::awt::Rectangle aNewRect;
                aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_LINE, sal_False, aNewRect, NULL );
                maRect = ImplMapRectangle( aNewRect );
                maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
                maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
                if ( ImplGetText() )
                {
                    aTextRefPoint = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
                    mnTextSize = 0;
                    bAdditionalText = sal_True;
                    // #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
                    // mpPptEscherEx->EnterGroup( &maRect,0 );
                }
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                sal_uInt32 nFlags = 0xa00;                                  // Flags: Connector | HasSpt
                if ( maRect.Top() > maRect.Bottom() )
                    nFlags |= 0x80;                                         // Flags: VertMirror
                if ( maRect.Left() > maRect.Right() )
                    nFlags |= 0x40;                                         // Flags: HorzMirror

                ImplCreateShape( ESCHER_ShpInst_Line, nFlags, aSolverContainer );
                aPropOpt.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex );
                aPropOpt.CreateLineProperties( mXPropSet, sal_False );
                mnAngle = 0;
            }
            else if ( bPolyPolygon )
            {
                if ( ImplGetText() )
                {
                    // #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
                    // mpPptEscherEx->EnterGroup( 0,0 );
                    // nGroupLevel = mpPptEscherEx->GetGroupLevel();
                    bAdditionalText = sal_True;
                    mnTextSize = 0;
                }
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
                ::com::sun::star::awt::Rectangle aNewRect;
                aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, sal_False, aNewRect, NULL );
                maRect = ImplMapRectangle( aNewRect );
                maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
                maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
                aPropOpt.CreateFillProperties( mXPropSet, sal_True , mXShape );
                mnAngle = 0;
            }
            else if ( bPolyLine )
            {
                if ( ImplGetText() )
                {
                    // #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
                    // mpPptEscherEx->EnterGroup( 0,0 );
                    // nGroupLevel = mpPptEscherEx->GetGroupLevel();
                    bAdditionalText = sal_True;
                    mnTextSize = 0;
                }
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
                ::com::sun::star::awt::Rectangle aNewRect;
                aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, sal_False, aNewRect, NULL );
                maRect = ImplMapRectangle( aNewRect );
                maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
                maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
                aPropOpt.CreateLineProperties( mXPropSet, sal_False );
                mnAngle = 0;
            }
            else if ( bOpenBezier )
            {
                if ( ImplGetText() )
                {
                    // #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
                    // mpPptEscherEx->EnterGroup( 0,0 );
                    // nGroupLevel = mpPptEscherEx->GetGroupLevel();
                    bAdditionalText = sal_True;
                    mnTextSize = 0;
                }
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
                ::com::sun::star::awt::Rectangle aNewRect;
                aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, sal_True, aNewRect, NULL );
                maRect = ImplMapRectangle( aNewRect );
                maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
                maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
                aPropOpt.CreateLineProperties( mXPropSet, sal_False );
                mnAngle = 0;
            }
            else if ( bClosedBezier )
            {
                if ( ImplGetText() )
                {
                    // #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
                    // mpPptEscherEx->EnterGroup( 0,0 );
                    // nGroupLevel = mpPptEscherEx->GetGroupLevel();
                    bAdditionalText = sal_True;
                    mnTextSize = 0;
                }
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
                ::com::sun::star::awt::Rectangle aNewRect;
                aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, sal_True, aNewRect, NULL );
                maRect = ImplMapRectangle( aNewRect );
                maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
                maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
                aPropOpt.CreateFillProperties( mXPropSet, sal_True , mXShape );
                mnAngle = 0;
            }
            else if ( ( mType == "drawing.GraphicObject" ) || ( mType == "presentation.GraphicObject" ) )
            {
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );

                // ein GraphicObject kann auch ein ClickMe Element sein
                if ( mbEmptyPresObj && ( ePageType == NORMAL ) )
                {
                    nPlaceHolderAtom = rLayout.nUsedObjectPlaceHolder;
                    ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer );           // Flags: HaveAnchor | HaveMaster
                    aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
                    aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
                    aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 );
                    aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
                }
                else
                {
                    mXText = ::com::sun::star::uno::Reference<
                        ::com::sun::star::text::XSimpleText >
                            ( mXShape, ::com::sun::star::uno::UNO_QUERY );

                    if ( mXText.is() )
                        mnTextSize = mXText->getString().getLength();

                    if ( mnTextSize )                                       // graphic object oder Flachenfuellung
                    {
						/* SJ #i34951#: because M. documents are not allowing GraphicObjects containing text, we
						have to create a simpe Rectangle with fill bitmap instead (while not allowing BitmapMode_Repeat).
						*/
                        ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa00, aSolverContainer );       // Flags: Connector | HasSpt
                        if ( aPropOpt.CreateGraphicProperties( mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "GraphicURL" ) ), sal_True, sal_True, sal_False ) )
                        {
                            aPropOpt.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapNone );
                            aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
                            aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 );
                            aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0x8000000 );
                            aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
                            if ( ImplGetText() )
								aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_False );
                        }
                    }
                    else
                    {
                        ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );

                        if ( aPropOpt.CreateGraphicProperties( mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "GraphicURL" ) ), sal_False, sal_True ) )
                        {
                            aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
                        }
                    }
                }
            }
            else if ( ( mType == "drawing.Text" ) || ( mType == "presentation.Notes" ) )
            {
                if ( ( ePageType == NOTICE ) && mbPresObj )
                {
					if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Notes, EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE ) )
						continue;
					else
                        nPlaceHolderAtom = EPP_PLACEHOLDER_NOTESBODY;
                }
                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_True );
            }
            else if ( mType == "presentation.TitleText" )
            {
                if ( mbPresObj )
                {
                    if ( ( ePageType == NOTICE ) && mbEmptyPresObj )
                    {
                        mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                        nPlaceHolderAtom = EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE;
                        ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x200, aSolverContainer );
                        aPropOpt.CreateLineProperties( mXPropSet, sal_False );
                        aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
                    }
                    else if ( rLayout.bTitlePossible && bIsTitlePossible )
                    {
                        bIsTitlePossible = sal_False;

						ImplGetText();
						TextObj aTextObj( mXText, EPP_TEXTTYPE_Title, maFontCollection, (PPTExBulletProvider&)*this );
                        if ( ePageType == MASTER )
						{
							if ( mnTextSize )
							{
								::rtl::OUString aUString( mXText->getString() );
								sal_uInt16 nChar;

								mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                                mnShapeMasterTitle = mpPptEscherEx->GenerateShapeId();
								mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, mnShapeMasterTitle );// Flags: HaveAnchor | HasSpt
								EscherPropertyContainer aPropertyOptions;
								aPropertyOptions.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
								aPropertyOptions.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
								aPropertyOptions.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
//								aPropertyOptions.AddOpt( ESCHER_Prop_fillColor, nFillColor );
//								aPropertyOptions.AddOpt( ESCHER_Prop_fillBackColor, nFillBackColor );
								aPropertyOptions.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
								aPropertyOptions.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
								aPropertyOptions.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
								aPropertyOptions.CreateFillProperties( mXPropSet, sal_True, mXShape );
								sal_uInt32 nLineFlags = 0x90001;
								if ( aPropertyOptions.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
									nLineFlags |= 0x10001;  // draw dashed line if no line
								aPropertyOptions.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
								aPropertyOptions.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_True );
								ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
								aPropertyOptions.Commit( *mpStrm );
								mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
								*mpStrm << (sal_Int16)maRect.Top() << (sal_Int16)maRect.Left() << (sal_Int16)maRect.Right() << (sal_Int16)maRect.Bottom();      // oben, links, rechts, unten ????
								mpPptEscherEx->OpenContainer( ESCHER_ClientData );
								mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
								*mpStrm << (sal_uInt32)0                                                        // PlacementID
										<< (sal_uInt8)EPP_PLACEHOLDER_MASTERTITLE                               // PlaceHolderID
										<< (sal_uInt8)0                                                         // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
										<< (sal_uInt16)0;                                                       // padword
								mpPptEscherEx->CloseContainer();    // ESCHER_ClientData
								mpPptEscherEx->OpenContainer( ESCHER_ClientTextbox );
								mpPptEscherEx->AddAtom( 4, EPP_TextHeaderAtom );
								*mpStrm << (sal_uInt32)EPP_TEXTTYPE_Title;
								mpPptEscherEx->AddAtom( mnTextSize << 1, EPP_TextCharsAtom );
								const sal_Unicode* pString = aUString.getStr();
								for ( sal_uInt32 i = 0; i < mnTextSize; i++ )
								{
									nChar = pString[ i ];       // 0xa -> 0xb weicher Zeilenumbruch
									if ( nChar == 0xa )
										nChar++;                // 0xd -> 0xd harter Zeilenumbruch
									*mpStrm << nChar;
								}
								mpPptEscherEx->AddAtom( 6, EPP_BaseTextPropAtom );
								*mpStrm << (sal_uInt32)( mnTextSize + 1 ) << (sal_uInt16)0;
								mpPptEscherEx->AddAtom( 10, EPP_TextSpecInfoAtom );
								*mpStrm << (sal_uInt32)( mnTextSize + 1 ) << (sal_uInt32)1 << (sal_uInt16)0;
								mpPptEscherEx->CloseContainer();    // ESCHER_ClientTextBox
								mpPptEscherEx->CloseContainer();    // ESCHER_SpContainer
							}
							continue;
						}
						else
						{
							mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
							mnTextStyle = EPP_TEXTSTYLE_TITLE;
							nPlaceHolderAtom = rLayout.nTypeOfTitle;
							ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer );          // Flags: HaveAnchor | HaveMaster
							aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterTitle );
							aPropOpt.CreateFillProperties( mXPropSet, sal_True, mXShape );
							aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_True );
							ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
							if ( mbEmptyPresObj )
							{
								sal_uInt32 nNoLineDrawDash = 0;
								aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
								nNoLineDrawDash |= 0x10001;
								aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
							}
						}
                    }
                    else
                        mbPresObj = sal_False;
                }
                if ( !mbPresObj )
                {
                    mType = "drawing.Text";
					ImplCreateTextShape( aPropOpt, aSolverContainer, sal_True );
                }
            }
            else if ( ( mType == "presentation.Outliner" ) || ( mType == "presentation.Subtitle" ) )
            {
                if ( mbPresObj )
                {
                    nOutlinerCount++;
                    if ( (rLayout.bOutlinerPossible && ( nOutlinerCount == 1 )) ||
                         (( rLayout.bSecOutlinerPossible && ( nOutlinerCount == 2 ) ) && ( nPrevTextStyle == EPP_TEXTSTYLE_BODY ))
                       )
                    {
						ImplGetText();
						TextObj aTextObj( mXText, EPP_TEXTTYPE_Body, maFontCollection, (PPTExBulletProvider&)*this );
                        if ( ePageType == MASTER )
                        {
                            nPrevTextStyle = EPP_TEXTSTYLE_TITLE;
							if ( mnTextSize )
							{
								mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                                mnShapeMasterBody = mpPptEscherEx->GenerateShapeId();
								mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, mnShapeMasterBody );  // Flags: HaveAnchor | HasSpt
								EscherPropertyContainer aPropOpt2;
								aPropOpt2.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
								aPropOpt2.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
//								aPropOpt2.AddOpt( ESCHER_Prop_fillColor, nFillColor );
//								aPropOpt2.AddOpt( ESCHER_Prop_fillBackColor, nFillBackColor );
								aPropOpt2.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
								aPropOpt2.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
								aPropOpt2.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90001 );
								aPropOpt2.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
								aPropOpt2.CreateFillProperties( mXPropSet, sal_True, mXShape  );
								sal_uInt32 nLineFlags = 0x90001;
								if ( aPropOpt2.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
									nLineFlags |= 0x10001;  // draw dashed line if no line
								aPropOpt2.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
								aPropOpt2.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_True );
								ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt2 );
								aPropOpt2.Commit( *mpStrm );
								mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
								*mpStrm << (sal_Int16)maRect.Top() << (sal_Int16)maRect.Left() << (sal_Int16)maRect.Right() << (sal_Int16)maRect.Bottom();  // oben, links, rechts, unten ????
								mpPptEscherEx->OpenContainer( ESCHER_ClientData );
								mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
								sal_uInt8 PlaceHolderID = ( mType == "presentation.Subtitle") ? EPP_PLACEHOLDER_MASTERSUBTITLE:EPP_PLACEHOLDER_MASTERBODY;
								*mpStrm << (sal_uInt32)1                                                        // PlacementID
										<< PlaceHolderID/*(sal_uInt8)EPP_PLACEHOLDER_MASTERBODY */                                   // PlaceHolderID
										<< (sal_uInt8)0                                                         // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
										<< (sal_uInt16)0;                                                       // padword
								mpPptEscherEx->CloseContainer();    // ESCHER_ClientData
								mpPptEscherEx->OpenContainer( ESCHER_ClientTextbox );       // printf
								mpPptEscherEx->AddAtom( 4, EPP_TextHeaderAtom );
								if ( mType == "presentation.Subtitle")
									*mpStrm << (sal_uInt32)EPP_TEXTTYPE_CenterBody;
								else
									*mpStrm << (sal_uInt32)EPP_TEXTTYPE_Body;
								mnTextSize = aTextObj.Count();
								aTextObj.Write( mpStrm );
								mpPptEscherEx->BeginAtom();
								for ( ParagraphObj* pPara = aTextObj.First() ; pPara; pPara = aTextObj.Next() )
								{
									sal_uInt32 nCharCount = pPara->Count();
									sal_uInt16 nDepth = pPara->nDepth;
									if ( nDepth > 4)
										nDepth = 4;

									*mpStrm << nCharCount
											<< nDepth;
								}
								mpPptEscherEx->EndAtom( EPP_BaseTextPropAtom );
								mpPptEscherEx->AddAtom( 10, EPP_TextSpecInfoAtom );
								*mpStrm << (sal_uInt32)( mnTextSize ) << (sal_uInt32)1 << (sal_uInt16)0;

								mpPptEscherEx->CloseContainer();    // ESCHER_ClientTextBox
								mpPptEscherEx->CloseContainer();    // ESCHER_SpContainer
							}
                            continue;
                        }
						else
						{
							mnTextStyle = EPP_TEXTSTYLE_BODY;
							nPlaceHolderAtom = rLayout.nTypeOfOutliner;
							mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
							ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer );          // Flags: HaveAnchor | HaveMaster
							aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
							aPropOpt.CreateFillProperties( mXPropSet, sal_True, mXShape );
							aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_True );
							ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
							if ( mbEmptyPresObj )
							{
								sal_uInt32 nNoLineDrawDash = 0;
								aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
								nNoLineDrawDash |= 0x10001;
								aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
							}
						}
                    }
                    else
                        mbPresObj = sal_False;
                }
                if ( !mbPresObj )
                {
					if (ePageType == MASTER )
					{
						SdrObject* pObj = GetSdrObjectFromXShape( mXShape );
						if (pObj && pObj->IsNotVisibleAsMaster())
							continue;
					}
					
                    mType = "drawing.Text";
	                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_True );
                }
            }
            else if ( ( mType == "drawing.Page" ) || ( mType == "presentation.Page" ) )
            {
                if ( ( ePageType == NOTICE ) && mbPresObj )
                {
					if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Notes, EPP_PLACEHOLDER_MASTERNOTESSLIDEIMAGE ) )
						continue;
					else
                        nPlaceHolderAtom = EPP_PLACEHOLDER_NOTESSLIDEIMAGE;
                }
                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_True );
            }
            else if ( mType == "drawing.Frame" )
            {
                continue;
            }
            else if ( ( mType == "drawing.OLE2" ) || ( mType == "presentation.OLE2" )
                        || ( mType == "presentation.Chart" ) || ( mType == "presentation.Calc" )
                            || ( mType == "presentation.OrgChart" ) )
            {
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                if ( mbEmptyPresObj && ( ePageType == NORMAL ) )
                {
                    nPlaceHolderAtom = rLayout.nUsedObjectPlaceHolder;
                    ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer );              // Flags: HaveAnchor | HaveMaster
                    aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
                    aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
                    aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 );
                    aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
                }
                else
                {
					*mpExEmbed  << (sal_uInt32)( 0xf | ( EPP_ExEmbed << 16 ) )
								<< (sal_uInt32)0;               // Size of this container

					sal_uInt32 nSize, nOldPos = mpExEmbed->Tell();

					*mpExEmbed  << (sal_uInt32)( EPP_ExEmbedAtom << 16 )
								<< (sal_uInt32)8
								<< (sal_uInt32)0    // follow colorscheme : 0->do not follow
													//                      1->follow collorscheme
													//                      2->follow text and background scheme
								<< (sal_uInt8)1     // (bool)set if embedded server can not be locked
								<< (sal_uInt8)0     // (bool)do not need to send dimension
								<< (sal_uInt8)0     // (bool)is object a world table
								<< (sal_uInt8)0;    // pad byte

					PPTExOleObjEntry* pE = new PPTExOleObjEntry( NORMAL_OLE_OBJECT, mpExEmbed->Tell() );
					pE->xShape = mXShape;
					maExOleObj.Insert( pE );

					mnExEmbed++;

					sal_Int64 nAspect = ::com::sun::star::embed::Aspects::MSOLE_CONTENT;
					try
					{
						// try to get the aspect when available
						::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
							xShapeProps( mXShape, ::com::sun::star::uno::UNO_QUERY_THROW );
						xShapeProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Aspect" ) ) ) >>= nAspect;
					}
					catch( ::com::sun::star::uno::Exception& )
					{}

					*mpExEmbed  << (sal_uInt32)( 1 | ( EPP_ExOleObjAtom << 16 ) )
								<< (sal_uInt32)24
								<< (sal_uInt32)nAspect		// Aspect
								<< (sal_uInt32)0
								<< (sal_uInt32)mnExEmbed    // index to the persist table
								<< (sal_uInt32)0            // subtype
								<< (sal_uInt32)0
								<< (sal_uInt32)0x0012b600;

//					PPTWriter::WriteCString( *mpExEmbed, "Photo Editor Photo", 1 );
//                  PPTWriter::WriteCString( *mpExEmbed, "MSPhotoEd.3", 2 );
//                  PPTWriter::WriteCString( *mpExEmbed, "Microsoft Photo Editor 3.0 Photo", 3 );

					nSize = mpExEmbed->Tell() - nOldPos;
					mpExEmbed->Seek( nOldPos - 4 );
					*mpExEmbed << nSize;
					mpExEmbed->Seek( STREAM_SEEK_TO_END );
					nOlePictureId = mnExEmbed;

                    sal_uInt32 nSpFlags = 0xa00;
                    if ( nOlePictureId )
                        nSpFlags |= 0x10;
                    ImplCreateShape( ESCHER_ShpInst_PictureFrame, nSpFlags, aSolverContainer );
                    if ( aPropOpt.CreateOLEGraphicProperties( mXShape ) )
                        aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
                    if ( nOlePictureId )
                        aPropOpt.AddOpt( ESCHER_Prop_pictureId, nOlePictureId );
                }
            }
			else if ( mType == "presentation.Header" )
			{
				if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERHEADER ) )
					continue;
				else
				{
					mbPresObj = sal_False;
                    mType = "drawing.Text";
	                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_True );
                }
			}
			else if ( mType == "presentation.Footer" )
			{
				if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERFOOTER ) )
					continue;
				else
				{
					mbPresObj = sal_False;
                    mType = "drawing.Text";
	                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_True );
                }
			}
			else if ( mType == "presentation.DateTime" )
			{
				if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERDATE ) )
					continue;
				else
				{
					mbPresObj = sal_False;
                    mType = "drawing.Text";
	                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_True );
                }
			}
			else if ( mType == "presentation.SlideNumber" )
			{
				if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERSLIDENUMBER ) )
					continue;
				else
				{
					mbPresObj = sal_False;
                    mType = "drawing.Text";
	                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_True );
                }
			}
            else if ( ( (sal_Char)'3' == mType.GetChar( 8 ) ) && ( (char)'D' == mType.GetChar( 9 ) ) )  // drawing.3D
            {
                // SceneObject, CubeObject, SphereObject, LatheObject, ExtrudeObject, PolygonObject
                if ( !ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "Bitmap" ) ) ) )
                    continue;

                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );

                if ( aPropOpt.CreateGraphicProperties( mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Bitmap" ) ), sal_False ) )
                    aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
            }
			else if ( mType == "drawing.Media" )
			{
				mnAngle = 0;
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
				if ( aPropOpt.CreateMediaGraphicProperties( mXShape ) )
					aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
				::com::sun::star::uno::Any aAny;
				if ( PropValue::GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ), sal_True ) )
				{
					rtl::OUString aMediaURL;
					if ( (aAny >>= aMediaURL ) &&  aMediaURL.getLength() )
					{
						// SJ: creating the Media RefObj
						sal_uInt32 nRefId = ++mnExEmbed;

						*mpExEmbed  << (sal_uInt16)0xf
									<< (sal_uInt16)EPP_ExMCIMovie		// PPT_PST_ExAviMovie
									<< (sal_uInt32)0;
						sal_uInt32 nSize, nStart = mpExEmbed->Tell();
						*mpExEmbed  << (sal_uInt16)0
									<< (sal_uInt16)EPP_ExObjRefAtom
									<< (sal_uInt32)4
									<< nRefId;
						*mpExEmbed  << (sal_uInt16)0xf
									<< (sal_uInt16)EPP_ExVideo
									<< (sal_uInt32)0;

						*mpExEmbed	<< (sal_uInt16)0
									<< (sal_uInt16)EPP_ExMediaAtom
									<< (sal_uInt32)8
									<< nRefId
									<< (sal_uInt16)0
									<< (sal_uInt16)0x435;


						sal_uInt16 i, nStringLen = (sal_uInt16)aMediaURL.getLength();
						*mpExEmbed << (sal_uInt32)( EPP_CString << 16 ) << (sal_uInt32)( nStringLen * 2 );
						for ( i = 0; i < nStringLen; i++ )
						{
							sal_Unicode nChar = aMediaURL[ i ];
							*mpExEmbed << nChar;
						}
						nSize = mpExEmbed->Tell() - nStart;
						mpExEmbed->SeekRel( - ( (sal_Int32)nSize + 4 ) );
						*mpExEmbed << nSize;	// size of PPT_PST_ExMCIMovie
						mpExEmbed->SeekRel( 0x10 );
						nSize -= 20;
						*mpExEmbed << nSize;	// PPT_PST_ExMediaAtom
						mpExEmbed->SeekRel( nSize );

	                    if ( !pClientData )
		                    pClientData = new SvMemoryStream( 0x200, 0x200 );
						*pClientData << (sal_uInt16)0
									 << (sal_uInt16)EPP_ExObjRefAtom
									 << (sal_uInt32)4
									 << nRefId;
						// write EPP_InteractiveInfo container for no_action
						*pClientData << (sal_uInt32)( ( EPP_InteractiveInfo << 16 ) | 0xf ) << (sal_uInt32)24;
						*pClientData << (sal_uInt16)0
									 << (sal_uInt16)EPP_InteractiveInfoAtom
									 << (sal_uInt32)16
									 << (sal_uInt32) 0
									 << (sal_uInt32) 0
									 << (sal_uInt8) 6
									 << (sal_uInt8) 0
									 << (sal_uInt8) 0
									 << (sal_uInt8) 0
									 << (sal_uInt32) 0;
					}
				}
			}
			else if ( (mType == "drawing.Table") || (mType == "presentation.Table") )
			{
				SvMemoryStream* pTmp = NULL;
				if ( bEffect && !mbUseNewAnimations )
				{
					pTmp = new SvMemoryStream( 0x200, 0x200 );
					ImplWriteObjectEffect( *pTmp, eAe, eTe, ++nEffectCount );
				}
				if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
				{
					if ( !pTmp )
						pTmp = new SvMemoryStream( 0x200, 0x200 );
					ImplWriteClickAction( *pTmp, eCa, bMediaClickAction );
				}
				ImplCreateTable( mXShape, aSolverContainer, aPropOpt );
				continue;
			}
            else if ( mType == "drawing.dontknow" )
            {
                mnAngle = 0;
                mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
                ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
                if ( aPropOpt.CreateGraphicProperties( mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "MetaFile" ) ), sal_False ) )
                    aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
            }
            else
            {
                continue;
            }
            sal_Int32 nPlacementID = -1;

            sal_Bool bClientData = ( bEffect || ( eCa != ::com::sun::star::presentation::ClickAction_NONE ) ||
                                        nPlaceHolderAtom || nOlePictureId );
            if ( bClientData )
            {
                if ( nPlaceHolderAtom )
                {
                    if ( ( mnTextStyle == EPP_TEXTSTYLE_TITLE ) || ( mnTextStyle == EPP_TEXTSTYLE_BODY ) )
                        nPlacementID = nIndices++;
                    else
                    {
                        switch ( nPlaceHolderAtom )
                        {
                            default :
                            {
                                if ( nPlaceHolderAtom < 19 )
                                    break;
                            }
                            case EPP_PLACEHOLDER_NOTESBODY :
                            case EPP_PLACEHOLDER_MASTERDATE :
                            case EPP_PLACEHOLDER_NOTESSLIDEIMAGE :
                            case EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE :
                                nPlacementID = nIndices++;
                        }
                    }
                    if ( !pClientData )
                        pClientData = new SvMemoryStream( 0x200, 0x200 );

                    *pClientData << (sal_uInt32)( EPP_OEPlaceholderAtom << 16 ) << (sal_uInt32)8
                                 << nPlacementID                // PlacementID
                                 << (sal_uInt8)nPlaceHolderAtom // PlaceHolderID
                                 << (sal_uInt8)0                // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
                                 << (sal_uInt16)0;              // padword
                }
                if ( nOlePictureId )
                {
                    if ( !pClientData )
                        pClientData = new SvMemoryStream( 0x200, 0x200 );

                    *pClientData << (sal_uInt32)( EPP_ExObjRefAtom << 16 ) << (sal_uInt32)4
                                 << nOlePictureId;
                    nOlePictureId = 0;
                }
                if ( bEffect )
                {
                    if ( !pClientData )
                        pClientData = new SvMemoryStream( 0x200, 0x200 );

                    // check if it is sensible to replace the object effect with text effect,
                    // because in Impress there is the possibility to use a compound effect,
                    // e.g. the object effect is an AnimationEffect_FADE_FROM_LEFT and the
                    // text effect is a AnimationEffect_FADE_FROM_TOP, in PowerPoint there
                    // can be used only one effect
                    if ( mnTextSize && ( eTe != ::com::sun::star::presentation::AnimationEffect_NONE )
                        && ( eAe != ::com::sun::star::presentation::AnimationEffect_NONE )
                            && ( eTe != eAe ) )
                    {
                        sal_uInt32 nFillStyleFlags, nLineStyleFlags;
                        if ( aPropOpt.GetOpt( ESCHER_Prop_fNoFillHitTest, nFillStyleFlags )
                            && aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineStyleFlags ) )
                        {
                            // there is no fillstyle and also no linestyle
                            if ( ! ( ( nFillStyleFlags & 0x10 ) + ( nLineStyleFlags & 9 ) ) )
                                eAe = eTe;
                        }
                    }
					if ( !mbUseNewAnimations  )
						ImplWriteObjectEffect( *pClientData, eAe, eTe, ++nEffectCount );
                }

                if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
                {
                    if ( !pClientData )
                        pClientData = new SvMemoryStream( 0x200, 0x200 );
                    ImplWriteClickAction( *pClientData, eCa, bMediaClickAction );
                }
            }
            if ( ( mnTextStyle == EPP_TEXTSTYLE_TITLE ) || ( mnTextStyle == EPP_TEXTSTYLE_BODY ) )
            {
                if ( !pClientTextBox )
                    pClientTextBox = new SvMemoryStream( 0x200, 0x200 );

                if ( mbEmptyPresObj == sal_False )
                {
                    if ( ( ePageType == NORMAL ) && ( bMasterPage == sal_False ) )
                    {
						sal_uInt32 nTextType = EPP_TEXTTYPE_Body;
						if ( mnTextStyle == EPP_TEXTSTYLE_BODY )
						{				
							if ( bSecOutl )
								nTextType = EPP_TEXTTYPE_HalfBody;
							else if ( mType == "presentation.Subtitle" )
								nTextType = EPP_TEXTTYPE_CenterBody;
							bSecOutl = sal_True;
						}
						else
							nTextType = EPP_TEXTTYPE_Title;

                        TextRuleEntry aTextRule( nPageNumber );
						SvMemoryStream aExtBu( 0x200, 0x200 );
						ImplGetText();
                        ImplWriteTextStyleAtom( *pClientTextBox, nTextType, nPObjects, &aTextRule, aExtBu, NULL );
                        ImplWriteExtParaHeader( aExtBu, nPObjects++, nTextType, nPageNumber + 0x100 );
						SvMemoryStream* pOut = aTextRule.pOut;
                        if ( pOut )
                        {
                            pClientTextBox->Write( pOut->GetData(), pOut->Tell() );
                            delete pOut, aTextRule.pOut = NULL;
                        }
						if ( aExtBu.Tell() )
						{
							if ( !pClientData )
								pClientData = new SvMemoryStream( 0x200, 0x200 );
							ImplProgTagContainer( pClientData, &aExtBu );
						}
                    }
                }
            }
            else
            {
				if ( !aPropOpt.IsFontWork() )
				{
					if ( mnTextSize || ( nPlaceHolderAtom == EPP_PLACEHOLDER_MASTERDATE ) || ( nPlaceHolderAtom == EPP_PLACEHOLDER_NOTESBODY ) )
					{
						int nInstance2;
						if ( ( nPlaceHolderAtom == EPP_PLACEHOLDER_MASTERDATE ) || ( nPlaceHolderAtom == EPP_PLACEHOLDER_NOTESBODY ) )
							nInstance2 = 2;
						else
							nInstance2 = EPP_TEXTTYPE_Other;     // Text in a Shape

						if ( !pClientTextBox )
							pClientTextBox = new SvMemoryStream( 0x200, 0x200 );

						SvMemoryStream  aExtBu( 0x200, 0x200 );
						ImplWriteTextStyleAtom( *pClientTextBox, nInstance2, 0, NULL, aExtBu, &aPropOpt );
						if ( aExtBu.Tell() )
						{
							if ( !pClientData )
								pClientData = new SvMemoryStream( 0x200, 0x200 );
							ImplProgTagContainer( pClientData, &aExtBu );
						}
					}
					else if ( nPlaceHolderAtom >= 19 )
					{
						if ( !pClientTextBox )
							pClientTextBox = new SvMemoryStream( 12 );

						*pClientTextBox << (sal_uInt32)( EPP_TextHeaderAtom << 16 ) << (sal_uInt32)4
										<< (sal_uInt32)7;
					}
				}
            }

			aPropOpt.CreateShadowProperties( mXPropSet );
            maRect.Justify();
            if ( mnAngle )
                ImplFlipBoundingBox( aPropOpt );
            aPropOpt.CreateShapeProperties( mXShape );
			aPropOpt.Commit( *mpStrm );
			if ( GetCurrentGroupLevel() > 0 )		
		        mpPptEscherEx->AddChildAnchor( maRect );
			else
				mpPptEscherEx->AddClientAnchor( maRect );

			if ( pClientData )
            {
                *mpStrm << (sal_uInt32)( ( ESCHER_ClientData << 16 ) | 0xf )
                        << (sal_uInt32)pClientData->Tell();

                mpStrm->Write( pClientData->GetData(), pClientData->Tell() );
                delete pClientData, pClientData = NULL;
            }
            if ( pClientTextBox )
            {
                *mpStrm << (sal_uInt32)( ( ESCHER_ClientTextbox << 16 ) | 0xf )
                        << (sal_uInt32)pClientTextBox->Tell();

                mpStrm->Write( pClientTextBox->GetData(), pClientTextBox->Tell() );
                delete pClientTextBox, pClientTextBox = NULL;
            }
            mpPptEscherEx->CloseContainer();      // ESCHER_SpContainer
        }
        nPrevTextStyle = mnTextStyle;

        if ( bAdditionalText )
        {
            bAdditionalText = sal_False;

            ::com::sun::star::uno::Any  aAny;
            EscherPropertyContainer     aPropOpt;
            mnAngle = ( PropValue::GetPropertyValue( aAny,
                mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "RotateAngle" ) ), sal_True ) )
                    ? *((sal_Int32*)aAny.getValue() )
                    : 0;

            aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 );
            aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 );
            if ( mType == "drawing.Line" )
            {
                double fDist = hypot( maRect.GetWidth(), maRect.GetHeight() );
                maRect = Rectangle( Point( aTextRefPoint.X, aTextRefPoint.Y ),
                                        Point( (sal_Int32)( aTextRefPoint.X + fDist ), aTextRefPoint.Y - 1 ) );
                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_False );
                aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x60006 );        // Size Shape To Fit Text
                if ( mnAngle < 0 )
                    mnAngle = ( 36000 + mnAngle ) % 36000;
                if ( mnAngle )
                    ImplFlipBoundingBox( aPropOpt );
            }
            else
            {
                ImplCreateTextShape( aPropOpt, aSolverContainer, sal_False );
                if ( mnAngle < 0 )
                    mnAngle = ( 36000 + mnAngle ) % 36000;
                else
                    mnAngle = ( 36000 - ( mnAngle % 36000 ) );

                mnAngle *= 655;
                mnAngle += 0x8000;
                mnAngle &=~0xffff;  // nAngle auf volle Gradzahl runden
                aPropOpt.AddOpt( ESCHER_Prop_Rotation, mnAngle );

                // #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
                // mpPptEscherEx->SetGroupSnapRect( nGroupLevel, maRect );
                // mpPptEscherEx->SetGroupLogicRect( nGroupLevel, maRect );
            }
            if ( !pClientTextBox )
                pClientTextBox = new SvMemoryStream( 0x200, 0x200 );

            SvMemoryStream  aExtBu( 0x200, 0x200 );
            ImplWriteTextStyleAtom( *pClientTextBox, EPP_TEXTTYPE_Other, 0, NULL, aExtBu, &aPropOpt );

            aPropOpt.CreateShapeProperties( mXShape );
            aPropOpt.Commit( *mpStrm );
			if ( GetCurrentGroupLevel() > 0 )		
		        mpPptEscherEx->AddChildAnchor( maRect );
			else
				mpPptEscherEx->AddClientAnchor( maRect );

            *mpStrm << (sal_uInt32)( ( ESCHER_ClientTextbox << 16 ) | 0xf )
                    << (sal_uInt32)pClientTextBox->Tell();

            mpStrm->Write( pClientTextBox->GetData(), pClientTextBox->Tell() );
            delete pClientTextBox, pClientTextBox = NULL;

            mpPptEscherEx->CloseContainer();  // ESCHER_SpContainer
            
            // #119551# PPT does not support groups of polygons and text (MS patch KB2289187) 
            // mpPptEscherEx->LeaveGroup();
        }
    }
    ClearGroupTable();                              // gruppierungen wegschreiben, sofern noch irgendwelche offen sind, was eigendlich nicht sein sollte
    nGroups = GetGroupsClosed();
    for ( sal_uInt32 i = 0; i < nGroups; i++, mpPptEscherEx->LeaveGroup() ) ;
    mnPagesWritten++;
}

//  -----------------------------------------------------------------------

::com::sun::star::awt::Point PPTWriter::ImplMapPoint( const ::com::sun::star::awt::Point& rPoint )
{
    Point aRet( OutputDevice::LogicToLogic( Point( rPoint.X, rPoint.Y ), maMapModeSrc, maMapModeDest ) );
    return ::com::sun::star::awt::Point( aRet.X(), aRet.Y() );
}

//  -----------------------------------------------------------------------

::com::sun::star::awt::Size PPTWriter::ImplMapSize( const ::com::sun::star::awt::Size& rSize )
{
    Size aRetSize( OutputDevice::LogicToLogic( Size( rSize.Width, rSize.Height ), maMapModeSrc, maMapModeDest ) );

    if ( !aRetSize.Width() )
        aRetSize.Width()++;
    if ( !aRetSize.Height() )
        aRetSize.Height()++;
    return ::com::sun::star::awt::Size( aRetSize.Width(), aRetSize.Height() );
}

//  -----------------------------------------------------------------------

Rectangle PPTWriter::ImplMapRectangle( const ::com::sun::star::awt::Rectangle& rRect )
{
    ::com::sun::star::awt::Point    aPoint( rRect.X, rRect.Y );
    ::com::sun::star::awt::Size     aSize( rRect.Width, rRect.Height );
    ::com::sun::star::awt::Point    aP( ImplMapPoint( aPoint ) );
    ::com::sun::star::awt::Size     aS( ImplMapSize( aSize ) );
    return Rectangle( Point( aP.X, aP.Y ), Size( aS.Width, aS.Height ) );
}

//  -----------------------------------------------------------------------

struct CellBorder
{
	sal_Int32						mnPos;		// specifies the distance to the top/left position of the table
	sal_Int32						mnLength;
	table::BorderLine				maCellBorder;

	CellBorder() : mnPos ( 0 ), mnLength( 0 ){};
};

sal_Bool PPTWriter::ImplCreateCellBorder( const CellBorder* pCellBorder, sal_Int32 nX1, sal_Int32 nY1, sal_Int32 nX2, sal_Int32 nY2)
{
	sal_Int32 nLineWidth = pCellBorder->maCellBorder.OuterLineWidth + pCellBorder->maCellBorder.InnerLineWidth;
	if ( nLineWidth )
	{
		nLineWidth *= 2;
		mnAngle = 0;
		mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
		EscherPropertyContainer aPropOptSp;

        sal_uInt32 nId = mpPptEscherEx->GenerateShapeId();
		mpPptEscherEx->AddShape( ESCHER_ShpInst_Line, 0xa02, nId );
		aPropOptSp.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex );
		aPropOptSp.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0xa0008 );
		aPropOptSp.AddOpt( ESCHER_Prop_fshadowObscured, 0x20000 );

		sal_uInt32 nBorderColor = pCellBorder->maCellBorder.Color & 0xff00;					// green
		nBorderColor |= static_cast< sal_uInt8 >( pCellBorder->maCellBorder.Color ) << 16;	// red
		nBorderColor |= static_cast< sal_uInt8 >( pCellBorder->maCellBorder.Color >> 16 );	// blue
		aPropOptSp.AddOpt( ESCHER_Prop_lineColor, nBorderColor );

		aPropOptSp.AddOpt( ESCHER_Prop_lineWidth, nLineWidth * 360 );
		aPropOptSp.AddOpt( ESCHER_Prop_fc3DLightFace, 0x80000 );
		aPropOptSp.Commit( *mpStrm );
		mpPptEscherEx->AddAtom( 16, ESCHER_ChildAnchor );
		*mpStrm 	<< nX1
					<< nY1
					<< nX2
					<< nY2;
		mpPptEscherEx->CloseContainer();
		return sal_True;
	}
	return sal_False;
}

//get merged cell's width
sal_Int32 GetCellRight( sal_Int32 nColumn,  
	Rectangle& rect,
	std::vector< std::pair< sal_Int32, sal_Int32 > >& aColumns,
	uno::Reference< table::XMergeableCell >& xCell )
{
	sal_Int32 nRight = aColumns[ nColumn ].first + aColumns[ nColumn ].second;
	for ( sal_Int32 nColumnSpan = 1; nColumnSpan < xCell->getColumnSpan(); nColumnSpan++ )
	{
		sal_uInt32 nC = nColumnSpan + nColumn;
		if ( nC < aColumns.size() )
			nRight += aColumns[ nC ].second;
		else
			nRight = rect.Right();
	}
	return nRight;
}
//get merged cell's height
sal_Int32 GetCellBottom( sal_Int32 nRow, 
	Rectangle& rect,
	std::vector< std::pair< sal_Int32, sal_Int32 > >& aRows,
	uno::Reference< table::XMergeableCell >& xCell )
{
	sal_Int32 nBottom = aRows[nRow].first + aRows[nRow].second;
	for ( sal_Int32 nRowSpan = 1; nRowSpan < xCell->getRowSpan(); nRowSpan++ )
	{
		sal_uInt32 nR = nRowSpan + nRow;
		if ( nR < aRows.size() )
			nBottom += aRows[ nR ].second;
		else
			nBottom = rect.Bottom();
	}
	return nBottom;
}

void PPTWriter::WriteCString( SvStream& rSt, const String& rString, sal_uInt32 nInstance )
{
    sal_uInt32 i, nLen = rString.Len();
    if ( nLen )
    {
        rSt << (sal_uInt32)( ( nInstance << 4 ) | ( EPP_CString << 16 ) )
            << (sal_uInt32)( nLen << 1 );
        for ( i = 0; i < nLen; i++ )
            rSt << rString.GetChar( (sal_uInt16)i );
    }
}

void PPTWriter::ImplCreateTable( uno::Reference< drawing::XShape >& rXShape, EscherSolverContainer& aSolverContainer,
								EscherPropertyContainer& aPropOpt )
{
	try
	{
		static const rtl::OUString	sModel( RTL_CONSTASCII_USTRINGPARAM ( "Model" ) );
		static const rtl::OUString sWidth( RTL_CONSTASCII_USTRINGPARAM ( "Width" ) );
		static const rtl::OUString sHeight( RTL_CONSTASCII_USTRINGPARAM ( "Height" ) );

		uno::Reference< table::XTable > xTable;
		if ( mXPropSet->getPropertyValue( sModel ) >>= xTable )
		{
			uno::Reference< table::XColumnRowRange > xColumnRowRange( xTable, uno::UNO_QUERY_THROW );
			uno::Reference< container::XIndexAccess > xColumns( xColumnRowRange->getColumns(), uno::UNO_QUERY_THROW );
			uno::Reference< container::XIndexAccess > xRows( xColumnRowRange->getRows(), uno::UNO_QUERY_THROW );
			sal_uInt16 nRowCount = static_cast< sal_uInt16 >( xRows->getCount() );
			sal_uInt16 nColumnCount = static_cast< sal_uInt16 >( xColumns->getCount() );

			std::vector< std::pair< sal_Int32, sal_Int32 > > aColumns;
			std::vector< std::pair< sal_Int32, sal_Int32 > > aRows;

			awt::Point aPosition( ImplMapPoint( rXShape->getPosition() ) );
			sal_Int32 nPosition = aPosition.X;
			for ( sal_Int32 x = 0; x < nColumnCount; x++ )
			{
				uno::Reference< beans::XPropertySet > xPropSet( xColumns->getByIndex( x ), uno::UNO_QUERY_THROW );
				awt::Size aS( 0, 0 );
				xPropSet->getPropertyValue( sWidth ) >>= aS.Width;
				awt::Size aM( ImplMapSize( aS ) );
				aColumns.push_back( std::pair< sal_Int32, sal_Int32 >( nPosition, aM.Width ) );
				nPosition += aM.Width;
				if ( x == nColumnCount - 1  && nPosition != maRect.Right() )
					maRect.Right() = nPosition;
			}

			nPosition = aPosition.Y;
			for ( sal_Int32 y = 0; y < nRowCount; y++ )
			{
				uno::Reference< beans::XPropertySet > xPropSet( xRows->getByIndex( y ), uno::UNO_QUERY_THROW );
				awt::Size aS( 0, 0 );
				xPropSet->getPropertyValue( sHeight ) >>= aS.Height;
				awt::Size aM( ImplMapSize( aS ) );
				aRows.push_back( std::pair< sal_Int32, sal_Int32 >( nPosition, aM.Height ) );
				nPosition += aM.Height;
				if ( y == nRowCount - 1 && nPosition != maRect.Bottom())
					maRect.Bottom() = nPosition;
			}
			mpPptEscherEx->OpenContainer( ESCHER_SpgrContainer );
			mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
			mpPptEscherEx->AddAtom( 16, ESCHER_Spgr, 1 );
			*mpStrm		<< (sal_Int32)maRect.Left()	// Bounding box fuer die Gruppierten shapes an die sie attached werden
						<< (sal_Int32)maRect.Top()
						<< (sal_Int32)maRect.Right()
						<< (sal_Int32)maRect.Bottom();

			sal_uInt32 nShapeId = mpPptEscherEx->GenerateShapeId();
			mpPptEscherEx->AddShape( ESCHER_ShpInst_Min, 0x201, nShapeId );		// Flags: Group | Patriarch
			aSolverContainer.AddShape( rXShape, nShapeId );
			EscherPropertyContainer aPropOpt2;

			if ( nRowCount )
			{
				SvMemoryStream aMemStrm;
				aMemStrm.ObjectOwnsMemory( sal_False );
				aMemStrm << nRowCount
						 << nRowCount
						 << (sal_uInt16)4;

				std::vector< std::pair< sal_Int32, sal_Int32 > >::const_iterator aIter( aRows.begin() );
				while( aIter != aRows.end() )
					aMemStrm << (*aIter++).second;

				aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x1000100 );
				aPropOpt2.AddOpt( ESCHER_Prop_tableProperties, 1 );
				aPropOpt2.AddOpt( ESCHER_Prop_tableRowProperties, sal_True, aMemStrm.Tell(), static_cast< sal_uInt8* >( const_cast< void* >( aMemStrm.GetData() ) ), aMemStrm.Tell() );
				aPropOpt.CreateShapeProperties( rXShape );
				aPropOpt.Commit( *mpStrm );
				aPropOpt2.Commit( *mpStrm, 3, ESCHER_UDefProp );
				if ( GetCurrentGroupLevel() > 0 )		
					mpPptEscherEx->AddChildAnchor( maRect );
				else
					mpPptEscherEx->AddClientAnchor( maRect );
				mpPptEscherEx->CloseContainer();


				uno::Reference< table::XCellRange > xCellRange( xTable, uno::UNO_QUERY_THROW );
				for( sal_Int32 nRow = 0; nRow < xRows->getCount(); nRow++ )
				{
					for( sal_Int32 nColumn = 0; nColumn < xColumns->getCount(); nColumn++ )
					{
						uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nRow ), uno::UNO_QUERY_THROW );
						if ( !xCell->isMerged() )
						{
							sal_Int32 nLeft   = aColumns[ nColumn ].first;
							sal_Int32 nTop    = aRows[ nRow ].first;
							sal_Int32 nRight  = GetCellRight( nColumn, maRect,aColumns,xCell );
							sal_Int32 nBottom = GetCellBottom( nRow,  maRect,aRows,xCell );
							
							mbFontIndependentLineSpacing = sal_False;
							mXPropSet = uno::Reference< beans::XPropertySet >( xCell, uno::UNO_QUERY_THROW );
							mXText = uno::Reference< text::XSimpleText >( xCell, uno::UNO_QUERY_THROW );
							mnTextSize = mXText->getString().getLength();

							::com::sun::star::uno::Any aAny;
							if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FontIndependentLineSpacing" ) ) ), sal_True )
								aAny >>= mbFontIndependentLineSpacing;

							EscherPropertyContainer aPropOptSp;
							mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
							ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa02, aSolverContainer );          // Flags: Connector | HasSpt | Child
							aPropOptSp.CreateFillProperties( mXPropSet, sal_True );
							aPropOptSp.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 );
							aPropOptSp.CreateTextProperties( mXPropSet, mnTxId += 0x60, sal_False, sal_True );
							aPropOptSp.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapSquare );

							SvMemoryStream aClientTextBox( 0x200, 0x200 );
							SvMemoryStream  aExtBu( 0x200, 0x200 );

							ImplWriteTextStyleAtom( aClientTextBox, EPP_TEXTTYPE_Other, 0, NULL, aExtBu, &aPropOptSp );

							// need write client data for extend bullet
							if ( aExtBu.Tell() )
							{
								SvMemoryStream* pClientData = new SvMemoryStream( 0x200, 0x200 );
								ImplProgTagContainer( pClientData, &aExtBu );
								*mpStrm << (sal_uInt32)( ( ESCHER_ClientData << 16 ) | 0xf )
									<< (sal_uInt32)pClientData->Tell();

								mpStrm->Write( pClientData->GetData(), pClientData->Tell() );
								delete pClientData, pClientData = NULL;
							}

							aPropOptSp.Commit( *mpStrm );
							mpPptEscherEx->AddAtom( 16, ESCHER_ChildAnchor );
							*mpStrm 	<< nLeft
								<< nTop
								<< nRight
								<< nBottom;

							*mpStrm << (sal_uInt32)( ( ESCHER_ClientTextbox << 16 ) | 0xf )
								<< (sal_uInt32)aClientTextBox.Tell();

							mpStrm->Write( aClientTextBox.GetData(), aClientTextBox.Tell() );
							mpPptEscherEx->CloseContainer();
						}
					}
				}

				static const rtl::OUString sTopBorder( String( RTL_CONSTASCII_USTRINGPARAM( "TopBorder" ) ) );
				static const rtl::OUString sBottomBorder( String( RTL_CONSTASCII_USTRINGPARAM( "BottomBorder" ) ) );
				static const rtl::OUString sLeftBorder( String( RTL_CONSTASCII_USTRINGPARAM( "LeftBorder" ) ) );
				static const rtl::OUString sRightBorder( String( RTL_CONSTASCII_USTRINGPARAM( "RightBorder" ) ) );	
				static const rtl::OUString	sDiagonalTLBR( RTL_CONSTASCII_USTRINGPARAM ( "DiagonalTLBR" ) );
				static const rtl::OUString	sDiagonalBLTR( RTL_CONSTASCII_USTRINGPARAM ( "DiagonalBLTR" ) );

				// creating horz lines
				for( sal_Int32 nLine = 0; nLine < ( xRows->getCount() + 1 ); nLine++ )
				{
					for( sal_Int32 nColumn = 0; nColumn < xColumns->getCount(); nColumn++ )
					{
						CellBorder aCellBorder;
						aCellBorder.mnPos = aColumns[ nColumn ].first;
						aCellBorder.mnLength = aColumns[ nColumn ].second;
						sal_Bool bTop = sal_False;
						//write nLine*nColumn cell's top border
						if ( nLine < xRows->getCount() )
						{	// top border
							uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nLine ), uno::UNO_QUERY_THROW );
							if ( !xCell->isMerged()  )
							{
								uno::Reference< beans::XPropertySet > xPropSet2( xCell, uno::UNO_QUERY_THROW );
								table::BorderLine aBorderLine;
								if ( xPropSet2->getPropertyValue( sTopBorder ) >>= aBorderLine )
									aCellBorder.maCellBorder = aBorderLine;
								sal_Int32 nRight  = GetCellRight( nColumn, maRect,aColumns,xCell );
								bTop = ImplCreateCellBorder( &aCellBorder, aCellBorder.mnPos,
									aRows[ nLine ].first, nRight,  aRows[ nLine ].first );
							}
						}

						//if nLine*nColumn cell's top border is empty, check (nLine-1)*nColumn cell's bottom border
						//and write the last row's bottom border
						if (( nLine && !bTop ) || (nLine == xRows->getCount()))
						{	// bottom border
							sal_Int32 nRow =  nLine;
							
							while( nRow )
							{   //find last no merged cell
								uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nRow - 1 ), uno::UNO_QUERY_THROW );
								if ( !xCell->isMerged()  )
								{
									sal_Int32 nRight  = GetCellRight( nColumn,  maRect,aColumns,xCell );
									sal_Int32 nBottom = GetCellBottom( nRow - 1, maRect,aRows,xCell );
									if ( nBottom == ( aRows[ nLine-1 ].first + aRows[ nLine-1 ].second ) )
									{
										uno::Reference< table::XMergeableCell > xCellOwn( xCellRange->getCellByPosition( nColumn, nRow - 1 ), uno::UNO_QUERY_THROW );
										uno::Reference< beans::XPropertySet > xPropSet2( xCellOwn, uno::UNO_QUERY_THROW );
										table::BorderLine aBorderLine;
										if ( xPropSet2->getPropertyValue( sBottomBorder ) >>= aBorderLine )
											aCellBorder.maCellBorder = aBorderLine;
										ImplCreateCellBorder( &aCellBorder, aCellBorder.mnPos,
											nBottom, nRight, nBottom);
									}
									nRow=0;
								}
								else
									nRow--;
							}
						}
					}
				}

				// creating vertical lines
				for( sal_Int32 nLine = 0; nLine < ( xColumns->getCount() + 1 ); nLine++ )
				{
					for( sal_Int32 nRow = 0; nRow < xRows->getCount(); nRow++ )
					{

						CellBorder aCellBorder;
						aCellBorder.mnPos = aRows[ nRow].first;
						aCellBorder.mnLength = aRows[ nRow].second;
						sal_Bool bLeft = sal_False;
						if ( nLine < xColumns->getCount() )
						{	// left border
							uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nLine, nRow ), uno::UNO_QUERY_THROW );
							if (!xCell->isMerged() )
							{
								uno::Reference< beans::XPropertySet > xCellSet( xCell, uno::UNO_QUERY_THROW );
								table::BorderLine aBorderLine;
								if ( xCellSet->getPropertyValue( sLeftBorder ) >>= aBorderLine )
									aCellBorder.maCellBorder = aBorderLine;
								sal_Int32 nBottom = GetCellBottom( nRow, maRect, aRows,xCell );
								bLeft = ImplCreateCellBorder( &aCellBorder, aColumns[nLine].first, aCellBorder.mnPos,
									aColumns[nLine].first, nBottom );
							}
						}
						if ( ( nLine && !bLeft )||(nLine == xColumns->getCount()))
						{	// right border
							sal_Int32 nColumn = nLine;
							while ( nColumn )
							{
								uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn - 1, nRow ), uno::UNO_QUERY_THROW );
								if (!xCell->isMerged() )
								{
									sal_Int32 nRight  = GetCellRight( nColumn-1, maRect, aColumns,xCell );
									sal_Int32 nBottom = GetCellBottom( nRow,   maRect, aRows, xCell );
									if ( nRight == (aColumns[nLine-1].first + aColumns[nLine-1].second) )
									{
										uno::Reference< table::XMergeableCell > xCellOwn( xCellRange->getCellByPosition( nColumn - 1, nRow ), uno::UNO_QUERY_THROW );
										uno::Reference< beans::XPropertySet > xCellSet( xCellOwn, uno::UNO_QUERY_THROW );
										table::BorderLine aBorderLine;
										if ( xCellSet->getPropertyValue( sRightBorder ) >>= aBorderLine )
											aCellBorder.maCellBorder = aBorderLine;
										ImplCreateCellBorder( &aCellBorder, nRight, aCellBorder.mnPos,
											nRight,  nBottom );
									}
									nColumn = 0;
								}
								else 
									nColumn --;
							}
						}
					}
				}
			}
		}
	}
	catch( uno::Exception& )
	{
	}
	mpPptEscherEx->CloseContainer();
}
