diff options
Diffstat (limited to 'svx/source/msfilter/eschesdo.cxx')
-rw-r--r-- | svx/source/msfilter/eschesdo.cxx | 1244 |
1 files changed, 0 insertions, 1244 deletions
diff --git a/svx/source/msfilter/eschesdo.cxx b/svx/source/msfilter/eschesdo.cxx deleted file mode 100644 index 86a1bd131b..0000000000 --- a/svx/source/msfilter/eschesdo.cxx +++ /dev/null @@ -1,1244 +0,0 @@ -/************************************************************************* - * - * 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_svx.hxx" -#include "eschesdo.hxx" -#include <svx/svdobj.hxx> -#include <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> - -#ifndef _TOOLKIT_UNOHLP_HXX //autogen wg. VCLXBitmap -#include <toolkit/unohlp.hxx> -#endif -#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(); -} - |