diff options
Diffstat (limited to 'filter/source/msfilter/eschesdo.cxx')
-rw-r--r-- | filter/source/msfilter/eschesdo.cxx | 1241 |
1 files changed, 1241 insertions, 0 deletions
diff --git a/filter/source/msfilter/eschesdo.cxx b/filter/source/msfilter/eschesdo.cxx new file mode 100644 index 000000000000..d5a60fff9aa9 --- /dev/null +++ b/filter/source/msfilter/eschesdo.cxx @@ -0,0 +1,1241 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: eschesdo.cxx,v $ + * $Revision: 1.39 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_filter.hxx" +#include "eschesdo.hxx" +#include <svx/svdobj.hxx> +#include <svx/unoapi.hxx> +#include <svx/svdoashp.hxx> +#include <svx/unoshape.hxx> +#include <vcl/outdev.hxx> +#include <tools/poly.hxx> +#include <vcl/bitmapex.hxx> +#include <vcl/graph.hxx> +#include <tools/debug.hxx> +#include <svx/fmdpage.hxx> +#include <toolkit/unohlp.hxx> +#include <com/sun/star/style/VerticalAlignment.hpp> +#include <com/sun/star/awt/Gradient.hpp> +#include <com/sun/star/drawing/PointSequence.hpp> +#include <com/sun/star/drawing/PointSequenceSequence.hpp> +#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> +#include <com/sun/star/drawing/FlagSequence.hpp> +#include <com/sun/star/drawing/TextAdjust.hpp> +#include <com/sun/star/drawing/LineDash.hpp> +#include <com/sun/star/text/XText.hpp> +#include <com/sun/star/drawing/CircleKind.hpp> +#include <com/sun/star/drawing/FillStyle.hpp> +#include <com/sun/star/task/XStatusIndicator.hpp> +#include <comphelper/extract.hxx> +#include <svtools/fltcall.hxx> +#include <vcl/cvtgrf.hxx> + +using ::rtl::OUString; +using namespace ::vos; +using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::task; +using namespace ::com::sun::star::style; + +#define EES_MAP_FRACTION 1440 // 1440 dpi + +// =================================================================== + +ImplEESdrWriter::ImplEESdrWriter( EscherEx& rEx ) + : + mpEscherEx ( &rEx ), + maMapModeSrc ( MAP_100TH_MM ), + // PowerPoint: 576 dpi, WinWord: 1440 dpi, Excel: 1440 dpi + maMapModeDest( MAP_INCH, Point(), Fraction( 1, EES_MAP_FRACTION ), Fraction( 1, EES_MAP_FRACTION ) ), +// mXStatusIndicator ( rXStatInd ), + mpPicStrm ( NULL ), + mpHostAppData ( NULL ), + mnPagesWritten ( 0 ), + mnShapeMasterTitle ( 0 ), + mnShapeMasterBody ( 0 ), + mbStatusIndicator ( FALSE ), + mbStatus ( FALSE ) +{ +} + + +// ------------------------------------------------------------------- + +Point ImplEESdrWriter::ImplMapPoint( const Point& rPoint ) +{ + return OutputDevice::LogicToLogic( rPoint, maMapModeSrc, maMapModeDest ); +} + + +// ------------------------------------------------------------------- + +Size ImplEESdrWriter::ImplMapSize( const Size& rSize ) +{ + Size aRetSize( OutputDevice::LogicToLogic( rSize, maMapModeSrc, maMapModeDest ) ); + + if ( !aRetSize.Width() ) + aRetSize.Width()++; + if ( !aRetSize.Height() ) + aRetSize.Height()++; + return aRetSize; +} + +// ------------------------------------------------------------------- + +void ImplEESdrWriter::ImplFlipBoundingBox( ImplEESdrObject& rObj, EscherPropertyContainer& rPropOpt ) +{ + INT32 nAngle = rObj.GetAngle(); + Rectangle aRect( rObj.GetRect() ); + + if ( nAngle < 0 ) + nAngle = ( 36000 + nAngle ) % 36000; + else + nAngle = ( 36000 - ( nAngle % 36000 ) ); + + double fVal = (double)nAngle * F_PI18000; + double fCos = cos( fVal ); + double fSin = sin( fVal ); + + double nWidthHalf = (double) aRect.GetWidth() / 2; + double nHeightHalf = (double) aRect.GetHeight() / 2; + + double nXDiff = fCos * nWidthHalf + fSin * (-nHeightHalf); + double nYDiff = - ( fSin * nWidthHalf - fCos * ( -nHeightHalf ) ); + + aRect.Move( (sal_Int32)( -( nWidthHalf - nXDiff ) ), (sal_Int32)( - ( nHeightHalf + nYDiff ) ) ); + + nAngle *= 655; + nAngle += 0x8000; + nAngle &=~0xffff; // nAngle auf volle Gradzahl runden + rPropOpt.AddOpt( ESCHER_Prop_Rotation, nAngle ); + + rObj.SetAngle( nAngle ); + rObj.SetRect( aRect ); +} + +// ----------------------------------------------------------------------- + +#define ADD_SHAPE( nType, nFlags ) \ +{ \ + nShapeType = nType; \ + nShapeID = mpEscherEx->GetShapeID(); \ + rObj.SetShapeId( nShapeID ); \ + mpEscherEx->AddShape( (UINT32)nType, (UINT32)nFlags, nShapeID ); \ + rSolverContainer.AddShape( rObj.GetShapeRef(), nShapeID ); \ +} + +#define SHAPE_TEXT( bFill ) \ +{ \ + mpEscherEx->OpenContainer( ESCHER_SpContainer ); \ + ADD_SHAPE( ESCHER_ShpInst_TextBox, 0xa00 ); \ + if ( bFill ) \ + aPropOpt.CreateFillProperties( rObj.mXPropSet, sal_True ); \ + if( rObj.ImplGetText() ) \ + aPropOpt.CreateTextProperties( rObj.mXPropSet, \ + mpEscherEx->QueryTextID( rObj.GetShapeRef(), \ + rObj.GetShapeId() ) ); \ +} + +//Map from twips to export units, generally twips as well, only excel and word +//export is happening here, so native units are export units, leave as +//placeholder if required in future +void ImplEESdrWriter::MapRect(ImplEESdrObject& /* rObj */ ) +{ +} + +UINT32 ImplEESdrWriter::ImplWriteShape( ImplEESdrObject& rObj, + EscherSolverContainer& rSolverContainer, + ImplEESdrPageType ePageType ) +{ + UINT32 nShapeID = 0; + UINT16 nShapeType = 0; + BOOL bDontWriteText = FALSE; // if a metafile is written as shape replacement, then the text is already part of the metafile + BOOL bAdditionalText = FALSE; + UINT32 nGrpShapeID = 0; + + do { + mpHostAppData = mpEscherEx->StartShape( rObj.GetShapeRef() ); + if ( mpHostAppData && mpHostAppData->DontWriteShape() ) + break; + + // #i51348# get shape name + String aShapeName; + if( const SdrObject* pSdrObj = rObj.GetSdrObject() ) + if( pSdrObj->GetName().Len() > 0 ) + aShapeName = pSdrObj->GetName(); + + Point aTextRefPoint; + + if( rObj.GetType().EqualsAscii( "drawing.Group" )) + { + Reference< XIndexAccess > xXIndexAccess( rObj.GetShapeRef(), UNO_QUERY ); + + if( xXIndexAccess.is() && 0 != xXIndexAccess->getCount() ) + { + nShapeID = mpEscherEx->EnterGroup( aShapeName, &rObj.GetRect() ); + nShapeType = ESCHER_ShpInst_Min; + + for( UINT32 n = 0, nCnt = xXIndexAccess->getCount(); + n < nCnt; ++n ) + { + ImplEESdrObject aObj( *this, *(Reference< XShape >*) + xXIndexAccess->getByIndex( n ).getValue() ); + if( aObj.IsValid() ) + ImplWriteShape( aObj, rSolverContainer, ePageType ); + } + mpEscherEx->LeaveGroup(); + } + break; + } + rObj.SetAngle( rObj.ImplGetInt32PropertyValue( ::rtl::OUString::createFromAscii("RotateAngle") )); + + if( ( rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("IsFontwork") ) && + ::cppu::any2bool( rObj.GetUsrAny() ) ) || + rObj.GetType().EqualsAscii( "drawing.Measure" ) || rObj.GetType().EqualsAscii( "drawing.Caption" ) ) + { +/* + if( rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("BoundRect") ) ) + { + ::com::sun::star::awt::Rectangle aRect( *(::com::sun::star::awt::Rectangle*)rObj.GetUsrAny().getValue() ); + rObj.SetRect( ImplMapPoint( Point( aRect.X, aRect.Y ) ), + ImplMapSize( Size( aRect.Width, aRect.Height ) ) ); + } +*/ + rObj.SetType( String( RTL_CONSTASCII_STRINGPARAM( + "drawing.dontknow" ), + RTL_TEXTENCODING_MS_1252 )); + } + + const ::com::sun::star::awt::Size aSize100thmm( rObj.GetShapeRef()->getSize() ); + const ::com::sun::star::awt::Point aPoint100thmm( rObj.GetShapeRef()->getPosition() ); + Rectangle aRect100thmm( Point( aPoint100thmm.X, aPoint100thmm.Y ), Size( aSize100thmm.Width, aSize100thmm.Height ) ); + if ( !mpPicStrm ) + mpPicStrm = mpEscherEx->QueryPicStream(); + EscherPropertyContainer aPropOpt( (EscherGraphicProvider&)*mpEscherEx, mpPicStrm, aRect100thmm ); + + // #i51348# shape name + if( aShapeName.Len() > 0 ) + aPropOpt.AddOpt( ESCHER_Prop_wzName, aShapeName ); + + if ( rObj.GetType().EqualsAscii( "drawing.Custom" ) ) + { + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + sal_uInt32 nMirrorFlags; + + rtl::OUString sCustomShapeType; + MSO_SPT eShapeType = aPropOpt.GetCustomShapeType( rObj.GetShapeRef(), nMirrorFlags, sCustomShapeType ); + if ( sCustomShapeType.equalsAscii( "col-502ad400" ) || sCustomShapeType.equalsAscii( "col-60da8460" ) ) + { + ADD_SHAPE( ESCHER_ShpInst_PictureFrame, 0xa00 ); + if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "MetaFile" ) ), sal_False ) ) + { + aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 ); // no fill + aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 ); // no linestyle + SdrObject* pObj = GetSdrObjectFromXShape( rObj.GetShapeRef() ); + if ( pObj ) + { + Rectangle aBound = pObj->GetCurrentBoundRect(); + Point aPosition( ImplMapPoint( aBound.TopLeft() ) ); + Size aSize( ImplMapSize( aBound.GetSize() ) ); + rObj.SetRect( Rectangle( aPosition, aSize ) ); + rObj.SetAngle( 0 ); + bDontWriteText = sal_True; + } + } + } + else + { + ADD_SHAPE( + sal::static_int_cast< UINT16 >(eShapeType), + nMirrorFlags | 0xa00 ); + aPropOpt.CreateCustomShapeProperties( eShapeType, rObj.GetShapeRef() ); + aPropOpt.CreateFillProperties( rObj.mXPropSet, sal_True ); + if ( rObj.ImplGetText() ) + { + if ( !aPropOpt.IsFontWork() ) + aPropOpt.CreateTextProperties( rObj.mXPropSet, mpEscherEx->QueryTextID( + rObj.GetShapeRef(), rObj.GetShapeId() ), sal_True, sal_False ); + } + } + } + else if ( rObj.GetType().EqualsAscii( "drawing.Rectangle" )) + { + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + sal_Int32 nRadius = (sal_Int32)rObj.ImplGetInt32PropertyValue( + ::rtl::OUString::createFromAscii("CornerRadius")); + if( nRadius ) + { + nRadius = ImplMapSize( Size( nRadius, 0 )).Width(); + ADD_SHAPE( ESCHER_ShpInst_RoundRectangle, 0xa00 ); // Flags: Connector | HasSpt + INT32 nLenght = rObj.GetRect().GetWidth(); + if ( nLenght > rObj.GetRect().GetHeight() ) + nLenght = rObj.GetRect().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 + { + ADD_SHAPE( ESCHER_ShpInst_Rectangle, 0xa00 ); // Flags: Connector | HasSpt + } + aPropOpt.CreateFillProperties( rObj.mXPropSet, sal_True ); + if( rObj.ImplGetText() ) + aPropOpt.CreateTextProperties( rObj.mXPropSet, + mpEscherEx->QueryTextID( rObj.GetShapeRef(), + rObj.GetShapeId() ), sal_False, sal_False ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.Ellipse" )) + { + CircleKind eCircleKind = CircleKind_FULL; + PolyStyle ePolyKind = PolyStyle(); + if ( rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("CircleKind") ) ) + { + eCircleKind = *( (CircleKind*)rObj.GetUsrAny().getValue() ); + switch ( eCircleKind ) + { + case CircleKind_SECTION : + { + ePolyKind = POLY_PIE; + } + break; + case CircleKind_ARC : + { + ePolyKind = POLY_ARC; + } + break; + + case CircleKind_CUT : + { + ePolyKind = POLY_CHORD; + } + break; + + default: + eCircleKind = CircleKind_FULL; + } + } + if ( eCircleKind == CircleKind_FULL ) + { + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_Ellipse, 0xa00 ); // Flags: Connector | HasSpt + aPropOpt.CreateFillProperties( rObj.mXPropSet, sal_True );; + } + else + { + INT32 nStartAngle, nEndAngle; + if ( !rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("CircleStartAngle") ) ) + break; + nStartAngle = *( (INT32*)rObj.GetUsrAny().getValue() ); + if( !rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("CircleEndAngle") ) ) + break; + nEndAngle = *( (INT32*)rObj.GetUsrAny().getValue() ); + + Point aStart, aEnd, aCenter; + aStart.X() = (INT32)( ( cos( (double)( nStartAngle * + F_PI18000 ) ) * 100.0 ) ); + aStart.Y() = - (INT32)( ( sin( (double)( nStartAngle * + F_PI18000 ) ) * 100.0 ) ); + aEnd.X() = (INT32)( ( cos( (double)( nEndAngle * + F_PI18000 ) ) * 100.0 ) ); + aEnd.Y() = - (INT32)( ( sin( (double)( nEndAngle * + F_PI18000 ) ) * 100.0 ) ); + const Rectangle& rRect = aRect100thmm; + aCenter.X() = rRect.Left() + ( rRect.GetWidth() / 2 ); + aCenter.Y() = rRect.Top() + ( rRect.GetHeight() / 2 ); + aStart.X() += aCenter.X(); + aStart.Y() += aCenter.Y(); + aEnd.X() += aCenter.X(); + aEnd.Y() += aCenter.Y(); + Polygon aPolygon( rRect, aStart, aEnd, ePolyKind ); + if( rObj.GetAngle() ) + { + aPolygon.Rotate( rRect.TopLeft(), (sal_uInt16)( rObj.GetAngle() / 10 ) ); + rObj.SetAngle( 0 ); + } + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_NotPrimitive, 0xa00 ); // Flags: Connector | HasSpt + ::com::sun::star::awt::Rectangle aNewRect; + switch ( ePolyKind ) + { + case POLY_PIE : + case POLY_CHORD : + { + aPropOpt.CreatePolygonProperties( rObj.mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, sal_False, aNewRect, &aPolygon ); + aPropOpt.CreateFillProperties( rObj.mXPropSet, sal_True ); + } + break; + + case POLY_ARC : + { + aPropOpt.CreatePolygonProperties( rObj.mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, sal_False, aNewRect, &aPolygon ); + aPropOpt.CreateLineProperties( rObj.mXPropSet, sal_False ); + } + break; + } + rObj.SetRect( Rectangle( ImplMapPoint( Point( aNewRect.X, aNewRect.Y ) ), + ImplMapSize( Size( aNewRect.Width, aNewRect.Height ) ) ) ); + } + if ( rObj.ImplGetText() ) + aPropOpt.CreateTextProperties( rObj.mXPropSet, + mpEscherEx->QueryTextID( rObj.GetShapeRef(), + rObj.GetShapeId() ), sal_False, sal_False ); + + } + else if ( rObj.GetType().EqualsAscii( "drawing.Control" )) + { + break; + } + else if ( rObj.GetType().EqualsAscii( "drawing.Connector" )) + { + sal_uInt16 nSpType, nSpFlags; + ::com::sun::star::awt::Rectangle aNewRect; + if ( aPropOpt.CreateConnectorProperties( rObj.GetShapeRef(), + rSolverContainer, aNewRect, nSpType, nSpFlags ) == sal_False ) + break; + rObj.SetRect( Rectangle( ImplMapPoint( Point( aNewRect.X, aNewRect.Y ) ), + ImplMapSize( Size( aNewRect.Width, aNewRect.Height ) ) ) ); + + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( nSpType, nSpFlags ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.Measure" )) + { +/* + if ( ImplGetPropertyValue( L"MeasureKind" ) ) + { + mpEscherEx->EnterGroup( &maRect ); + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ImplWriteAny( ANY_FLAGS_LINE, FALSE ); + UINT32 nFlags = 0xa00; // Flags: Connector | HasSpt + if ( maRect.Top() > maRect.Bottom() ) + nFlags |= 0x80; // Flags: VertMirror + if ( maRect.Left() > maRect.Right() ) + nFlags |= 0x40; // Flags: HorzMirror + + ADD_SHAPE( ESCHER_ShpInst_Line, nFlags ); + aPropOpt.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex ); + aPropOpt.CreateLineProperties( rObj.mXPropSet, sal_False ); + mpEscherEx->EndCount( ESCHER_OPT, 3 ); + maRect.Justify(); + mpEscherEx->AddClientAnchor( maRect ); + mpEscherEx->CloseContainer(); // ESCHER_SpContainer + + if ( ImplGetPropertyValue( L"MeasureTextHorizontalPosition" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureTextVerticalPosition" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureLineDistance" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureHelpLineOverhang" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureHelpLineDistance" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureHelpLine1Length" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureHelpLine2Length" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureBelowReferenceEdge" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureTextRotate90" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureTextUpsideDown" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureOverhang" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureUnit" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureScale" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureShowUnit" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureFormatString" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureTextAutoAngle" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureTextAutoAngleView" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureTextIsFixedAngle" ) ) + { + } + if ( ImplGetPropertyValue( L"MeasureTextFixedAngle" ) ) + { + } + mpEscherEx->LeaveGroup(); + } +*/ + break; + } + else if ( rObj.GetType().EqualsAscii( "drawing.Line" )) + { + ::com::sun::star::awt::Rectangle aNewRect; + aPropOpt.CreatePolygonProperties( rObj.mXPropSet, ESCHER_CREATEPOLYGON_LINE, sal_False, aNewRect, NULL ); + MapRect(rObj); + //i27942: Poly/Lines/Bezier do not support text. + + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + UINT32 nFlags = 0xa00; // Flags: Connector | HasSpt + if( aNewRect.Height < 0 ) + nFlags |= 0x80; // Flags: VertMirror + if( aNewRect.Width < 0 ) + nFlags |= 0x40; // Flags: HorzMirror + + ADD_SHAPE( ESCHER_ShpInst_Line, nFlags ); + aPropOpt.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex ); + aPropOpt.CreateLineProperties( rObj.mXPropSet, sal_False ); + rObj.SetAngle( 0 ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.PolyPolygon" )) + { + if( rObj.ImplHasText() ) + { + nGrpShapeID = ImplEnterAdditionalTextGroup( rObj.GetShapeRef(), &rObj.GetRect() ); + bAdditionalText = TRUE; + } + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_NotPrimitive, 0xa00 ); // Flags: Connector | HasSpt + ::com::sun::star::awt::Rectangle aNewRect; + aPropOpt.CreatePolygonProperties( rObj.mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, sal_False, aNewRect, NULL ); + MapRect(rObj); + aPropOpt.CreateFillProperties( rObj.mXPropSet, sal_True ); + rObj.SetAngle( 0 ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.PolyLine" )) + { + //i27942: Poly/Lines/Bezier do not support text. + + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_NotPrimitive, 0xa00 ); // Flags: Connector | HasSpt + ::com::sun::star::awt::Rectangle aNewRect; + aPropOpt.CreatePolygonProperties( rObj.mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, sal_False, aNewRect, NULL ); + MapRect(rObj); + aPropOpt.CreateLineProperties( rObj.mXPropSet, sal_False ); + rObj.SetAngle( 0 ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.OpenBezier" ) ) + { + //i27942: Poly/Lines/Bezier do not support text. + + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_NotPrimitive, 0xa00 ); // Flags: Connector | HasSpt + ::com::sun::star::awt::Rectangle aNewRect; + aPropOpt.CreatePolygonProperties( rObj.mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, sal_True, aNewRect, NULL ); + MapRect(rObj); + aPropOpt.CreateLineProperties( rObj.mXPropSet, sal_False ); + rObj.SetAngle( 0 ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.ClosedBezier" ) ) + { + if ( rObj.ImplHasText() ) + { + nGrpShapeID = ImplEnterAdditionalTextGroup( rObj.GetShapeRef(), &rObj.GetRect() ); + bAdditionalText = TRUE; + } + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_NotPrimitive, 0xa00 ); // Flags: Connector | HasSpt + ::com::sun::star::awt::Rectangle aNewRect; + aPropOpt.CreatePolygonProperties( rObj.mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, sal_True, aNewRect, NULL ); + MapRect(rObj); + aPropOpt.CreateFillProperties( rObj.mXPropSet, sal_True ); + rObj.SetAngle( 0 ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.GraphicObject" )) + { + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + + // ein GraphicObject kann auch ein ClickMe Element sein + if( rObj.IsEmptyPresObj() && ( ePageType == NORMAL ) ) + { + ADD_SHAPE( ESCHER_ShpInst_Rectangle, 0x220 ); // Flags: HaveAnchor | HaveMaster + UINT32 nTxtBxId = mpEscherEx->QueryTextID( rObj.GetShapeRef(), + rObj.GetShapeId() ); + aPropOpt.AddOpt( ESCHER_Prop_lTxid, nTxtBxId ); + aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 ); + aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody ); + } + else + { + if( rObj.ImplGetText() ) + { + /* 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). + */ + ADD_SHAPE( ESCHER_ShpInst_Rectangle, 0xa00 ); // Flags: Connector | HasSpt + if ( aPropOpt.CreateGraphicProperties( rObj.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 ( rObj.ImplGetText() ) + aPropOpt.CreateTextProperties( rObj.mXPropSet, + mpEscherEx->QueryTextID( rObj.GetShapeRef(), + rObj.GetShapeId() ), sal_False, sal_False ); + } + } + else + { + ADD_SHAPE( ESCHER_ShpInst_PictureFrame, 0xa00 ); + if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "GraphicURL" ) ), sal_False, sal_True ) ) + aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 ); + } + } + } + else if ( rObj.GetType().EqualsAscii( "drawing.Text" )) + { + SHAPE_TEXT( TRUE ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.Page" )) + { + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_Rectangle, 0xa00 ); + aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x40004 ); + aPropOpt.AddOpt( ESCHER_Prop_fFillOK, 0x100001 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110011 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90008 ); + aPropOpt.AddOpt( ESCHER_Prop_fshadowObscured, 0x10001 ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.Frame" )) + { + break; + } + else if ( rObj.GetType().EqualsAscii( "drawing.OLE2" )) + { + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + if( rObj.IsEmptyPresObj() && ( ePageType == NORMAL ) ) + { + ADD_SHAPE( ESCHER_ShpInst_Rectangle, 0x220 ); // Flags: HaveAnchor | HaveMaster + UINT32 nTxtBxId = mpEscherEx->QueryTextID( rObj.GetShapeRef(), + rObj.GetShapeId() ); + aPropOpt.AddOpt( ESCHER_Prop_lTxid, nTxtBxId ); + aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 ); + aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody ); + } + else + { + //2do: could be made an option in HostAppData whether OLE object should be written or not + BOOL bAppOLE = TRUE; + ADD_SHAPE( ESCHER_ShpInst_PictureFrame, + 0xa00 | (bAppOLE ? SHAPEFLAG_OLESHAPE : 0) ); + if ( aPropOpt.CreateOLEGraphicProperties( rObj.GetShapeRef() ) ) + { + if ( bAppOLE ) + { // snooped from Xcl hex dump, nobody knows the trouble I have seen + aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x00080008 ); + aPropOpt.AddOpt( ESCHER_Prop_pictureId, 0x00000001 ); + aPropOpt.AddOpt( ESCHER_Prop_fillColor, 0x08000041 ); + aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0x08000041 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x00110010 ); + aPropOpt.AddOpt( ESCHER_Prop_lineColor, 0x08000040 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash,0x00080008 ); +// aPropOpt.AddOpt( ESCHER_Prop_fshadowObscured,0x00020000 ); + aPropOpt.AddOpt( ESCHER_Prop_fPrint, 0x00080000 ); + } + aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 ); + } + } + } + else if( '3' == rObj.GetType().GetChar(8 ) && + 'D' == rObj.GetType().GetChar( 9 ) ) // drawing.3D + { + // SceneObject, CubeObject, SphereObject, LatheObject, ExtrudeObject, PolygonObject + if ( !rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("Bitmap") ) ) + break; + + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_PictureFrame, 0xa00 ); + + if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Bitmap" ) ), sal_False ) ) + aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 ); + } + else if ( rObj.GetType().EqualsAscii( "drawing.dontknow" )) + { + rObj.SetAngle( 0 ); + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + ADD_SHAPE( ESCHER_ShpInst_PictureFrame, 0xa00 ); + if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "MetaFile" ) ), sal_False ) ) + aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 ); + } + else + { + break; + } + aPropOpt.CreateShadowProperties( rObj.mXPropSet ); + + if( USHRT_MAX != mpEscherEx->GetHellLayerId() && + rObj.ImplGetPropertyValue( ::rtl::OUString::createFromAscii("LayerID") ) && + (*((UINT16*)rObj.GetUsrAny().getValue()) ) == mpEscherEx->GetHellLayerId() ) + { + aPropOpt.AddOpt( ESCHER_Prop_fPrint, 0x200020 ); + } + + { + Rectangle aRect( rObj.GetRect() ); + aRect.Justify(); + rObj.SetRect( aRect ); + } + + if( rObj.GetAngle() ) + ImplFlipBoundingBox( rObj, aPropOpt ); + + mpEscherEx->Commit( aPropOpt, rObj.GetRect() ); + if( mpEscherEx->GetGroupLevel() > 1 ) + mpEscherEx->AddChildAnchor( rObj.GetRect() ); + + if ( mpHostAppData ) + { //! with AdditionalText the App has to control whether these are written or not + mpHostAppData->WriteClientAnchor( *mpEscherEx, rObj.GetRect() ); + mpHostAppData->WriteClientData( *mpEscherEx ); + if ( !bDontWriteText ) + mpHostAppData->WriteClientTextbox( *mpEscherEx ); + } + mpEscherEx->CloseContainer(); // ESCHER_SpContainer + + if( bAdditionalText ) + { + mpEscherEx->EndShape( nShapeType, nShapeID ); + ImplWriteAdditionalText( rObj, aTextRefPoint ); + } + + } while ( 0 ); + + if ( bAdditionalText ) + mpEscherEx->EndShape( ESCHER_ShpInst_Min, nGrpShapeID ); + else + mpEscherEx->EndShape( nShapeType, nShapeID ); + return nShapeID; +} + +void ImplEESdrWriter::ImplWriteAdditionalText( ImplEESdrObject& rObj, + const Point& rTextRefPoint ) +{ + UINT32 nShapeID = 0; + UINT16 nShapeType = 0; + do + { + mpHostAppData = mpEscherEx->StartShape( rObj.GetShapeRef() ); + if ( mpHostAppData && mpHostAppData->DontWriteShape() ) + break; + + const ::com::sun::star::awt::Size aSize100thmm( rObj.GetShapeRef()->getSize() ); + const ::com::sun::star::awt::Point aPoint100thmm( rObj.GetShapeRef()->getPosition() ); + Rectangle aRect100thmm( Point( aPoint100thmm.X, aPoint100thmm.Y ), Size( aSize100thmm.Width, aSize100thmm.Height ) ); + if ( !mpPicStrm ) + mpPicStrm = mpEscherEx->QueryPicStream(); + EscherPropertyContainer aPropOpt( (EscherGraphicProvider&)*mpEscherEx, mpPicStrm, aRect100thmm ); + rObj.SetAngle( rObj.ImplGetInt32PropertyValue( ::rtl::OUString::createFromAscii("RotateAngle"))); + INT32 nAngle = rObj.GetAngle(); + if( rObj.GetType().EqualsAscii( "drawing.Line" )) + { +//2do: this does not work right + double fDist = hypot( rObj.GetRect().GetWidth(), + rObj.GetRect().GetHeight() ); + rObj.SetRect( Rectangle( rTextRefPoint, + Point( (sal_Int32)( rTextRefPoint.X() + fDist ), rTextRefPoint.Y() - 1 ) ) ); + + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + mpEscherEx->AddShape( ESCHER_ShpInst_TextBox, 0xa00 ); + if ( rObj.ImplGetText() ) + aPropOpt.CreateTextProperties( rObj.mXPropSet, + mpEscherEx->QueryTextID( rObj.GetShapeRef(), + rObj.GetShapeId() ) ); + + aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 ); + aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x60006 ); // Size Shape To Fit Text + if ( nAngle < 0 ) + nAngle = ( 36000 + nAngle ) % 36000; + if ( nAngle ) + ImplFlipBoundingBox( rObj, aPropOpt ); + } + else + { + mpEscherEx->OpenContainer( ESCHER_SpContainer ); + nShapeID = mpEscherEx->GetShapeID(); + mpEscherEx->AddShape( nShapeType = ESCHER_ShpInst_TextBox, 0xa00, nShapeID ); + if ( rObj.ImplGetText() ) + aPropOpt.CreateTextProperties( rObj.mXPropSet, + mpEscherEx->QueryTextID( rObj.GetShapeRef(), + rObj.GetShapeId() ) ); + aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 ); + aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 ); + + if( nAngle < 0 ) + nAngle = ( 36000 + nAngle ) % 36000; + else + nAngle = ( 36000 - ( nAngle % 36000 ) ); + + nAngle *= 655; + nAngle += 0x8000; + nAngle &=~0xffff; // nAngle auf volle Gradzahl runden + aPropOpt.AddOpt( ESCHER_Prop_Rotation, nAngle ); + mpEscherEx->SetGroupSnapRect( mpEscherEx->GetGroupLevel(), + rObj.GetRect() ); + mpEscherEx->SetGroupLogicRect( mpEscherEx->GetGroupLevel(), + rObj.GetRect() ); + } + rObj.SetAngle( nAngle ); + mpEscherEx->Commit( aPropOpt, rObj.GetRect() ); + + // write the childanchor + mpEscherEx->AddChildAnchor( rObj.GetRect() ); + +#if defined EES_WRITE_EPP + // ClientAnchor + mpEscherEx->AddClientAnchor( maRect ); + // ClientTextbox + mpEscherEx->OpenContainer( ESCHER_ClientTextbox ); + mpEscherEx->AddAtom( 4, EPP_TextHeaderAtom ); + *mpStrm << (UINT32)EPP_TEXTTYPE_Other; // Text in a Shape + ImplWriteTextStyleAtom(); + mpEscherEx->CloseContainer(); // ESCHER_ClientTextBox +#else // !EES_WRITE_EPP + if ( mpHostAppData ) + { //! the App has to control whether these are written or not + mpHostAppData->WriteClientAnchor( *mpEscherEx, rObj.GetRect() ); + mpHostAppData->WriteClientData( *mpEscherEx ); + mpHostAppData->WriteClientTextbox( *mpEscherEx ); + } +#endif // EES_WRITE_EPP + mpEscherEx->CloseContainer(); // ESCHER_SpContainer + } while ( 0 ); + mpEscherEx->LeaveGroup(); + mpEscherEx->EndShape( nShapeType, nShapeID ); +} + + +// ------------------------------------------------------------------- + +UINT32 ImplEESdrWriter::ImplEnterAdditionalTextGroup( const Reference< XShape >& rShape, + const Rectangle* pBoundRect ) +{ + mpHostAppData = mpEscherEx->EnterAdditionalTextGroup(); + UINT32 nGrpId = mpEscherEx->EnterGroup( pBoundRect ); + mpHostAppData = mpEscherEx->StartShape( rShape ); + return nGrpId; +} + + +// ------------------------------------------------------------------- + +BOOL ImplEESdrWriter::ImplInitPageValues() +{ + mnIndices = 0; + mnOutlinerCount = 0; // die gliederungsobjekte muessen dem layout entsprechen, + mnEffectCount = 0; + mbIsTitlePossible = TRUE; // bei mehr als einem title geht powerpoint in die knie + + return TRUE; +} + + +// ------------------------------------------------------------------- + +void ImplEESdrWriter::ImplWritePage( + EscherSolverContainer& rSolverContainer, + ImplEESdrPageType ePageType, BOOL /* bBackGround */ ) +{ + ImplInitPageValues(); + + UINT32 nLastPer = 0, nShapes = mXShapes->getCount(); + for( UINT32 n = 0; n < nShapes; ++n ) + { + UINT32 nPer = ( 5 * n ) / nShapes; + if( nPer != nLastPer ) + { + nLastPer = nPer; + UINT32 nValue = mnPagesWritten * 5 + nPer; + if( nValue > mnStatMaxValue ) + nValue = mnStatMaxValue; + if( mbStatusIndicator ) + mXStatusIndicator->setValue( nValue ); + } + + ImplEESdrObject aObj( *this, *(Reference< XShape >*) + mXShapes->getByIndex( n ).getValue() ); + if( aObj.IsValid() ) + { + ImplWriteShape( aObj, rSolverContainer, ePageType ); + } + } + mnPagesWritten++; +} + +// =================================================================== + +ImplEscherExSdr::ImplEscherExSdr( EscherEx& rEx ) + : + ImplEESdrWriter( rEx ), + mpSdrPage( NULL ), + mpSolverContainer( NULL ) +{ +} + + +// ------------------------------------------------------------------- + +ImplEscherExSdr::~ImplEscherExSdr() +{ + DBG_ASSERT( !mpSolverContainer, "ImplEscherExSdr::~ImplEscherExSdr: unwritten SolverContainer" ); + delete mpSolverContainer; +} + + +// ------------------------------------------------------------------- + +SvxDrawPage* ImplEscherExSdr::ImplInitPage( const SdrPage& rPage ) +{ + do + { + SvxDrawPage* pSvxDrawPage; + if ( mpSdrPage != &rPage || !mXDrawPage.is() ) + { + // eventually write SolverContainer of current page, deletes the Solver + ImplFlushSolverContainer(); + + mpSdrPage = NULL; + // why not declare a const parameter if the object will not be modified? +// mXDrawPage = pSvxDrawPage = new SvxDrawPage( (SdrPage*) &rPage ); + mXDrawPage = pSvxDrawPage = new SvxFmDrawPage( (SdrPage*) &rPage ); + mXShapes = Reference< XShapes >::query( mXDrawPage ); + if ( !mXShapes.is() ) + break; + if ( !ImplInitPageValues() ) // ImplEESdrWriter + break; + mpSdrPage = &rPage; + + mpSolverContainer = new EscherSolverContainer; + } + else + pSvxDrawPage = SvxDrawPage::getImplementation(mXDrawPage); + + return pSvxDrawPage; + } while ( 0 ); + + return NULL; +} + + +// ------------------------------------------------------------------- + +void ImplEscherExSdr::ImplExitPage() +{ + // close all groups before the solver container is written + while( mpEscherEx->GetGroupLevel() ) + mpEscherEx->LeaveGroup(); + + ImplFlushSolverContainer(); + mpSdrPage = NULL; // reset page for next init +} + + +// ------------------------------------------------------------------- + +void ImplEscherExSdr::ImplFlushSolverContainer() +{ + if ( mpSolverContainer ) + { + mpSolverContainer->WriteSolver( mpEscherEx->GetStream() ); + delete mpSolverContainer; + mpSolverContainer = NULL; + } +} + + +// ------------------------------------------------------------------- + +void ImplEscherExSdr::ImplWriteCurrentPage() +{ + DBG_ASSERT( mpSolverContainer, "ImplEscherExSdr::ImplWriteCurrentPage: no SolverContainer" ); + ImplWritePage( *mpSolverContainer, NORMAL ); + ImplExitPage(); +} + + +// ------------------------------------------------------------------- + +UINT32 ImplEscherExSdr::ImplWriteTheShape( ImplEESdrObject& rObj ) +{ + DBG_ASSERT( mpSolverContainer, "ImplEscherExSdr::ImplWriteShape: no SolverContainer" ); + return ImplWriteShape( rObj, *mpSolverContainer, NORMAL ); +} + + +// =================================================================== + +void EscherEx::AddSdrPage( const SdrPage& rPage ) +{ + if ( mpImplEscherExSdr->ImplInitPage( rPage ) ) + mpImplEscherExSdr->ImplWriteCurrentPage(); +} + + +// ------------------------------------------------------------------- + +UINT32 EscherEx::AddSdrObject( const SdrObject& rObj ) +{ + ImplEESdrObject aObj( *mpImplEscherExSdr, rObj ); + if( aObj.IsValid() ) + return mpImplEscherExSdr->ImplWriteTheShape( aObj ); + return 0; +} + + +// ------------------------------------------------------------------- + +void EscherEx::EndSdrObjectPage() +{ + mpImplEscherExSdr->ImplExitPage(); +} + +// ------------------------------------------------------------------- + +EscherExHostAppData* EscherEx::StartShape( const Reference< XShape >& /* rShape */ ) +{ + return NULL; +} + +// ------------------------------------------------------------------- + +void EscherEx::EndShape( UINT16 /* nShapeType */, UINT32 /* nShapeID */ ) +{ +} + +// ------------------------------------------------------------------- + +SvStream* EscherEx::QueryPicStream() +{ + return NULL; +} + +// ------------------------------------------------------------------- + +UINT32 EscherEx::QueryTextID( const Reference< XShape >&, UINT32 ) +{ + return 0; +} + +// ------------------------------------------------------------------- +// add an dummy rectangle shape into the escher stream +UINT32 EscherEx::AddDummyShape() +{ + OpenContainer( ESCHER_SpContainer ); + UINT32 nShapeID = GetShapeID(); + AddShape( ESCHER_ShpInst_Rectangle, 0xa00, nShapeID ); +//?? aSolverContainer.AddShape( mXShape, nShapeID ); + CloseContainer(); + + return nShapeID; +} + +// ------------------------------------------------------------------- + +// static +const SdrObject* EscherEx::GetSdrObject( const Reference< XShape >& rShape ) +{ + const SdrObject* pRet = 0; + const SvxShape* pSvxShape = SvxShape::getImplementation( rShape ); + DBG_ASSERT( pSvxShape, "EscherEx::GetSdrObject: no SvxShape" ); + if( pSvxShape ) + { + pRet = pSvxShape->GetSdrObject(); + DBG_ASSERT( pRet, "EscherEx::GetSdrObject: no SdrObj" ); + } + return pRet; +} + + +// ------------------------------------------------------------------- + +ImplEESdrObject::ImplEESdrObject( ImplEscherExSdr& rEx, + const SdrObject& rObj ) : + mnShapeId( 0 ), + mnTextSize( 0 ), + mnAngle( 0 ), + mbValid( FALSE ), + mbPresObj( FALSE ), + mbEmptyPresObj( FALSE ) +{ + SdrPage* pPage = rObj.GetPage(); + DBG_ASSERT( pPage, "ImplEESdrObject::ImplEESdrObject: no SdrPage" ); + if( pPage ) + { + SvxDrawPage* pSvxDrawPage = rEx.ImplInitPage( *pPage ); + if( pSvxDrawPage ) + { + // why not declare a const parameter if the object will + // not be modified? + mXShape = uno::Reference< drawing::XShape >::query( ((SdrObject*)&rObj)->getUnoShape() );; + Init( rEx ); + } + } +} + +ImplEESdrObject::ImplEESdrObject( ImplEESdrWriter& rEx, + const Reference< XShape >& rShape ) : + mXShape( rShape ), + mnShapeId( 0 ), + mnTextSize( 0 ), + mnAngle( 0 ), + mbValid( FALSE ), + mbPresObj( FALSE ), + mbEmptyPresObj( FALSE ) +{ + Init( rEx ); +} + + +ImplEESdrObject::~ImplEESdrObject() +{ +} + +void ImplEESdrObject::Init( ImplEESdrWriter& rEx ) +{ + mXPropSet = Reference< XPropertySet >::query( mXShape ); + if( mXPropSet.is() ) + { + static const sal_Char aPrefix[] = "com.sun.star."; + static const xub_StrLen nPrefix = sizeof(aPrefix)-1; + SetRect( rEx.ImplMapPoint( Point( mXShape->getPosition().X, mXShape->getPosition().Y ) ), + rEx.ImplMapSize( Size( mXShape->getSize().Width, mXShape->getSize().Height ) ) ); + mType = String( mXShape->getShapeType() ); + mType.Erase( 0, nPrefix ); // strip "com.sun.star." + xub_StrLen nPos = mType.SearchAscii( "Shape" ); + mType.Erase( nPos, 5 ); + + static const OUString sPresStr(rtl::OUString::createFromAscii("IsPresentationObject")); + static const OUString sEmptyPresStr(rtl::OUString::createFromAscii("IsEmptyPresentationObject")); + + if( ImplGetPropertyValue( sPresStr ) ) + mbPresObj = ::cppu::any2bool( mAny ); + + if( mbPresObj && ImplGetPropertyValue( sEmptyPresStr ) ) + mbEmptyPresObj = ::cppu::any2bool( mAny ); + + mbValid = TRUE; + } +} + +//BOOL ImplEESdrObject::ImplGetPropertyValue( const OUString& rString ) +BOOL ImplEESdrObject::ImplGetPropertyValue( const sal_Unicode* rString ) +{ + BOOL bRetValue = FALSE; + if( mbValid ) + { + try + { + mAny = mXPropSet->getPropertyValue( rString ); + if( mAny.hasValue() ) + bRetValue = TRUE; + } + catch( ::com::sun::star::uno::Exception& ) + { + bRetValue = FALSE; + } + } + return bRetValue; +} + +#ifdef USED +BOOL ImplEESdrObject::ImplGetPropertyValue( const Reference< XPropertySet >& rXPropSet, + const OUString& rString ) +{ + BOOL bRetValue = FALSE; + if( mbValid ) + { + try + { + mAny = rXPropSet->getPropertyValue( rString ); + if( 0 != mAny.get() ) + bRetValue = TRUE; + } + catch( ::com::sun::star::uno::Exception& ) + { + bRetValue = FALSE; + } + } + return bRetValue; +} +#endif + +void ImplEESdrObject::SetRect( const Point& rPos, const Size& rSz ) +{ + maRect = Rectangle( rPos, rSz ); +} + +const SdrObject* ImplEESdrObject::GetSdrObject() const +{ + return EscherEx::GetSdrObject( mXShape ); +} + +// laedt und konvertiert text aus shape, ergebnis ist mnTextSize gespeichert +UINT32 ImplEESdrObject::ImplGetText() +{ + Reference< XText > xXText( mXShape, UNO_QUERY ); + mnTextSize = 0; + if( xXText.is() ) + mnTextSize = xXText->getString().getLength(); + return mnTextSize; +} + +BOOL ImplEESdrObject::ImplHasText() const +{ + Reference< XText > xXText( mXShape, UNO_QUERY ); + return xXText.is() && xXText->getString().getLength(); +} + |