1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
23*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx"
24*b1cdbd2cSJim Jagielski #include "unointerfacetouniqueidentifiermapper.hxx"
25*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp>
26*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNamed.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumerationAccess.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/CircleKind.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/ConnectorType.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XControlShape.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEventsSupplier.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/HomogenMatrix3.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/media/ZoomLevel.hpp>
35*b1cdbd2cSJim Jagielski #include "anim.hxx"
36*b1cdbd2cSJim Jagielski #include <xmloff/shapeexport.hxx>
37*b1cdbd2cSJim Jagielski #include "sdpropls.hxx"
38*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
39*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
40*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
41*b1cdbd2cSJim Jagielski #include <xmloff/xmlexp.hxx>
42*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
43*b1cdbd2cSJim Jagielski #include "XMLImageMapExport.hxx"
44*b1cdbd2cSJim Jagielski #include "xexptran.hxx"
45*b1cdbd2cSJim Jagielski #include <tools/gen.hxx>		// FRound
46*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
47*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
48*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
49*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
50*b1cdbd2cSJim Jagielski #include <basegfx/tuple/b2dtuple.hxx>
51*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrixtools.hxx>
52*b1cdbd2cSJim Jagielski #include <basegfx/point/b2dpoint.hxx>
53*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygon.hxx>
54*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygontools.hxx>
55*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski using ::rtl::OUString;
58*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
61*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
65*b1cdbd2cSJim Jagielski 
ImpExportNewTrans(const uno::Reference<beans::XPropertySet> & xPropSet,sal_Int32 nFeatures,awt::Point * pRefPoint)66*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportNewTrans(const uno::Reference< beans::XPropertySet >& xPropSet,
67*b1cdbd2cSJim Jagielski 	sal_Int32 nFeatures, awt::Point* pRefPoint)
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski 	// get matrix
70*b1cdbd2cSJim Jagielski 	::basegfx::B2DHomMatrix aMatrix;
71*b1cdbd2cSJim Jagielski 	ImpExportNewTrans_GetB2DHomMatrix(aMatrix, xPropSet);
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski 	// decompose and correct abour pRefPoint
74*b1cdbd2cSJim Jagielski 	::basegfx::B2DTuple aTRScale;
75*b1cdbd2cSJim Jagielski 	double fTRShear(0.0);
76*b1cdbd2cSJim Jagielski 	double fTRRotate(0.0);
77*b1cdbd2cSJim Jagielski 	::basegfx::B2DTuple aTRTranslate;
78*b1cdbd2cSJim Jagielski 	ImpExportNewTrans_DecomposeAndRefPoint(aMatrix, aTRScale, fTRShear, fTRRotate, aTRTranslate, pRefPoint);
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski 	// use features and write
81*b1cdbd2cSJim Jagielski 	ImpExportNewTrans_FeaturesAndWrite(aTRScale, fTRShear, fTRRotate, aTRTranslate, nFeatures);
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski 
ImpExportNewTrans_GetB2DHomMatrix(::basegfx::B2DHomMatrix & rMatrix,const uno::Reference<beans::XPropertySet> & xPropSet)84*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportNewTrans_GetB2DHomMatrix(::basegfx::B2DHomMatrix& rMatrix,
85*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet >& xPropSet)
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski     // --> OD 2004-08-09 #i28749# - Get <TransformationInHoriL2R>, if it exist
88*b1cdbd2cSJim Jagielski     // and if the document is exported into the OpenOffice.org file format.
89*b1cdbd2cSJim Jagielski     // This property only exists at service com::sun::star::text::Shape - the
90*b1cdbd2cSJim Jagielski     // Writer UNO service for shapes.
91*b1cdbd2cSJim Jagielski     // This code is needed, because the positioning attributes in the
92*b1cdbd2cSJim Jagielski     // OpenOffice.org file format are given in horizontal left-to-right layout
93*b1cdbd2cSJim Jagielski     // regardless the layout direction the shape is in. In the OASIS Open Office
94*b1cdbd2cSJim Jagielski     // file format the positioning attributes are correctly given in the layout
95*b1cdbd2cSJim Jagielski     // direction the shape is in. Thus, this code provides the conversion from
96*b1cdbd2cSJim Jagielski     // the OASIS Open Office file format to the OpenOffice.org file format.
97*b1cdbd2cSJim Jagielski     uno::Any aAny;
98*b1cdbd2cSJim Jagielski     if ( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 &&
99*b1cdbd2cSJim Jagielski          xPropSet->getPropertySetInfo()->hasPropertyByName(
100*b1cdbd2cSJim Jagielski             OUString(RTL_CONSTASCII_USTRINGPARAM("TransformationInHoriL2R"))) )
101*b1cdbd2cSJim Jagielski     {
102*b1cdbd2cSJim Jagielski         aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("TransformationInHoriL2R")));
103*b1cdbd2cSJim Jagielski     }
104*b1cdbd2cSJim Jagielski     else
105*b1cdbd2cSJim Jagielski     {
106*b1cdbd2cSJim Jagielski         aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation")));
107*b1cdbd2cSJim Jagielski     }
108*b1cdbd2cSJim Jagielski     // <--
109*b1cdbd2cSJim Jagielski 	drawing::HomogenMatrix3 aMatrix;
110*b1cdbd2cSJim Jagielski 	aAny >>= aMatrix;
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 	rMatrix.set(0, 0, aMatrix.Line1.Column1);
113*b1cdbd2cSJim Jagielski 	rMatrix.set(0, 1, aMatrix.Line1.Column2);
114*b1cdbd2cSJim Jagielski 	rMatrix.set(0, 2, aMatrix.Line1.Column3);
115*b1cdbd2cSJim Jagielski 	rMatrix.set(1, 0, aMatrix.Line2.Column1);
116*b1cdbd2cSJim Jagielski 	rMatrix.set(1, 1, aMatrix.Line2.Column2);
117*b1cdbd2cSJim Jagielski 	rMatrix.set(1, 2, aMatrix.Line2.Column3);
118*b1cdbd2cSJim Jagielski 	rMatrix.set(2, 0, aMatrix.Line3.Column1);
119*b1cdbd2cSJim Jagielski 	rMatrix.set(2, 1, aMatrix.Line3.Column2);
120*b1cdbd2cSJim Jagielski 	rMatrix.set(2, 2, aMatrix.Line3.Column3);
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
ImpExportNewTrans_DecomposeAndRefPoint(const::basegfx::B2DHomMatrix & rMatrix,::basegfx::B2DTuple & rTRScale,double & fTRShear,double & fTRRotate,::basegfx::B2DTuple & rTRTranslate,com::sun::star::awt::Point * pRefPoint)123*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportNewTrans_DecomposeAndRefPoint(const ::basegfx::B2DHomMatrix& rMatrix, ::basegfx::B2DTuple& rTRScale,
124*b1cdbd2cSJim Jagielski 	double& fTRShear, double& fTRRotate, ::basegfx::B2DTuple& rTRTranslate, com::sun::star::awt::Point* pRefPoint)
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski 	// decompose matrix
127*b1cdbd2cSJim Jagielski 	rMatrix.decompose(rTRScale, rTRTranslate, fTRRotate, fTRShear);
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 	// correct translation about pRefPoint
130*b1cdbd2cSJim Jagielski 	if(pRefPoint)
131*b1cdbd2cSJim Jagielski 	{
132*b1cdbd2cSJim Jagielski 		rTRTranslate -= ::basegfx::B2DTuple(pRefPoint->X, pRefPoint->Y);
133*b1cdbd2cSJim Jagielski 	}
134*b1cdbd2cSJim Jagielski }
135*b1cdbd2cSJim Jagielski 
ImpExportNewTrans_FeaturesAndWrite(::basegfx::B2DTuple & rTRScale,double fTRShear,double fTRRotate,::basegfx::B2DTuple & rTRTranslate,const sal_Int32 nFeatures)136*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportNewTrans_FeaturesAndWrite(::basegfx::B2DTuple& rTRScale, double fTRShear,
137*b1cdbd2cSJim Jagielski 	double fTRRotate, ::basegfx::B2DTuple& rTRTranslate, const sal_Int32 nFeatures)
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski 	// allways write Size (rTRScale) since this statement carries the union
140*b1cdbd2cSJim Jagielski 	// of the object
141*b1cdbd2cSJim Jagielski 	OUString aStr;
142*b1cdbd2cSJim Jagielski 	OUStringBuffer sStringBuffer;
143*b1cdbd2cSJim Jagielski 	::basegfx::B2DTuple aTRScale(rTRScale);
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	// svg: width
146*b1cdbd2cSJim Jagielski 	if(!(nFeatures & SEF_EXPORT_WIDTH))
147*b1cdbd2cSJim Jagielski 	{
148*b1cdbd2cSJim Jagielski 		aTRScale.setX(1.0);
149*b1cdbd2cSJim Jagielski 	}
150*b1cdbd2cSJim Jagielski 	else
151*b1cdbd2cSJim Jagielski 	{
152*b1cdbd2cSJim Jagielski 		if( aTRScale.getX() > 0.0 )
153*b1cdbd2cSJim Jagielski 			aTRScale.setX(aTRScale.getX() - 1.0);
154*b1cdbd2cSJim Jagielski 		else if( aTRScale.getX() < 0.0 )
155*b1cdbd2cSJim Jagielski 			aTRScale.setX(aTRScale.getX() + 1.0);
156*b1cdbd2cSJim Jagielski 	}
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 	mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, FRound(aTRScale.getX()));
159*b1cdbd2cSJim Jagielski 	aStr = sStringBuffer.makeStringAndClear();
160*b1cdbd2cSJim Jagielski 	mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_WIDTH, aStr);
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 	// svg: height
163*b1cdbd2cSJim Jagielski 	if(!(nFeatures & SEF_EXPORT_HEIGHT))
164*b1cdbd2cSJim Jagielski 	{
165*b1cdbd2cSJim Jagielski 		aTRScale.setY(1.0);
166*b1cdbd2cSJim Jagielski 	}
167*b1cdbd2cSJim Jagielski 	else
168*b1cdbd2cSJim Jagielski 	{
169*b1cdbd2cSJim Jagielski 		if( aTRScale.getY() > 0.0 )
170*b1cdbd2cSJim Jagielski 			aTRScale.setY(aTRScale.getY() - 1.0);
171*b1cdbd2cSJim Jagielski 		else if( aTRScale.getY() < 0.0 )
172*b1cdbd2cSJim Jagielski 			aTRScale.setY(aTRScale.getY() + 1.0);
173*b1cdbd2cSJim Jagielski 	}
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, FRound(aTRScale.getY()));
176*b1cdbd2cSJim Jagielski 	aStr = sStringBuffer.makeStringAndClear();
177*b1cdbd2cSJim Jagielski 	mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_HEIGHT, aStr);
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 	// decide if transformation is neccessary
180*b1cdbd2cSJim Jagielski 	sal_Bool bTransformationIsNeccessary(fTRShear != 0.0 || fTRRotate != 0.0);
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 	if(bTransformationIsNeccessary)
183*b1cdbd2cSJim Jagielski 	{
184*b1cdbd2cSJim Jagielski 		// write transformation, but WITHOUT scale which is exported as size above
185*b1cdbd2cSJim Jagielski 		SdXMLImExTransform2D aTransform;
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 		aTransform.AddSkewX(atan(fTRShear));
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski         // #i78696#
190*b1cdbd2cSJim Jagielski         // fTRRotate is mathematically correct, but due to the error
191*b1cdbd2cSJim Jagielski         // we export/import it mirrored. Since the API implementation is fixed and
192*b1cdbd2cSJim Jagielski         // uses the correctly oriented angle, it is necessary for compatibility to
193*b1cdbd2cSJim Jagielski         // mirror the angle here to stay at the old behaviour. There is a follow-up
194*b1cdbd2cSJim Jagielski         // task (#i78698#) to fix this in the next ODF FileFormat version
195*b1cdbd2cSJim Jagielski 		aTransform.AddRotate(-fTRRotate);
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski         aTransform.AddTranslate(rTRTranslate);
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 		// does transformation need to be exported?
200*b1cdbd2cSJim Jagielski 		if(aTransform.NeedsAction())
201*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_TRANSFORM, aTransform.GetExportString(mrExport.GetMM100UnitConverter()));
202*b1cdbd2cSJim Jagielski 	}
203*b1cdbd2cSJim Jagielski 	else
204*b1cdbd2cSJim Jagielski 	{
205*b1cdbd2cSJim Jagielski 		// no shear, no rotate; just add object position to export and we are done
206*b1cdbd2cSJim Jagielski 		if(nFeatures & SEF_EXPORT_X)
207*b1cdbd2cSJim Jagielski 		{
208*b1cdbd2cSJim Jagielski 			// svg: x
209*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, FRound(rTRTranslate.getX()));
210*b1cdbd2cSJim Jagielski 			aStr = sStringBuffer.makeStringAndClear();
211*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X, aStr);
212*b1cdbd2cSJim Jagielski 		}
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 		if(nFeatures & SEF_EXPORT_Y)
215*b1cdbd2cSJim Jagielski 		{
216*b1cdbd2cSJim Jagielski 			// svg: y
217*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, FRound(rTRTranslate.getY()));
218*b1cdbd2cSJim Jagielski 			aStr = sStringBuffer.makeStringAndClear();
219*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y, aStr);
220*b1cdbd2cSJim Jagielski 		}
221*b1cdbd2cSJim Jagielski 	}
222*b1cdbd2cSJim Jagielski }
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
225*b1cdbd2cSJim Jagielski 
ImpExportPresentationAttributes(const uno::Reference<beans::XPropertySet> & xPropSet,const rtl::OUString & rClass)226*b1cdbd2cSJim Jagielski sal_Bool XMLShapeExport::ImpExportPresentationAttributes( const uno::Reference< beans::XPropertySet >& xPropSet, const rtl::OUString& rClass )
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski 	sal_Bool bIsEmpty = sal_False;
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski 	OUStringBuffer sStringBuffer;
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski 	// write presentation class entry
233*b1cdbd2cSJim Jagielski 	mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_CLASS, rClass);
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski 	if( xPropSet.is() )
236*b1cdbd2cSJim Jagielski 	{
237*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 		sal_Bool bTemp = false;
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 		// is empty pes shape?
242*b1cdbd2cSJim Jagielski 		if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject"))))
243*b1cdbd2cSJim Jagielski 		{
244*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject"))) >>= bIsEmpty;
245*b1cdbd2cSJim Jagielski 			if( bIsEmpty )
246*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_PLACEHOLDER, XML_TRUE);
247*b1cdbd2cSJim Jagielski 		}
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 		// is user-transformed?
250*b1cdbd2cSJim Jagielski 		if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent"))))
251*b1cdbd2cSJim Jagielski 		{
252*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent"))) >>= bTemp;
253*b1cdbd2cSJim Jagielski 			if(!bTemp)
254*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_USER_TRANSFORMED, XML_TRUE);
255*b1cdbd2cSJim Jagielski 		}
256*b1cdbd2cSJim Jagielski 	}
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 	return bIsEmpty;
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
262*b1cdbd2cSJim Jagielski 
ImpExportText(const uno::Reference<drawing::XShape> & xShape)263*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportText( const uno::Reference< drawing::XShape >& xShape )
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski 	uno::Reference< text::XText > xText( xShape, uno::UNO_QUERY );
266*b1cdbd2cSJim Jagielski 	if( xText.is() )
267*b1cdbd2cSJim Jagielski 	{
268*b1cdbd2cSJim Jagielski 		uno::Reference< container::XEnumerationAccess > xEnumAccess( xShape, uno::UNO_QUERY );
269*b1cdbd2cSJim Jagielski 		if( xEnumAccess.is() && xEnumAccess->hasElements() )
270*b1cdbd2cSJim Jagielski 			mrExport.GetTextParagraphExport()->exportText( xText );
271*b1cdbd2cSJim Jagielski 	}
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
275*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/ClickAction.hpp>
276*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/AnimationSpeed.hpp>
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski namespace {
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_CLICKACTION       = 0x00000001;
281*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_BOOKMARK          = 0x00000002;
282*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_EFFECT            = 0x00000004;
283*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_PLAYFULL          = 0x00000008;
284*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_VERB              = 0x00000010;
285*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_SOUNDURL          = 0x00000020;
286*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_SPEED             = 0x00000040;
287*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_CLICKEVENTTYPE    = 0x00000080;
288*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_MACRO             = 0x00000100;
289*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_LIBRARY           = 0x00000200;
290*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_ACTIONEVENTTYPE   = 0x00000400;
291*b1cdbd2cSJim Jagielski #ifdef ISSUE66550_HLINK_FOR_SHAPES
292*b1cdbd2cSJim Jagielski const sal_Int32 FOUND_URL               = 0x00000800;
293*b1cdbd2cSJim Jagielski #endif
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski } // namespace
296*b1cdbd2cSJim Jagielski 
ImpExportEvents(const uno::Reference<drawing::XShape> & xShape)297*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportEvents( const uno::Reference< drawing::XShape >& xShape )
298*b1cdbd2cSJim Jagielski {
299*b1cdbd2cSJim Jagielski     uno::Reference< document::XEventsSupplier > xEventsSupplier( xShape, uno::UNO_QUERY );
300*b1cdbd2cSJim Jagielski     if( !xEventsSupplier.is() )
301*b1cdbd2cSJim Jagielski         return;
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski     uno::Reference< container::XNameAccess > xEvents( xEventsSupplier->getEvents(), uno::UNO_QUERY );
304*b1cdbd2cSJim Jagielski     DBG_ASSERT( xEvents.is(), "XEventsSupplier::getEvents() returned NULL" );
305*b1cdbd2cSJim Jagielski     if( !xEvents.is() )
306*b1cdbd2cSJim Jagielski         return;
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski     sal_Int32 nFound = 0;
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski     // extract properties from "OnClick" event --------------------------------
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski     OUString aClickEventType;
313*b1cdbd2cSJim Jagielski     presentation::ClickAction eClickAction = presentation::ClickAction_NONE;
314*b1cdbd2cSJim Jagielski     presentation::AnimationEffect eEffect = presentation::AnimationEffect_NONE;
315*b1cdbd2cSJim Jagielski     presentation::AnimationSpeed eSpeed = presentation::AnimationSpeed_SLOW;
316*b1cdbd2cSJim Jagielski     OUString aStrSoundURL;
317*b1cdbd2cSJim Jagielski     sal_Bool bPlayFull = false;
318*b1cdbd2cSJim Jagielski     sal_Int32 nVerb = 0;
319*b1cdbd2cSJim Jagielski     OUString aStrMacro;
320*b1cdbd2cSJim Jagielski     OUString aStrLibrary;
321*b1cdbd2cSJim Jagielski     OUString aStrBookmark;
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski     uno::Sequence< beans::PropertyValue > aClickProperties;
324*b1cdbd2cSJim Jagielski     if( xEvents->hasByName( msOnClick ) && (xEvents->getByName( msOnClick ) >>= aClickProperties) )
325*b1cdbd2cSJim Jagielski     {
326*b1cdbd2cSJim Jagielski         const beans::PropertyValue* pProperty = aClickProperties.getConstArray();
327*b1cdbd2cSJim Jagielski         const beans::PropertyValue* pPropertyEnd = pProperty + aClickProperties.getLength();
328*b1cdbd2cSJim Jagielski         for( ; pProperty != pPropertyEnd; ++pProperty )
329*b1cdbd2cSJim Jagielski         {
330*b1cdbd2cSJim Jagielski             if( ( ( nFound & FOUND_CLICKEVENTTYPE ) == 0 ) && pProperty->Name == msEventType )
331*b1cdbd2cSJim Jagielski             {
332*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= aClickEventType )
333*b1cdbd2cSJim Jagielski                     nFound |= FOUND_CLICKEVENTTYPE;
334*b1cdbd2cSJim Jagielski             }
335*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_CLICKACTION ) == 0 ) && pProperty->Name == msClickAction )
336*b1cdbd2cSJim Jagielski             {
337*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= eClickAction )
338*b1cdbd2cSJim Jagielski                     nFound |= FOUND_CLICKACTION;
339*b1cdbd2cSJim Jagielski             }
340*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_MACRO ) == 0 ) && ( pProperty->Name == msMacroName || pProperty->Name == msScript ) )
341*b1cdbd2cSJim Jagielski             {
342*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= aStrMacro )
343*b1cdbd2cSJim Jagielski                     nFound |= FOUND_MACRO;
344*b1cdbd2cSJim Jagielski             }
345*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_LIBRARY ) == 0 ) && pProperty->Name == msLibrary )
346*b1cdbd2cSJim Jagielski             {
347*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= aStrLibrary )
348*b1cdbd2cSJim Jagielski                     nFound |= FOUND_LIBRARY;
349*b1cdbd2cSJim Jagielski             }
350*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_EFFECT ) == 0 ) && pProperty->Name == msEffect )
351*b1cdbd2cSJim Jagielski             {
352*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= eEffect )
353*b1cdbd2cSJim Jagielski                     nFound |= FOUND_EFFECT;
354*b1cdbd2cSJim Jagielski             }
355*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_BOOKMARK ) == 0 ) && pProperty->Name == msBookmark )
356*b1cdbd2cSJim Jagielski             {
357*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= aStrBookmark )
358*b1cdbd2cSJim Jagielski                     nFound |= FOUND_BOOKMARK;
359*b1cdbd2cSJim Jagielski             }
360*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_SPEED ) == 0 ) && pProperty->Name == msSpeed )
361*b1cdbd2cSJim Jagielski             {
362*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= eSpeed )
363*b1cdbd2cSJim Jagielski                     nFound |= FOUND_SPEED;
364*b1cdbd2cSJim Jagielski             }
365*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_SOUNDURL ) == 0 ) && pProperty->Name == msSoundURL )
366*b1cdbd2cSJim Jagielski             {
367*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= aStrSoundURL )
368*b1cdbd2cSJim Jagielski                     nFound |= FOUND_SOUNDURL;
369*b1cdbd2cSJim Jagielski             }
370*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_PLAYFULL ) == 0 ) && pProperty->Name == msPlayFull )
371*b1cdbd2cSJim Jagielski             {
372*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= bPlayFull )
373*b1cdbd2cSJim Jagielski                     nFound |= FOUND_PLAYFULL;
374*b1cdbd2cSJim Jagielski             }
375*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_VERB ) == 0 ) && pProperty->Name == msVerb )
376*b1cdbd2cSJim Jagielski             {
377*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= nVerb )
378*b1cdbd2cSJim Jagielski                     nFound |= FOUND_VERB;
379*b1cdbd2cSJim Jagielski             }
380*b1cdbd2cSJim Jagielski         }
381*b1cdbd2cSJim Jagielski     }
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski #ifdef ISSUE66550_HLINK_FOR_SHAPES
384*b1cdbd2cSJim Jagielski     // extract properties from "OnAction" event -------------------------------
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     OUString aActionEventType;
387*b1cdbd2cSJim Jagielski     OUString aHyperURL;
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski     uno::Sequence< beans::PropertyValue > aActionProperties;
390*b1cdbd2cSJim Jagielski     if( xEvents->hasByName( msOnAction ) && (xEvents->getByName( msOnAction ) >>= aActionProperties) )
391*b1cdbd2cSJim Jagielski     {
392*b1cdbd2cSJim Jagielski         const beans::PropertyValue* pProperty = aActionProperties.getConstArray();
393*b1cdbd2cSJim Jagielski         const beans::PropertyValue* pPropertyEnd = pProperty + aActionProperties.getLength();
394*b1cdbd2cSJim Jagielski         for( ; pProperty != pPropertyEnd; ++pProperty )
395*b1cdbd2cSJim Jagielski         {
396*b1cdbd2cSJim Jagielski             if( ( ( nFound & FOUND_ACTIONEVENTTYPE ) == 0 ) && pProperty->Name == msEventType )
397*b1cdbd2cSJim Jagielski             {
398*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= aActionEventType )
399*b1cdbd2cSJim Jagielski                     nFound |= FOUND_ACTIONEVENTTYPE;
400*b1cdbd2cSJim Jagielski             }
401*b1cdbd2cSJim Jagielski             else if( ( ( nFound & FOUND_URL ) == 0 ) && ( pProperty->Name == msURL  ) )
402*b1cdbd2cSJim Jagielski             {
403*b1cdbd2cSJim Jagielski                 if( pProperty->Value >>= aHyperURL )
404*b1cdbd2cSJim Jagielski                     nFound |= FOUND_URL;
405*b1cdbd2cSJim Jagielski             }
406*b1cdbd2cSJim Jagielski         }
407*b1cdbd2cSJim Jagielski     }
408*b1cdbd2cSJim Jagielski #endif
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski     // create the XML elements
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski     if( aClickEventType == msPresentation )
413*b1cdbd2cSJim Jagielski     {
414*b1cdbd2cSJim Jagielski         if( ((nFound & FOUND_CLICKACTION) == 0) || (eClickAction == presentation::ClickAction_NONE) )
415*b1cdbd2cSJim Jagielski             return;
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski         SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_OFFICE, XML_EVENT_LISTENERS, sal_True, sal_True);
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski         enum XMLTokenEnum eStrAction;
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski         switch( eClickAction )
422*b1cdbd2cSJim Jagielski         {
423*b1cdbd2cSJim Jagielski             case presentation::ClickAction_PREVPAGE:        eStrAction = XML_PREVIOUS_PAGE; break;
424*b1cdbd2cSJim Jagielski             case presentation::ClickAction_NEXTPAGE:        eStrAction = XML_NEXT_PAGE; break;
425*b1cdbd2cSJim Jagielski             case presentation::ClickAction_FIRSTPAGE:       eStrAction = XML_FIRST_PAGE; break;
426*b1cdbd2cSJim Jagielski             case presentation::ClickAction_LASTPAGE:        eStrAction = XML_LAST_PAGE; break;
427*b1cdbd2cSJim Jagielski             case presentation::ClickAction_INVISIBLE:       eStrAction = XML_HIDE; break;
428*b1cdbd2cSJim Jagielski             case presentation::ClickAction_STOPPRESENTATION:eStrAction = XML_STOP; break;
429*b1cdbd2cSJim Jagielski             case presentation::ClickAction_PROGRAM:         eStrAction = XML_EXECUTE; break;
430*b1cdbd2cSJim Jagielski             case presentation::ClickAction_BOOKMARK:        eStrAction = XML_SHOW; break;
431*b1cdbd2cSJim Jagielski             case presentation::ClickAction_DOCUMENT:        eStrAction = XML_SHOW; break;
432*b1cdbd2cSJim Jagielski             case presentation::ClickAction_MACRO:           eStrAction = XML_EXECUTE_MACRO; break;
433*b1cdbd2cSJim Jagielski             case presentation::ClickAction_VERB:            eStrAction = XML_VERB; break;
434*b1cdbd2cSJim Jagielski             case presentation::ClickAction_VANISH:          eStrAction = XML_FADE_OUT; break;
435*b1cdbd2cSJim Jagielski             case presentation::ClickAction_SOUND:           eStrAction = XML_SOUND; break;
436*b1cdbd2cSJim Jagielski             default:
437*b1cdbd2cSJim Jagielski                 DBG_ERROR( "unknown presentation::ClickAction found!" );
438*b1cdbd2cSJim Jagielski                 eStrAction = XML_UNKNOWN;
439*b1cdbd2cSJim Jagielski         }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski         OUString aEventQName(
442*b1cdbd2cSJim Jagielski             mrExport.GetNamespaceMap().GetQNameByKey(
443*b1cdbd2cSJim Jagielski                     XML_NAMESPACE_DOM, OUString( RTL_CONSTASCII_USTRINGPARAM( "click" ) ) ) );
444*b1cdbd2cSJim Jagielski         mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_EVENT_NAME, aEventQName );
445*b1cdbd2cSJim Jagielski         mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_ACTION, eStrAction );
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski         if( eClickAction == presentation::ClickAction_VANISH )
448*b1cdbd2cSJim Jagielski         {
449*b1cdbd2cSJim Jagielski             if( nFound & FOUND_EFFECT )
450*b1cdbd2cSJim Jagielski             {
451*b1cdbd2cSJim Jagielski                 XMLEffect eKind;
452*b1cdbd2cSJim Jagielski                 XMLEffectDirection eDirection;
453*b1cdbd2cSJim Jagielski                 sal_Int16 nStartScale;
454*b1cdbd2cSJim Jagielski                 sal_Bool bIn;
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski                 SdXMLImplSetEffect( eEffect, eKind, eDirection, nStartScale, bIn );
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski                 if( eKind != EK_none )
459*b1cdbd2cSJim Jagielski                 {
460*b1cdbd2cSJim Jagielski                     SvXMLUnitConverter::convertEnum( msBuffer, eKind, aXML_AnimationEffect_EnumMap );
461*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_EFFECT, msBuffer.makeStringAndClear() );
462*b1cdbd2cSJim Jagielski                 }
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski                 if( eDirection != ED_none )
465*b1cdbd2cSJim Jagielski                 {
466*b1cdbd2cSJim Jagielski                     SvXMLUnitConverter::convertEnum( msBuffer, eDirection, aXML_AnimationDirection_EnumMap );
467*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_DIRECTION, msBuffer.makeStringAndClear() );
468*b1cdbd2cSJim Jagielski                 }
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski                 if( nStartScale != -1 )
471*b1cdbd2cSJim Jagielski                 {
472*b1cdbd2cSJim Jagielski                     SvXMLUnitConverter::convertPercent( msBuffer, nStartScale );
473*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_START_SCALE, msBuffer.makeStringAndClear() );
474*b1cdbd2cSJim Jagielski                 }
475*b1cdbd2cSJim Jagielski             }
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski             if( nFound & FOUND_SPEED && eEffect != presentation::AnimationEffect_NONE )
478*b1cdbd2cSJim Jagielski             {
479*b1cdbd2cSJim Jagielski                  if( eSpeed != presentation::AnimationSpeed_MEDIUM )
480*b1cdbd2cSJim Jagielski                     {
481*b1cdbd2cSJim Jagielski                     SvXMLUnitConverter::convertEnum( msBuffer, eSpeed, aXML_AnimationSpeed_EnumMap );
482*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_SPEED, msBuffer.makeStringAndClear() );
483*b1cdbd2cSJim Jagielski                 }
484*b1cdbd2cSJim Jagielski             }
485*b1cdbd2cSJim Jagielski         }
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski         if( eClickAction == presentation::ClickAction_PROGRAM ||
488*b1cdbd2cSJim Jagielski             eClickAction == presentation::ClickAction_BOOKMARK ||
489*b1cdbd2cSJim Jagielski             eClickAction == presentation::ClickAction_DOCUMENT )
490*b1cdbd2cSJim Jagielski         {
491*b1cdbd2cSJim Jagielski             if( eClickAction == presentation::ClickAction_BOOKMARK )
492*b1cdbd2cSJim Jagielski                 msBuffer.append( sal_Unicode('#') );
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski             msBuffer.append( aStrBookmark );
495*b1cdbd2cSJim Jagielski             mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(msBuffer.makeStringAndClear()) );
496*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
497*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
498*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONREQUEST );
499*b1cdbd2cSJim Jagielski         }
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski         if( ( nFound & FOUND_VERB ) && eClickAction == presentation::ClickAction_VERB )
502*b1cdbd2cSJim Jagielski         {
503*b1cdbd2cSJim Jagielski             msBuffer.append( nVerb );
504*b1cdbd2cSJim Jagielski             mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_VERB, msBuffer.makeStringAndClear());
505*b1cdbd2cSJim Jagielski         }
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski         SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_PRESENTATION, XML_EVENT_LISTENER, sal_True, sal_True);
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski         if( eClickAction == presentation::ClickAction_VANISH || eClickAction == presentation::ClickAction_SOUND )
510*b1cdbd2cSJim Jagielski         {
511*b1cdbd2cSJim Jagielski             if( ( nFound & FOUND_SOUNDURL ) && aStrSoundURL.getLength() != 0 )
512*b1cdbd2cSJim Jagielski             {
513*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(aStrSoundURL) );
514*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
515*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_NEW );
516*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONREQUEST );
517*b1cdbd2cSJim Jagielski                 if( nFound & FOUND_PLAYFULL && bPlayFull )
518*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_PLAY_FULL, XML_TRUE );
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski                 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_PRESENTATION, XML_SOUND, sal_True, sal_True );
521*b1cdbd2cSJim Jagielski             }
522*b1cdbd2cSJim Jagielski        }
523*b1cdbd2cSJim Jagielski     }
524*b1cdbd2cSJim Jagielski     else if( aClickEventType == msStarBasic )
525*b1cdbd2cSJim Jagielski     {
526*b1cdbd2cSJim Jagielski         if( nFound & FOUND_MACRO )
527*b1cdbd2cSJim Jagielski         {
528*b1cdbd2cSJim Jagielski             SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_OFFICE, XML_EVENT_LISTENERS, sal_True, sal_True);
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_LANGUAGE,
531*b1cdbd2cSJim Jagielski                         mrExport.GetNamespaceMap().GetQNameByKey(
532*b1cdbd2cSJim Jagielski                             XML_NAMESPACE_OOO,
533*b1cdbd2cSJim Jagielski                             OUString( RTL_CONSTASCII_USTRINGPARAM(
534*b1cdbd2cSJim Jagielski                                             "starbasic" ) ) ) );
535*b1cdbd2cSJim Jagielski             OUString aEventQName(
536*b1cdbd2cSJim Jagielski                 mrExport.GetNamespaceMap().GetQNameByKey(
537*b1cdbd2cSJim Jagielski                         XML_NAMESPACE_DOM, OUString( RTL_CONSTASCII_USTRINGPARAM( "click" ) ) ) );
538*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_EVENT_NAME, aEventQName );
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski             if( nFound & FOUND_LIBRARY )
541*b1cdbd2cSJim Jagielski             {
542*b1cdbd2cSJim Jagielski                 OUString sLocation( GetXMLToken(
543*b1cdbd2cSJim Jagielski                     (aStrLibrary.equalsIgnoreAsciiCaseAscii("StarOffice") ||
544*b1cdbd2cSJim Jagielski                      aStrLibrary.equalsIgnoreAsciiCaseAscii("application") ) ? XML_APPLICATION
545*b1cdbd2cSJim Jagielski                                                                        : XML_DOCUMENT ) );
546*b1cdbd2cSJim Jagielski                 OUStringBuffer sTmp( sLocation.getLength() + aStrMacro.getLength() + 1 );
547*b1cdbd2cSJim Jagielski                 sTmp = sLocation;
548*b1cdbd2cSJim Jagielski                 sTmp.append( sal_Unicode( ':' ) );
549*b1cdbd2cSJim Jagielski                 sTmp.append( aStrMacro );
550*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute(XML_NAMESPACE_SCRIPT, XML_MACRO_NAME,
551*b1cdbd2cSJim Jagielski                                      sTmp.makeStringAndClear());
552*b1cdbd2cSJim Jagielski             }
553*b1cdbd2cSJim Jagielski             else
554*b1cdbd2cSJim Jagielski             {
555*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_MACRO_NAME, aStrMacro );
556*b1cdbd2cSJim Jagielski             }
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski             SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_SCRIPT, XML_EVENT_LISTENER, sal_True, sal_True);
559*b1cdbd2cSJim Jagielski         }
560*b1cdbd2cSJim Jagielski     }
561*b1cdbd2cSJim Jagielski #ifdef ISSUE66550_HLINK_FOR_SHAPES
562*b1cdbd2cSJim Jagielski     else if( aClickEventType == msScript || aActionEventType == msAction )
563*b1cdbd2cSJim Jagielski     {
564*b1cdbd2cSJim Jagielski         if( nFound & ( FOUND_MACRO | FOUND_URL ) )
565*b1cdbd2cSJim Jagielski #else
566*b1cdbd2cSJim Jagielski     else if( aClickEventType == msScript )
567*b1cdbd2cSJim Jagielski     {
568*b1cdbd2cSJim Jagielski         if( nFound & FOUND_MACRO )
569*b1cdbd2cSJim Jagielski #endif
570*b1cdbd2cSJim Jagielski         {
571*b1cdbd2cSJim Jagielski             SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_OFFICE, XML_EVENT_LISTENERS, sal_True, sal_True);
572*b1cdbd2cSJim Jagielski             if ( nFound & FOUND_MACRO )
573*b1cdbd2cSJim Jagielski             {
574*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_LANGUAGE, mrExport.GetNamespaceMap().GetQNameByKey(
575*b1cdbd2cSJim Jagielski                          XML_NAMESPACE_OOO, GetXMLToken(XML_SCRIPT) ) );
576*b1cdbd2cSJim Jagielski                 OUString aEventQName(
577*b1cdbd2cSJim Jagielski                     mrExport.GetNamespaceMap().GetQNameByKey(
578*b1cdbd2cSJim Jagielski                             XML_NAMESPACE_DOM, OUString( RTL_CONSTASCII_USTRINGPARAM( "click" ) ) ) );
579*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_EVENT_NAME, aEventQName );
580*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aStrMacro );
581*b1cdbd2cSJim Jagielski 
582*b1cdbd2cSJim Jagielski                 SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_SCRIPT, XML_EVENT_LISTENER, sal_True, sal_True);
583*b1cdbd2cSJim Jagielski             }
584*b1cdbd2cSJim Jagielski #ifdef ISSUE66550_HLINK_FOR_SHAPES
585*b1cdbd2cSJim Jagielski             if ( nFound & FOUND_URL )
586*b1cdbd2cSJim Jagielski             {
587*b1cdbd2cSJim Jagielski                 OUString aEventQName(
588*b1cdbd2cSJim Jagielski                     mrExport.GetNamespaceMap().GetQNameByKey(
589*b1cdbd2cSJim Jagielski                             XML_NAMESPACE_DOM, OUString( RTL_CONSTASCII_USTRINGPARAM( "action" ) ) ) );
590*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_EVENT_NAME, aEventQName );
591*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aHyperURL );
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski                 SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_PRESENTATION, XML_EVENT_LISTENER, sal_True, sal_True);
594*b1cdbd2cSJim Jagielski             }
595*b1cdbd2cSJim Jagielski #endif
596*b1cdbd2cSJim Jagielski         }
597*b1cdbd2cSJim Jagielski     }
598*b1cdbd2cSJim Jagielski }
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski /** #i68101# export shape Title and Description */
603*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportDescription( const uno::Reference< drawing::XShape >& xShape )
604*b1cdbd2cSJim Jagielski {
605*b1cdbd2cSJim Jagielski 	try
606*b1cdbd2cSJim Jagielski 	{
607*b1cdbd2cSJim Jagielski 		OUString aTitle;
608*b1cdbd2cSJim Jagielski 		OUString aDescription;
609*b1cdbd2cSJim Jagielski 
610*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY_THROW );
611*b1cdbd2cSJim Jagielski 		xProps->getPropertyValue( OUString::createFromAscii( "Title" ) ) >>= aTitle;
612*b1cdbd2cSJim Jagielski 		xProps->getPropertyValue( OUString::createFromAscii( "Description" ) ) >>= aDescription;
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski 		if(aTitle.getLength())
615*b1cdbd2cSJim Jagielski 		{
616*b1cdbd2cSJim Jagielski 			SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_SVG, XML_TITLE, sal_True, sal_False);
617*b1cdbd2cSJim Jagielski 			mrExport.Characters( aTitle );
618*b1cdbd2cSJim Jagielski 		}
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 		if(aDescription.getLength())
621*b1cdbd2cSJim Jagielski 		{
622*b1cdbd2cSJim Jagielski 			SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_SVG, XML_DESC, sal_True, sal_False );
623*b1cdbd2cSJim Jagielski 			mrExport.Characters( aDescription );
624*b1cdbd2cSJim Jagielski 		}
625*b1cdbd2cSJim Jagielski 	}
626*b1cdbd2cSJim Jagielski 	catch( uno::Exception& )
627*b1cdbd2cSJim Jagielski 	{
628*b1cdbd2cSJim Jagielski 		DBG_ERROR( "could not export Title and/or Description for shape!" );
629*b1cdbd2cSJim Jagielski 	}
630*b1cdbd2cSJim Jagielski }
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportGroupShape( const uno::Reference< drawing::XShape >& xShape, XmlShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint)
635*b1cdbd2cSJim Jagielski {
636*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes > xShapes(xShape, uno::UNO_QUERY);
637*b1cdbd2cSJim Jagielski 	if(xShapes.is() && xShapes->getCount())
638*b1cdbd2cSJim Jagielski 	{
639*b1cdbd2cSJim Jagielski 		// write group shape
640*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
641*b1cdbd2cSJim Jagielski 		SvXMLElementExport aPGR(mrExport, XML_NAMESPACE_DRAW, XML_G, bCreateNewline, sal_True);
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 		ImpExportDescription( xShape ); // #i68101#
644*b1cdbd2cSJim Jagielski 		ImpExportEvents( xShape );
645*b1cdbd2cSJim Jagielski 		ImpExportGluePoints( xShape );
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 		// #89764# if export of position is supressed for group shape,
648*b1cdbd2cSJim Jagielski 		// positions of contained objects should be written relative to
649*b1cdbd2cSJim Jagielski 		// the upper left edge of the group.
650*b1cdbd2cSJim Jagielski 		awt::Point aUpperLeft;
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski 		if(!(nFeatures & SEF_EXPORT_POSITION))
653*b1cdbd2cSJim Jagielski 		{
654*b1cdbd2cSJim Jagielski 			nFeatures |= SEF_EXPORT_POSITION;
655*b1cdbd2cSJim Jagielski 			aUpperLeft = xShape->getPosition();
656*b1cdbd2cSJim Jagielski 			pRefPoint = &aUpperLeft;
657*b1cdbd2cSJim Jagielski 		}
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski 		// write members
660*b1cdbd2cSJim Jagielski 		exportShapes( xShapes, nFeatures, pRefPoint );
661*b1cdbd2cSJim Jagielski 	}
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportTextBoxShape(
667*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
668*b1cdbd2cSJim Jagielski 	XmlShapeType eShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint)
669*b1cdbd2cSJim Jagielski {
670*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
671*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
672*b1cdbd2cSJim Jagielski 	{
673*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski 		// presentation attribute (if presentation)
676*b1cdbd2cSJim Jagielski 		sal_Bool bIsPresShape(sal_False);
677*b1cdbd2cSJim Jagielski 		sal_Bool bIsEmptyPresObj(sal_False);
678*b1cdbd2cSJim Jagielski 		OUString aStr;
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski 		switch(eShapeType)
681*b1cdbd2cSJim Jagielski 		{
682*b1cdbd2cSJim Jagielski 			case XmlShapeTypePresSubtitleShape:
683*b1cdbd2cSJim Jagielski 			{
684*b1cdbd2cSJim Jagielski 				aStr = GetXMLToken(XML_PRESENTATION_SUBTITLE);
685*b1cdbd2cSJim Jagielski 				bIsPresShape = sal_True;
686*b1cdbd2cSJim Jagielski 				break;
687*b1cdbd2cSJim Jagielski 			}
688*b1cdbd2cSJim Jagielski 			case XmlShapeTypePresTitleTextShape:
689*b1cdbd2cSJim Jagielski 			{
690*b1cdbd2cSJim Jagielski 				aStr = GetXMLToken(XML_PRESENTATION_TITLE);
691*b1cdbd2cSJim Jagielski 				bIsPresShape = sal_True;
692*b1cdbd2cSJim Jagielski 				break;
693*b1cdbd2cSJim Jagielski 			}
694*b1cdbd2cSJim Jagielski 			case XmlShapeTypePresOutlinerShape:
695*b1cdbd2cSJim Jagielski 			{
696*b1cdbd2cSJim Jagielski 				aStr = GetXMLToken(XML_PRESENTATION_OUTLINE);
697*b1cdbd2cSJim Jagielski 				bIsPresShape = sal_True;
698*b1cdbd2cSJim Jagielski 				break;
699*b1cdbd2cSJim Jagielski 			}
700*b1cdbd2cSJim Jagielski 			case XmlShapeTypePresNotesShape:
701*b1cdbd2cSJim Jagielski 			{
702*b1cdbd2cSJim Jagielski 				aStr = GetXMLToken(XML_PRESENTATION_NOTES);
703*b1cdbd2cSJim Jagielski 				bIsPresShape = sal_True;
704*b1cdbd2cSJim Jagielski 				break;
705*b1cdbd2cSJim Jagielski 			}
706*b1cdbd2cSJim Jagielski 			case XmlShapeTypePresHeaderShape:
707*b1cdbd2cSJim Jagielski 			{
708*b1cdbd2cSJim Jagielski 				aStr = GetXMLToken(XML_HEADER);
709*b1cdbd2cSJim Jagielski 				bIsPresShape = sal_True;
710*b1cdbd2cSJim Jagielski 				break;
711*b1cdbd2cSJim Jagielski 			}
712*b1cdbd2cSJim Jagielski 			case XmlShapeTypePresFooterShape:
713*b1cdbd2cSJim Jagielski 			{
714*b1cdbd2cSJim Jagielski 				aStr = GetXMLToken(XML_FOOTER);
715*b1cdbd2cSJim Jagielski 				bIsPresShape = sal_True;
716*b1cdbd2cSJim Jagielski 				break;
717*b1cdbd2cSJim Jagielski 			}
718*b1cdbd2cSJim Jagielski 			case XmlShapeTypePresSlideNumberShape:
719*b1cdbd2cSJim Jagielski 			{
720*b1cdbd2cSJim Jagielski 				aStr = GetXMLToken(XML_PAGE_NUMBER);
721*b1cdbd2cSJim Jagielski 				bIsPresShape = sal_True;
722*b1cdbd2cSJim Jagielski 				break;
723*b1cdbd2cSJim Jagielski 			}
724*b1cdbd2cSJim Jagielski 			case XmlShapeTypePresDateTimeShape:
725*b1cdbd2cSJim Jagielski 			{
726*b1cdbd2cSJim Jagielski 				aStr = GetXMLToken(XML_DATE_TIME);
727*b1cdbd2cSJim Jagielski 				bIsPresShape = sal_True;
728*b1cdbd2cSJim Jagielski 				break;
729*b1cdbd2cSJim Jagielski 			}
730*b1cdbd2cSJim Jagielski 			default:
731*b1cdbd2cSJim Jagielski 				break;
732*b1cdbd2cSJim Jagielski 		}
733*b1cdbd2cSJim Jagielski 
734*b1cdbd2cSJim Jagielski 		// Transformation
735*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski 		if(bIsPresShape)
738*b1cdbd2cSJim Jagielski 			bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, aStr );
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
742*b1cdbd2cSJim Jagielski 		SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW,
743*b1cdbd2cSJim Jagielski 								  XML_FRAME, bCreateNewline, sal_True );
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski 		// evtl. corner radius?
746*b1cdbd2cSJim Jagielski 		sal_Int32 nCornerRadius(0L);
747*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius"))) >>= nCornerRadius;
748*b1cdbd2cSJim Jagielski 		if(nCornerRadius)
749*b1cdbd2cSJim Jagielski 		{
750*b1cdbd2cSJim Jagielski 			OUStringBuffer sStringBuffer;
751*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nCornerRadius);
752*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_CORNER_RADIUS, sStringBuffer.makeStringAndClear());
753*b1cdbd2cSJim Jagielski 		}
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski 		{
756*b1cdbd2cSJim Jagielski 			// write text-box
757*b1cdbd2cSJim Jagielski 			SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_TEXT_BOX, sal_True, sal_True);
758*b1cdbd2cSJim Jagielski 			if(!bIsEmptyPresObj)
759*b1cdbd2cSJim Jagielski 				ImpExportText( xShape );
760*b1cdbd2cSJim Jagielski 		}
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski 		ImpExportDescription( xShape ); // #i68101#
763*b1cdbd2cSJim Jagielski 		ImpExportEvents( xShape );
764*b1cdbd2cSJim Jagielski 		ImpExportGluePoints( xShape );
765*b1cdbd2cSJim Jagielski 	}
766*b1cdbd2cSJim Jagielski }
767*b1cdbd2cSJim Jagielski 
768*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportRectangleShape(
771*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
772*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint)
773*b1cdbd2cSJim Jagielski {
774*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
775*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
776*b1cdbd2cSJim Jagielski 	{
777*b1cdbd2cSJim Jagielski 		// Transformation
778*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 		// evtl. corner radius?
781*b1cdbd2cSJim Jagielski 		sal_Int32 nCornerRadius(0L);
782*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius"))) >>= nCornerRadius;
783*b1cdbd2cSJim Jagielski 		if(nCornerRadius)
784*b1cdbd2cSJim Jagielski 		{
785*b1cdbd2cSJim Jagielski 			OUStringBuffer sStringBuffer;
786*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nCornerRadius);
787*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_CORNER_RADIUS, sStringBuffer.makeStringAndClear());
788*b1cdbd2cSJim Jagielski 		}
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski 		// write rectangle
791*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
792*b1cdbd2cSJim Jagielski 		SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_RECT, bCreateNewline, sal_True);
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski 		ImpExportDescription( xShape ); // #i68101#
795*b1cdbd2cSJim Jagielski 		ImpExportEvents( xShape );
796*b1cdbd2cSJim Jagielski 		ImpExportGluePoints( xShape );
797*b1cdbd2cSJim Jagielski 		ImpExportText( xShape );
798*b1cdbd2cSJim Jagielski 	}
799*b1cdbd2cSJim Jagielski }
800*b1cdbd2cSJim Jagielski 
801*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportLineShape(
804*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
805*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint)
806*b1cdbd2cSJim Jagielski {
807*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
808*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
809*b1cdbd2cSJim Jagielski 	{
810*b1cdbd2cSJim Jagielski 		OUString aStr;
811*b1cdbd2cSJim Jagielski 		OUStringBuffer sStringBuffer;
812*b1cdbd2cSJim Jagielski 		awt::Point aStart(0,0);
813*b1cdbd2cSJim Jagielski 		awt::Point aEnd(1,1);
814*b1cdbd2cSJim Jagielski 
815*b1cdbd2cSJim Jagielski 		// #85920# use 'Geometry' to get the points of the line
816*b1cdbd2cSJim Jagielski 		// since this slot take anchor pos into account.
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 		// get matrix
819*b1cdbd2cSJim Jagielski 		::basegfx::B2DHomMatrix aMatrix;
820*b1cdbd2cSJim Jagielski 		ImpExportNewTrans_GetB2DHomMatrix(aMatrix, xPropSet);
821*b1cdbd2cSJim Jagielski 
822*b1cdbd2cSJim Jagielski 		// decompose and correct about pRefPoint
823*b1cdbd2cSJim Jagielski 		::basegfx::B2DTuple aTRScale;
824*b1cdbd2cSJim Jagielski 		double fTRShear(0.0);
825*b1cdbd2cSJim Jagielski 		double fTRRotate(0.0);
826*b1cdbd2cSJim Jagielski 		::basegfx::B2DTuple aTRTranslate;
827*b1cdbd2cSJim Jagielski 		ImpExportNewTrans_DecomposeAndRefPoint(aMatrix, aTRScale, fTRShear, fTRRotate, aTRTranslate, pRefPoint);
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski 		// create base position
830*b1cdbd2cSJim Jagielski 		awt::Point aBasePosition(FRound(aTRTranslate.getX()), FRound(aTRTranslate.getY()));
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski 		// get the two points
833*b1cdbd2cSJim Jagielski 		uno::Any aAny(xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry"))));
834*b1cdbd2cSJim Jagielski 		drawing::PointSequenceSequence* pSourcePolyPolygon = (drawing::PointSequenceSequence*)aAny.getValue();
835*b1cdbd2cSJim Jagielski 
836*b1cdbd2cSJim Jagielski 		if(pSourcePolyPolygon)
837*b1cdbd2cSJim Jagielski 		{
838*b1cdbd2cSJim Jagielski 		    drawing::PointSequence* pOuterSequence = pSourcePolyPolygon->getArray();
839*b1cdbd2cSJim Jagielski 			if(pOuterSequence)
840*b1cdbd2cSJim Jagielski 			{
841*b1cdbd2cSJim Jagielski 		        drawing::PointSequence* pInnerSequence = pOuterSequence++;
842*b1cdbd2cSJim Jagielski 				if(pInnerSequence)
843*b1cdbd2cSJim Jagielski 				{
844*b1cdbd2cSJim Jagielski 				    awt::Point* pArray = pInnerSequence->getArray();
845*b1cdbd2cSJim Jagielski 					if(pArray)
846*b1cdbd2cSJim Jagielski 					{
847*b1cdbd2cSJim Jagielski 						if(pInnerSequence->getLength() > 0)
848*b1cdbd2cSJim Jagielski 						{
849*b1cdbd2cSJim Jagielski 							aStart = awt::Point(
850*b1cdbd2cSJim Jagielski 								pArray->X + aBasePosition.X,
851*b1cdbd2cSJim Jagielski 								pArray->Y + aBasePosition.Y);
852*b1cdbd2cSJim Jagielski 							pArray++;
853*b1cdbd2cSJim Jagielski 						}
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski 						if(pInnerSequence->getLength() > 1)
856*b1cdbd2cSJim Jagielski 						{
857*b1cdbd2cSJim Jagielski 							aEnd = awt::Point(
858*b1cdbd2cSJim Jagielski 								pArray->X + aBasePosition.X,
859*b1cdbd2cSJim Jagielski 								pArray->Y + aBasePosition.Y);
860*b1cdbd2cSJim Jagielski 						}
861*b1cdbd2cSJim Jagielski 					}
862*b1cdbd2cSJim Jagielski 				}
863*b1cdbd2cSJim Jagielski 			}
864*b1cdbd2cSJim Jagielski 		}
865*b1cdbd2cSJim Jagielski 
866*b1cdbd2cSJim Jagielski 		if( nFeatures & SEF_EXPORT_X )
867*b1cdbd2cSJim Jagielski 		{
868*b1cdbd2cSJim Jagielski 			// svg: x1
869*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.X);
870*b1cdbd2cSJim Jagielski 			aStr = sStringBuffer.makeStringAndClear();
871*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X1, aStr);
872*b1cdbd2cSJim Jagielski 		}
873*b1cdbd2cSJim Jagielski 		else
874*b1cdbd2cSJim Jagielski 		{
875*b1cdbd2cSJim Jagielski 			aEnd.X -= aStart.X;
876*b1cdbd2cSJim Jagielski 		}
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 		if( nFeatures & SEF_EXPORT_Y )
879*b1cdbd2cSJim Jagielski 		{
880*b1cdbd2cSJim Jagielski 			// svg: y1
881*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.Y);
882*b1cdbd2cSJim Jagielski 			aStr = sStringBuffer.makeStringAndClear();
883*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y1, aStr);
884*b1cdbd2cSJim Jagielski 		}
885*b1cdbd2cSJim Jagielski 		else
886*b1cdbd2cSJim Jagielski 		{
887*b1cdbd2cSJim Jagielski 			aEnd.Y -= aStart.Y;
888*b1cdbd2cSJim Jagielski 		}
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski 		// svg: x2
891*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.X);
892*b1cdbd2cSJim Jagielski 		aStr = sStringBuffer.makeStringAndClear();
893*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X2, aStr);
894*b1cdbd2cSJim Jagielski 
895*b1cdbd2cSJim Jagielski 		// svg: y2
896*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.Y);
897*b1cdbd2cSJim Jagielski 		aStr = sStringBuffer.makeStringAndClear();
898*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y2, aStr);
899*b1cdbd2cSJim Jagielski 
900*b1cdbd2cSJim Jagielski 		// write line
901*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
902*b1cdbd2cSJim Jagielski 		SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_LINE, bCreateNewline, sal_True);
903*b1cdbd2cSJim Jagielski 
904*b1cdbd2cSJim Jagielski 		ImpExportDescription( xShape ); // #i68101#
905*b1cdbd2cSJim Jagielski 		ImpExportEvents( xShape );
906*b1cdbd2cSJim Jagielski 		ImpExportGluePoints( xShape );
907*b1cdbd2cSJim Jagielski 		ImpExportText( xShape );
908*b1cdbd2cSJim Jagielski 	}
909*b1cdbd2cSJim Jagielski }
910*b1cdbd2cSJim Jagielski 
911*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
912*b1cdbd2cSJim Jagielski 
913*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportEllipseShape(
914*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
915*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint)
916*b1cdbd2cSJim Jagielski {
917*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
918*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
919*b1cdbd2cSJim Jagielski 	{
920*b1cdbd2cSJim Jagielski 		// get size to decide between Circle and Ellipse
921*b1cdbd2cSJim Jagielski 		awt::Size aSize = xShape->getSize();
922*b1cdbd2cSJim Jagielski 		sal_Int32 nRx((aSize.Width + 1) / 2);
923*b1cdbd2cSJim Jagielski 		sal_Int32 nRy((aSize.Height + 1) / 2);
924*b1cdbd2cSJim Jagielski 		sal_Bool bCircle(nRx == nRy);
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski 		// Transformation
927*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
928*b1cdbd2cSJim Jagielski 
929*b1cdbd2cSJim Jagielski 		drawing::CircleKind eKind = drawing::CircleKind_FULL;
930*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleKind")) ) >>= eKind;
931*b1cdbd2cSJim Jagielski 		if( eKind != drawing::CircleKind_FULL )
932*b1cdbd2cSJim Jagielski 		{
933*b1cdbd2cSJim Jagielski 			OUStringBuffer sStringBuffer;
934*b1cdbd2cSJim Jagielski 			sal_Int32 nStartAngle = 0;
935*b1cdbd2cSJim Jagielski 			sal_Int32 nEndAngle = 0;
936*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleStartAngle")) ) >>= nStartAngle;
937*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleEndAngle")) ) >>= nEndAngle;
938*b1cdbd2cSJim Jagielski 
939*b1cdbd2cSJim Jagielski 			const double dStartAngle = nStartAngle / 100.0;
940*b1cdbd2cSJim Jagielski 			const double dEndAngle = nEndAngle / 100.0;
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski 			// export circle kind
943*b1cdbd2cSJim Jagielski 			SvXMLUnitConverter::convertEnum( sStringBuffer, (sal_uInt16)eKind, aXML_CircleKind_EnumMap );
944*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_KIND, sStringBuffer.makeStringAndClear() );
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski 			// export start angle
947*b1cdbd2cSJim Jagielski 			SvXMLUnitConverter::convertDouble( sStringBuffer, dStartAngle );
948*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_START_ANGLE, sStringBuffer.makeStringAndClear() );
949*b1cdbd2cSJim Jagielski 
950*b1cdbd2cSJim Jagielski 			// export end angle
951*b1cdbd2cSJim Jagielski 			SvXMLUnitConverter::convertDouble( sStringBuffer, dEndAngle );
952*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_END_ANGLE, sStringBuffer.makeStringAndClear() );
953*b1cdbd2cSJim Jagielski 		}
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski         // prepare name (with most used)
958*b1cdbd2cSJim Jagielski         enum ::xmloff::token::XMLTokenEnum eName(XML_CIRCLE);
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski         if(bCircle)
961*b1cdbd2cSJim Jagielski         {
962*b1cdbd2cSJim Jagielski             // name already set
963*b1cdbd2cSJim Jagielski         }
964*b1cdbd2cSJim Jagielski         else
965*b1cdbd2cSJim Jagielski         {
966*b1cdbd2cSJim Jagielski             // set name
967*b1cdbd2cSJim Jagielski             eName = XML_ELLIPSE;
968*b1cdbd2cSJim Jagielski         }
969*b1cdbd2cSJim Jagielski 
970*b1cdbd2cSJim Jagielski         // write ellipse or circle
971*b1cdbd2cSJim Jagielski         SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, eName, bCreateNewline, sal_True);
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski         ImpExportDescription( xShape ); // #i68101#
974*b1cdbd2cSJim Jagielski         ImpExportEvents( xShape );
975*b1cdbd2cSJim Jagielski         ImpExportGluePoints( xShape );
976*b1cdbd2cSJim Jagielski         ImpExportText( xShape );
977*b1cdbd2cSJim Jagielski     }
978*b1cdbd2cSJim Jagielski }
979*b1cdbd2cSJim Jagielski 
980*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
981*b1cdbd2cSJim Jagielski 
982*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportPolygonShape(
983*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
984*b1cdbd2cSJim Jagielski 	XmlShapeType eShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint)
985*b1cdbd2cSJim Jagielski {
986*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
987*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
988*b1cdbd2cSJim Jagielski 	{
989*b1cdbd2cSJim Jagielski 		sal_Bool bBezier(eShapeType == XmlShapeTypeDrawClosedBezierShape
990*b1cdbd2cSJim Jagielski 			|| eShapeType == XmlShapeTypeDrawOpenBezierShape);
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski 		// get matrix
993*b1cdbd2cSJim Jagielski 		::basegfx::B2DHomMatrix aMatrix;
994*b1cdbd2cSJim Jagielski 		ImpExportNewTrans_GetB2DHomMatrix(aMatrix, xPropSet);
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski 		// decompose and correct abour pRefPoint
997*b1cdbd2cSJim Jagielski 		::basegfx::B2DTuple aTRScale;
998*b1cdbd2cSJim Jagielski 		double fTRShear(0.0);
999*b1cdbd2cSJim Jagielski 		double fTRRotate(0.0);
1000*b1cdbd2cSJim Jagielski 		::basegfx::B2DTuple aTRTranslate;
1001*b1cdbd2cSJim Jagielski 		ImpExportNewTrans_DecomposeAndRefPoint(aMatrix, aTRScale, fTRShear, fTRRotate, aTRTranslate, pRefPoint);
1002*b1cdbd2cSJim Jagielski 
1003*b1cdbd2cSJim Jagielski 		// use features and write
1004*b1cdbd2cSJim Jagielski 		ImpExportNewTrans_FeaturesAndWrite(aTRScale, fTRShear, fTRRotate, aTRTranslate, nFeatures);
1005*b1cdbd2cSJim Jagielski 
1006*b1cdbd2cSJim Jagielski 		// create and export ViewBox
1007*b1cdbd2cSJim Jagielski 		awt::Point aPoint(0, 0);
1008*b1cdbd2cSJim Jagielski 		awt::Size aSize(FRound(aTRScale.getX()), FRound(aTRScale.getY()));
1009*b1cdbd2cSJim Jagielski 		SdXMLImExViewBox aViewBox(0, 0, aSize.Width, aSize.Height);
1010*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_VIEWBOX, aViewBox.GetExportString());
1011*b1cdbd2cSJim Jagielski 
1012*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski         // prepare name (with most used)
1015*b1cdbd2cSJim Jagielski         enum ::xmloff::token::XMLTokenEnum eName(XML_PATH);
1016*b1cdbd2cSJim Jagielski 
1017*b1cdbd2cSJim Jagielski         if(bBezier)
1018*b1cdbd2cSJim Jagielski         {
1019*b1cdbd2cSJim Jagielski             // get PolygonBezier
1020*b1cdbd2cSJim Jagielski             uno::Any aAny( xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry"))) );
1021*b1cdbd2cSJim Jagielski             const basegfx::B2DPolyPolygon aPolyPolygon(
1022*b1cdbd2cSJim Jagielski                 basegfx::tools::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(*(drawing::PolyPolygonBezierCoords*)aAny.getValue()));
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski             if(aPolyPolygon.count())
1025*b1cdbd2cSJim Jagielski             {
1026*b1cdbd2cSJim Jagielski                 // complex polygon shape, write as svg:d
1027*b1cdbd2cSJim Jagielski                 const ::rtl::OUString aPolygonString(
1028*b1cdbd2cSJim Jagielski                     basegfx::tools::exportToSvgD(
1029*b1cdbd2cSJim Jagielski                         aPolyPolygon,
1030*b1cdbd2cSJim Jagielski                         true,       // bUseRelativeCoordinates
1031*b1cdbd2cSJim Jagielski                         false,      // bDetectQuadraticBeziers: not used in old, but maybe activated now
1032*b1cdbd2cSJim Jagielski                         true));     // bHandleRelativeNextPointCompatible
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski                 // write point array
1035*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_D, aPolygonString);
1036*b1cdbd2cSJim Jagielski             }
1037*b1cdbd2cSJim Jagielski         }
1038*b1cdbd2cSJim Jagielski         else
1039*b1cdbd2cSJim Jagielski         {
1040*b1cdbd2cSJim Jagielski             // get non-bezier polygon
1041*b1cdbd2cSJim Jagielski             uno::Any aAny( xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry"))) );
1042*b1cdbd2cSJim Jagielski             const basegfx::B2DPolyPolygon aPolyPolygon(
1043*b1cdbd2cSJim Jagielski                 basegfx::tools::UnoPointSequenceSequenceToB2DPolyPolygon(*(drawing::PointSequenceSequence*)aAny.getValue()));
1044*b1cdbd2cSJim Jagielski 
1045*b1cdbd2cSJim Jagielski             if(!aPolyPolygon.areControlPointsUsed() && 1 == aPolyPolygon.count())
1046*b1cdbd2cSJim Jagielski             {
1047*b1cdbd2cSJim Jagielski                 // simple polygon shape, can be written as svg:points sequence
1048*b1cdbd2cSJim Jagielski                 const basegfx::B2DPolygon aPolygon(aPolyPolygon.getB2DPolygon(0));
1049*b1cdbd2cSJim Jagielski                 const ::rtl::OUString aPointString(basegfx::tools::exportToSvgPoints(aPolygon));
1050*b1cdbd2cSJim Jagielski 
1051*b1cdbd2cSJim Jagielski                 // write point array
1052*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_POINTS, aPointString);
1053*b1cdbd2cSJim Jagielski 
1054*b1cdbd2cSJim Jagielski                 // set name
1055*b1cdbd2cSJim Jagielski                 eName = aPolygon.isClosed() ? XML_POLYGON : XML_POLYLINE;
1056*b1cdbd2cSJim Jagielski             }
1057*b1cdbd2cSJim Jagielski             else
1058*b1cdbd2cSJim Jagielski             {
1059*b1cdbd2cSJim Jagielski                 // complex polygon shape, write as svg:d
1060*b1cdbd2cSJim Jagielski                 const ::rtl::OUString aPolygonString(
1061*b1cdbd2cSJim Jagielski                     basegfx::tools::exportToSvgD(
1062*b1cdbd2cSJim Jagielski                         aPolyPolygon,
1063*b1cdbd2cSJim Jagielski                         true,       // bUseRelativeCoordinates
1064*b1cdbd2cSJim Jagielski                         false,      // bDetectQuadraticBeziers: not used in old, but maybe activated now
1065*b1cdbd2cSJim Jagielski                         true));     // bHandleRelativeNextPointCompatible
1066*b1cdbd2cSJim Jagielski 
1067*b1cdbd2cSJim Jagielski                 // write point array
1068*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_D, aPolygonString);
1069*b1cdbd2cSJim Jagielski             }
1070*b1cdbd2cSJim Jagielski         }
1071*b1cdbd2cSJim Jagielski 
1072*b1cdbd2cSJim Jagielski         // write object, but after attributes are added since this call will
1073*b1cdbd2cSJim Jagielski         // consume all of these added attributes and the destructor will close the
1074*b1cdbd2cSJim Jagielski         // scope. Also before text is added; this may add sub-scopes as needed
1075*b1cdbd2cSJim Jagielski         SvXMLElementExport aOBJ(
1076*b1cdbd2cSJim Jagielski             mrExport,
1077*b1cdbd2cSJim Jagielski             XML_NAMESPACE_DRAW,
1078*b1cdbd2cSJim Jagielski             eName,
1079*b1cdbd2cSJim Jagielski             bCreateNewline,
1080*b1cdbd2cSJim Jagielski             sal_True);
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski         ImpExportDescription( xShape ); // #i68101#
1083*b1cdbd2cSJim Jagielski         ImpExportEvents( xShape );
1084*b1cdbd2cSJim Jagielski         ImpExportGluePoints( xShape );
1085*b1cdbd2cSJim Jagielski         ImpExportText( xShape );
1086*b1cdbd2cSJim Jagielski     }
1087*b1cdbd2cSJim Jagielski }
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1090*b1cdbd2cSJim Jagielski 
1091*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportGraphicObjectShape(
1092*b1cdbd2cSJim Jagielski     const uno::Reference< drawing::XShape >& xShape,
1093*b1cdbd2cSJim Jagielski     XmlShapeType eShapeType,
1094*b1cdbd2cSJim Jagielski     sal_Int32 nFeatures,
1095*b1cdbd2cSJim Jagielski     awt::Point* pRefPoint )
1096*b1cdbd2cSJim Jagielski {
1097*b1cdbd2cSJim Jagielski     const uno::Reference< beans::XPropertySet > xPropSet( xShape, uno::UNO_QUERY );
1098*b1cdbd2cSJim Jagielski     if ( xPropSet.is() )
1099*b1cdbd2cSJim Jagielski     {
1100*b1cdbd2cSJim Jagielski         sal_Bool bIsEmptyPresObj = sal_False;
1101*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski         // Transformation
1104*b1cdbd2cSJim Jagielski         ImpExportNewTrans( xPropSet, nFeatures, pRefPoint );
1105*b1cdbd2cSJim Jagielski 
1106*b1cdbd2cSJim Jagielski         OUString sImageURL;
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski         if ( eShapeType == XmlShapeTypePresGraphicObjectShape )
1109*b1cdbd2cSJim Jagielski             bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken( XML_PRESENTATION_GRAPHIC ) );
1110*b1cdbd2cSJim Jagielski 
1111*b1cdbd2cSJim Jagielski         sal_Bool bCreateNewline( ( nFeatures & SEF_EXPORT_NO_WS ) == 0 ); // #86116#/#92210#
1112*b1cdbd2cSJim Jagielski         SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, XML_FRAME, bCreateNewline, sal_True );
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski         const bool bSaveBackwardsCompatible = ( mrExport.getExportFlags() & EXPORT_SAVEBACKWARDCOMPATIBLE );
1115*b1cdbd2cSJim Jagielski 
1116*b1cdbd2cSJim Jagielski         if ( !bIsEmptyPresObj || bSaveBackwardsCompatible )
1117*b1cdbd2cSJim Jagielski         {
1118*b1cdbd2cSJim Jagielski             if ( !bIsEmptyPresObj )
1119*b1cdbd2cSJim Jagielski             {
1120*b1cdbd2cSJim Jagielski                 OUString aReplacementUrl;
1121*b1cdbd2cSJim Jagielski                 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("ReplacementGraphicURL"))) >>= aReplacementUrl;
1122*b1cdbd2cSJim Jagielski 
1123*b1cdbd2cSJim Jagielski                 // If there is no url, then then graphic is empty
1124*b1cdbd2cSJim Jagielski                 if ( aReplacementUrl.getLength() )
1125*b1cdbd2cSJim Jagielski                 {
1126*b1cdbd2cSJim Jagielski                     const OUString aStr = mrExport.AddEmbeddedGraphicObject(aReplacementUrl);
1127*b1cdbd2cSJim Jagielski 
1128*b1cdbd2cSJim Jagielski                     if(aStr.getLength())
1129*b1cdbd2cSJim Jagielski                     {
1130*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, aStr);
1131*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1132*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1133*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski                         // xlink:href for replacement, only written for Svg content
1136*b1cdbd2cSJim Jagielski                         SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_IMAGE, sal_True, sal_True);
1137*b1cdbd2cSJim Jagielski 
1138*b1cdbd2cSJim Jagielski                         // optional office:binary-data
1139*b1cdbd2cSJim Jagielski                         mrExport.AddEmbeddedGraphicObjectAsBase64(aReplacementUrl);
1140*b1cdbd2cSJim Jagielski                     }
1141*b1cdbd2cSJim Jagielski                 }
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski                 OUString aStreamURL;
1144*b1cdbd2cSJim Jagielski                 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicStreamURL" ) ) ) >>= aStreamURL;
1145*b1cdbd2cSJim Jagielski                 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicURL" ) ) ) >>= sImageURL;
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski                 OUString aResolveURL( sImageURL );
1148*b1cdbd2cSJim Jagielski                 const rtl::OUString sPackageURL( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package:" ) );
1149*b1cdbd2cSJim Jagielski 
1150*b1cdbd2cSJim Jagielski                 // sj: trying to preserve the filename for embedded images which already have its stream inside the package
1151*b1cdbd2cSJim Jagielski                 bool bIsEmbeddedImageWithExistingStreamInPackage = false;
1152*b1cdbd2cSJim Jagielski                 if ( aStreamURL.match( sPackageURL, 0 ) )
1153*b1cdbd2cSJim Jagielski                 {
1154*b1cdbd2cSJim Jagielski                     bIsEmbeddedImageWithExistingStreamInPackage = true;
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski                     rtl::OUString sRequestedName( aStreamURL.copy( sPackageURL.getLength(), aStreamURL.getLength() - sPackageURL.getLength() ) );
1157*b1cdbd2cSJim Jagielski                     sal_Int32 nLastIndex = sRequestedName.lastIndexOf( '/' ) + 1;
1158*b1cdbd2cSJim Jagielski                     if ( ( nLastIndex > 0 ) && ( nLastIndex < sRequestedName.getLength() ) )
1159*b1cdbd2cSJim Jagielski                         sRequestedName = sRequestedName.copy( nLastIndex, sRequestedName.getLength() - nLastIndex );
1160*b1cdbd2cSJim Jagielski                     nLastIndex = sRequestedName.lastIndexOf( '.' );
1161*b1cdbd2cSJim Jagielski                     if ( nLastIndex >= 0 )
1162*b1cdbd2cSJim Jagielski                         sRequestedName = sRequestedName.copy( 0, nLastIndex );
1163*b1cdbd2cSJim Jagielski                     if ( sRequestedName.getLength() )
1164*b1cdbd2cSJim Jagielski                     {
1165*b1cdbd2cSJim Jagielski                         aResolveURL = aResolveURL.concat( OUString( RTL_CONSTASCII_USTRINGPARAM( "?requestedName=" ) ) );
1166*b1cdbd2cSJim Jagielski                         aResolveURL = aResolveURL.concat( sRequestedName );
1167*b1cdbd2cSJim Jagielski                     }
1168*b1cdbd2cSJim Jagielski                 }
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski                 const OUString aStr = mrExport.AddEmbeddedGraphicObject( aResolveURL );
1171*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aStr );
1172*b1cdbd2cSJim Jagielski 
1173*b1cdbd2cSJim Jagielski                 if ( !aStr.isEmpty() )
1174*b1cdbd2cSJim Jagielski                 {
1175*b1cdbd2cSJim Jagielski                     // apply possible changed stream URL to embedded image object
1176*b1cdbd2cSJim Jagielski                     if ( bIsEmbeddedImageWithExistingStreamInPackage )
1177*b1cdbd2cSJim Jagielski                     {
1178*b1cdbd2cSJim Jagielski                         aStreamURL = sPackageURL;
1179*b1cdbd2cSJim Jagielski                         if ( aStr[0] == '#' )
1180*b1cdbd2cSJim Jagielski                         {
1181*b1cdbd2cSJim Jagielski                             aStreamURL = aStreamURL.concat( aStr.copy( 1, aStr.getLength() - 1 ) );
1182*b1cdbd2cSJim Jagielski                         }
1183*b1cdbd2cSJim Jagielski                         else
1184*b1cdbd2cSJim Jagielski                         {
1185*b1cdbd2cSJim Jagielski                             aStreamURL = aStreamURL.concat( aStr );
1186*b1cdbd2cSJim Jagielski                         }
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski                         uno::Any aAny;
1189*b1cdbd2cSJim Jagielski                         aAny <<= aStreamURL;
1190*b1cdbd2cSJim Jagielski                         xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicStreamURL" ) ), aAny );
1191*b1cdbd2cSJim Jagielski                     }
1192*b1cdbd2cSJim Jagielski 
1193*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1194*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1195*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1196*b1cdbd2cSJim Jagielski                 }
1197*b1cdbd2cSJim Jagielski             }
1198*b1cdbd2cSJim Jagielski             else
1199*b1cdbd2cSJim Jagielski             {
1200*b1cdbd2cSJim Jagielski                 OUString aStr;
1201*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aStr );
1202*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1203*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1204*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1205*b1cdbd2cSJim Jagielski             }
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski             {
1208*b1cdbd2cSJim Jagielski                 SvXMLElementExport aOBJ( mrExport, XML_NAMESPACE_DRAW, XML_IMAGE, sal_True, sal_True );
1209*b1cdbd2cSJim Jagielski 
1210*b1cdbd2cSJim Jagielski                 if ( sImageURL.getLength() )
1211*b1cdbd2cSJim Jagielski                 {
1212*b1cdbd2cSJim Jagielski                     // optional office:binary-data
1213*b1cdbd2cSJim Jagielski                     mrExport.AddEmbeddedGraphicObjectAsBase64( sImageURL );
1214*b1cdbd2cSJim Jagielski                 }
1215*b1cdbd2cSJim Jagielski                 if ( !bIsEmptyPresObj )
1216*b1cdbd2cSJim Jagielski                     ImpExportText( xShape );
1217*b1cdbd2cSJim Jagielski             }
1218*b1cdbd2cSJim Jagielski         }
1219*b1cdbd2cSJim Jagielski 
1220*b1cdbd2cSJim Jagielski         ImpExportEvents( xShape );
1221*b1cdbd2cSJim Jagielski         ImpExportGluePoints( xShape );
1222*b1cdbd2cSJim Jagielski 
1223*b1cdbd2cSJim Jagielski         // image map
1224*b1cdbd2cSJim Jagielski         GetExport().GetImageMapExport().Export( xPropSet );
1225*b1cdbd2cSJim Jagielski         ImpExportDescription( xShape ); // #i68101#
1226*b1cdbd2cSJim Jagielski     }
1227*b1cdbd2cSJim Jagielski }
1228*b1cdbd2cSJim Jagielski 
1229*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1230*b1cdbd2cSJim Jagielski 
1231*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportChartShape(
1232*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1233*b1cdbd2cSJim Jagielski 	XmlShapeType eShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint,
1234*b1cdbd2cSJim Jagielski     SvXMLAttributeList* pAttrList )
1235*b1cdbd2cSJim Jagielski {
1236*b1cdbd2cSJim Jagielski 	ImpExportOLE2Shape( xShape, eShapeType, nFeatures, pRefPoint, pAttrList );
1237*b1cdbd2cSJim Jagielski }
1238*b1cdbd2cSJim Jagielski 
1239*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportControlShape(
1242*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1243*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint)
1244*b1cdbd2cSJim Jagielski {
1245*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
1246*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
1247*b1cdbd2cSJim Jagielski 	{
1248*b1cdbd2cSJim Jagielski 		// Transformation
1249*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
1250*b1cdbd2cSJim Jagielski 	}
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XControlShape > xControl( xShape, uno::UNO_QUERY );
1253*b1cdbd2cSJim Jagielski 	DBG_ASSERT( xControl.is(), "Control shape is not supporting XControlShape" );
1254*b1cdbd2cSJim Jagielski 	if( xControl.is() )
1255*b1cdbd2cSJim Jagielski 	{
1256*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xControlModel( xControl->getControl(), uno::UNO_QUERY );
1257*b1cdbd2cSJim Jagielski 		DBG_ASSERT( xControlModel.is(), "Control shape has not XControlModel" );
1258*b1cdbd2cSJim Jagielski 		if( xControlModel.is() )
1259*b1cdbd2cSJim Jagielski 		{
1260*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CONTROL, mrExport.GetFormExport()->getControlId( xControlModel ) );
1261*b1cdbd2cSJim Jagielski 		}
1262*b1cdbd2cSJim Jagielski 	}
1263*b1cdbd2cSJim Jagielski 
1264*b1cdbd2cSJim Jagielski 	sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1265*b1cdbd2cSJim Jagielski 	SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_CONTROL, bCreateNewline, sal_True);
1266*b1cdbd2cSJim Jagielski 
1267*b1cdbd2cSJim Jagielski 	ImpExportDescription( xShape ); // #i68101#
1268*b1cdbd2cSJim Jagielski }
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1271*b1cdbd2cSJim Jagielski 
1272*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportConnectorShape(
1273*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1274*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */)
1275*b1cdbd2cSJim Jagielski {
1276*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski 	OUString aStr;
1279*b1cdbd2cSJim Jagielski 	OUStringBuffer sStringBuffer;
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski 	// export connection kind
1282*b1cdbd2cSJim Jagielski 	drawing::ConnectorType eType = drawing::ConnectorType_STANDARD;
1283*b1cdbd2cSJim Jagielski 	uno::Any aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeKind")));
1284*b1cdbd2cSJim Jagielski 	aAny >>= eType;
1285*b1cdbd2cSJim Jagielski 
1286*b1cdbd2cSJim Jagielski 	if( eType != drawing::ConnectorType_STANDARD )
1287*b1cdbd2cSJim Jagielski 	{
1288*b1cdbd2cSJim Jagielski 		SvXMLUnitConverter::convertEnum( sStringBuffer, (sal_uInt16)eType, aXML_ConnectionKind_EnumMap );
1289*b1cdbd2cSJim Jagielski 		aStr = sStringBuffer.makeStringAndClear();
1290*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_TYPE, aStr);
1291*b1cdbd2cSJim Jagielski 	}
1292*b1cdbd2cSJim Jagielski 
1293*b1cdbd2cSJim Jagielski 	// export line skew
1294*b1cdbd2cSJim Jagielski 	sal_Int32 nDelta1 = 0, nDelta2 = 0, nDelta3 = 0;
1295*b1cdbd2cSJim Jagielski 
1296*b1cdbd2cSJim Jagielski 	aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine1Delta")));
1297*b1cdbd2cSJim Jagielski 	aAny >>= nDelta1;
1298*b1cdbd2cSJim Jagielski 	aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine2Delta")));
1299*b1cdbd2cSJim Jagielski 	aAny >>= nDelta2;
1300*b1cdbd2cSJim Jagielski 	aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine3Delta")));
1301*b1cdbd2cSJim Jagielski 	aAny >>= nDelta3;
1302*b1cdbd2cSJim Jagielski 
1303*b1cdbd2cSJim Jagielski 	if( nDelta1 != 0 || nDelta2 != 0 || nDelta3 != 0 )
1304*b1cdbd2cSJim Jagielski 	{
1305*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nDelta1);
1306*b1cdbd2cSJim Jagielski 		if( nDelta2 != 0 || nDelta3 != 0 )
1307*b1cdbd2cSJim Jagielski 		{
1308*b1cdbd2cSJim Jagielski 			const char aSpace = ' ';
1309*b1cdbd2cSJim Jagielski 			sStringBuffer.appendAscii( &aSpace, 1 );
1310*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nDelta2);
1311*b1cdbd2cSJim Jagielski 			if( nDelta3 != 0 )
1312*b1cdbd2cSJim Jagielski 			{
1313*b1cdbd2cSJim Jagielski 				sStringBuffer.appendAscii( &aSpace, 1 );
1314*b1cdbd2cSJim Jagielski 				mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nDelta3);
1315*b1cdbd2cSJim Jagielski 			}
1316*b1cdbd2cSJim Jagielski 		}
1317*b1cdbd2cSJim Jagielski 
1318*b1cdbd2cSJim Jagielski 		aStr = sStringBuffer.makeStringAndClear();
1319*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_LINE_SKEW, aStr);
1320*b1cdbd2cSJim Jagielski 	}
1321*b1cdbd2cSJim Jagielski 
1322*b1cdbd2cSJim Jagielski 	// export start and end point
1323*b1cdbd2cSJim Jagielski 	awt::Point aStart(0,0);
1324*b1cdbd2cSJim Jagielski 	awt::Point aEnd(1,1);
1325*b1cdbd2cSJim Jagielski 
1326*b1cdbd2cSJim Jagielski     // --> OD 2004-08-09 #i36248# - Get <StartPositionInHoriL2R> and
1327*b1cdbd2cSJim Jagielski     // <EndPositionInHoriL2R>, if they exist and if the document is exported
1328*b1cdbd2cSJim Jagielski     // into the OpenOffice.org file format.
1329*b1cdbd2cSJim Jagielski     // These properties only exist at service com::sun::star::text::Shape - the
1330*b1cdbd2cSJim Jagielski     // Writer UNO service for shapes.
1331*b1cdbd2cSJim Jagielski     // This code is needed, because the positioning attributes in the
1332*b1cdbd2cSJim Jagielski     // OpenOffice.org file format are given in horizontal left-to-right layout
1333*b1cdbd2cSJim Jagielski     // regardless the layout direction the shape is in. In the OASIS Open Office
1334*b1cdbd2cSJim Jagielski     // file format the positioning attributes are correctly given in the layout
1335*b1cdbd2cSJim Jagielski     // direction the shape is in. Thus, this code provides the conversion from
1336*b1cdbd2cSJim Jagielski     // the OASIS Open Office file format to the OpenOffice.org file format.
1337*b1cdbd2cSJim Jagielski     if ( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 &&
1338*b1cdbd2cSJim Jagielski          xProps->getPropertySetInfo()->hasPropertyByName(
1339*b1cdbd2cSJim Jagielski             OUString(RTL_CONSTASCII_USTRINGPARAM("StartPositionInHoriL2R"))) &&
1340*b1cdbd2cSJim Jagielski          xProps->getPropertySetInfo()->hasPropertyByName(
1341*b1cdbd2cSJim Jagielski             OUString(RTL_CONSTASCII_USTRINGPARAM("EndPositionInHoriL2R"))) )
1342*b1cdbd2cSJim Jagielski     {
1343*b1cdbd2cSJim Jagielski         xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPositionInHoriL2R"))) >>= aStart;
1344*b1cdbd2cSJim Jagielski         xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPositionInHoriL2R"))) >>= aEnd;
1345*b1cdbd2cSJim Jagielski     }
1346*b1cdbd2cSJim Jagielski     else
1347*b1cdbd2cSJim Jagielski     {
1348*b1cdbd2cSJim Jagielski         xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition"))) >>= aStart;
1349*b1cdbd2cSJim Jagielski         xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition"))) >>= aEnd;
1350*b1cdbd2cSJim Jagielski     }
1351*b1cdbd2cSJim Jagielski     // <--
1352*b1cdbd2cSJim Jagielski 
1353*b1cdbd2cSJim Jagielski 	if( pRefPoint )
1354*b1cdbd2cSJim Jagielski 	{
1355*b1cdbd2cSJim Jagielski 		aStart.X -= pRefPoint->X;
1356*b1cdbd2cSJim Jagielski 		aStart.Y -= pRefPoint->Y;
1357*b1cdbd2cSJim Jagielski 		aEnd.X -= pRefPoint->X;
1358*b1cdbd2cSJim Jagielski 		aEnd.Y -= pRefPoint->Y;
1359*b1cdbd2cSJim Jagielski 	}
1360*b1cdbd2cSJim Jagielski 
1361*b1cdbd2cSJim Jagielski 	if( nFeatures & SEF_EXPORT_X )
1362*b1cdbd2cSJim Jagielski 	{
1363*b1cdbd2cSJim Jagielski 		// svg: x1
1364*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.X);
1365*b1cdbd2cSJim Jagielski 		aStr = sStringBuffer.makeStringAndClear();
1366*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X1, aStr);
1367*b1cdbd2cSJim Jagielski 	}
1368*b1cdbd2cSJim Jagielski 	else
1369*b1cdbd2cSJim Jagielski 	{
1370*b1cdbd2cSJim Jagielski 		aEnd.X -= aStart.X;
1371*b1cdbd2cSJim Jagielski 	}
1372*b1cdbd2cSJim Jagielski 
1373*b1cdbd2cSJim Jagielski 	if( nFeatures & SEF_EXPORT_Y )
1374*b1cdbd2cSJim Jagielski 	{
1375*b1cdbd2cSJim Jagielski 		// svg: y1
1376*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.Y);
1377*b1cdbd2cSJim Jagielski 		aStr = sStringBuffer.makeStringAndClear();
1378*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y1, aStr);
1379*b1cdbd2cSJim Jagielski 	}
1380*b1cdbd2cSJim Jagielski 	else
1381*b1cdbd2cSJim Jagielski 	{
1382*b1cdbd2cSJim Jagielski 		aEnd.Y -= aStart.Y;
1383*b1cdbd2cSJim Jagielski 	}
1384*b1cdbd2cSJim Jagielski 
1385*b1cdbd2cSJim Jagielski 	// svg: x2
1386*b1cdbd2cSJim Jagielski 	mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.X);
1387*b1cdbd2cSJim Jagielski 	aStr = sStringBuffer.makeStringAndClear();
1388*b1cdbd2cSJim Jagielski 	mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X2, aStr);
1389*b1cdbd2cSJim Jagielski 
1390*b1cdbd2cSJim Jagielski 	// svg: y2
1391*b1cdbd2cSJim Jagielski 	mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.Y);
1392*b1cdbd2cSJim Jagielski 	aStr = sStringBuffer.makeStringAndClear();
1393*b1cdbd2cSJim Jagielski 	mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y2, aStr);
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski 	// #i39320#
1396*b1cdbd2cSJim Jagielski 	uno::Reference< uno::XInterface > xRefS;
1397*b1cdbd2cSJim Jagielski 	uno::Reference< uno::XInterface > xRefE;
1398*b1cdbd2cSJim Jagielski 
1399*b1cdbd2cSJim Jagielski 	// export start connection
1400*b1cdbd2cSJim Jagielski 	xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartShape") ) ) >>= xRefS;
1401*b1cdbd2cSJim Jagielski 	if( xRefS.is() )
1402*b1cdbd2cSJim Jagielski 	{
1403*b1cdbd2cSJim Jagielski 		const OUString& rShapeId = mrExport.getInterfaceToIdentifierMapper().getIdentifier( xRefS );
1404*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_START_SHAPE, rShapeId);
1405*b1cdbd2cSJim Jagielski 
1406*b1cdbd2cSJim Jagielski 		aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartGluePointIndex")) );
1407*b1cdbd2cSJim Jagielski 		sal_Int32 nGluePointId = 0;
1408*b1cdbd2cSJim Jagielski 		if( aAny >>= nGluePointId )
1409*b1cdbd2cSJim Jagielski 		{
1410*b1cdbd2cSJim Jagielski 			if( nGluePointId != -1 )
1411*b1cdbd2cSJim Jagielski 			{
1412*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_START_GLUE_POINT, OUString::valueOf( nGluePointId ));
1413*b1cdbd2cSJim Jagielski 			}
1414*b1cdbd2cSJim Jagielski 		}
1415*b1cdbd2cSJim Jagielski 	}
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski 	// export end connection
1418*b1cdbd2cSJim Jagielski 	xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndShape")) ) >>= xRefE;
1419*b1cdbd2cSJim Jagielski 	if( xRefE.is() )
1420*b1cdbd2cSJim Jagielski 	{
1421*b1cdbd2cSJim Jagielski 		const OUString& rShapeId = mrExport.getInterfaceToIdentifierMapper().getIdentifier( xRefE );
1422*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_END_SHAPE, rShapeId);
1423*b1cdbd2cSJim Jagielski 
1424*b1cdbd2cSJim Jagielski 		aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndGluePointIndex")) );
1425*b1cdbd2cSJim Jagielski 		sal_Int32 nGluePointId = 0;
1426*b1cdbd2cSJim Jagielski 		if( aAny >>= nGluePointId )
1427*b1cdbd2cSJim Jagielski 		{
1428*b1cdbd2cSJim Jagielski 			if( nGluePointId != -1 )
1429*b1cdbd2cSJim Jagielski 			{
1430*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_END_GLUE_POINT, OUString::valueOf( nGluePointId ));
1431*b1cdbd2cSJim Jagielski 			}
1432*b1cdbd2cSJim Jagielski 		}
1433*b1cdbd2cSJim Jagielski 	}
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski     if( xProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("PolyPolygonBezier") ) ) >>= aAny )
1436*b1cdbd2cSJim Jagielski     {
1437*b1cdbd2cSJim Jagielski         // get PolygonBezier
1438*b1cdbd2cSJim Jagielski         drawing::PolyPolygonBezierCoords* pSourcePolyPolygon = (drawing::PolyPolygonBezierCoords*)aAny.getValue();
1439*b1cdbd2cSJim Jagielski 
1440*b1cdbd2cSJim Jagielski         if(pSourcePolyPolygon && pSourcePolyPolygon->Coordinates.getLength())
1441*b1cdbd2cSJim Jagielski         {
1442*b1cdbd2cSJim Jagielski             const basegfx::B2DPolyPolygon aPolyPolygon(
1443*b1cdbd2cSJim Jagielski                 basegfx::tools::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(
1444*b1cdbd2cSJim Jagielski                     *pSourcePolyPolygon));
1445*b1cdbd2cSJim Jagielski             const ::rtl::OUString aPolygonString(
1446*b1cdbd2cSJim Jagielski                 basegfx::tools::exportToSvgD(
1447*b1cdbd2cSJim Jagielski                     aPolyPolygon,
1448*b1cdbd2cSJim Jagielski                     true,           // bUseRelativeCoordinates
1449*b1cdbd2cSJim Jagielski                     false,          // bDetectQuadraticBeziers: not used in old, but maybe activated now
1450*b1cdbd2cSJim Jagielski                     true));         // bHandleRelativeNextPointCompatible
1451*b1cdbd2cSJim Jagielski 
1452*b1cdbd2cSJim Jagielski             // write point array
1453*b1cdbd2cSJim Jagielski             mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_D, aPolygonString);
1454*b1cdbd2cSJim Jagielski         }
1455*b1cdbd2cSJim Jagielski     }
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski 	// write connector shape. Add Export later.
1458*b1cdbd2cSJim Jagielski 	sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1459*b1cdbd2cSJim Jagielski 	SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_CONNECTOR, bCreateNewline, sal_True);
1460*b1cdbd2cSJim Jagielski 
1461*b1cdbd2cSJim Jagielski 	ImpExportDescription( xShape ); // #i68101#
1462*b1cdbd2cSJim Jagielski 	ImpExportEvents( xShape );
1463*b1cdbd2cSJim Jagielski 	ImpExportGluePoints( xShape );
1464*b1cdbd2cSJim Jagielski 	ImpExportText( xShape );
1465*b1cdbd2cSJim Jagielski }
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1468*b1cdbd2cSJim Jagielski 
1469*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportMeasureShape(
1470*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1471*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */)
1472*b1cdbd2cSJim Jagielski {
1473*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski 	OUString aStr;
1476*b1cdbd2cSJim Jagielski 	OUStringBuffer sStringBuffer;
1477*b1cdbd2cSJim Jagielski 
1478*b1cdbd2cSJim Jagielski 	// export start and end point
1479*b1cdbd2cSJim Jagielski 	awt::Point aStart(0,0);
1480*b1cdbd2cSJim Jagielski 	awt::Point aEnd(1,1);
1481*b1cdbd2cSJim Jagielski 
1482*b1cdbd2cSJim Jagielski     // --> OD 2004-08-09 #i36248# - Get <StartPositionInHoriL2R> and
1483*b1cdbd2cSJim Jagielski     // <EndPositionInHoriL2R>, if they exist and if the document is exported
1484*b1cdbd2cSJim Jagielski     // into the OpenOffice.org file format.
1485*b1cdbd2cSJim Jagielski     // These properties only exist at service com::sun::star::text::Shape - the
1486*b1cdbd2cSJim Jagielski     // Writer UNO service for shapes.
1487*b1cdbd2cSJim Jagielski     // This code is needed, because the positioning attributes in the
1488*b1cdbd2cSJim Jagielski     // OpenOffice.org file format are given in horizontal left-to-right layout
1489*b1cdbd2cSJim Jagielski     // regardless the layout direction the shape is in. In the OASIS Open Office
1490*b1cdbd2cSJim Jagielski     // file format the positioning attributes are correctly given in the layout
1491*b1cdbd2cSJim Jagielski     // direction the shape is in. Thus, this code provides the conversion from
1492*b1cdbd2cSJim Jagielski     // the OASIS Open Office file format to the OpenOffice.org file format.
1493*b1cdbd2cSJim Jagielski     if ( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 &&
1494*b1cdbd2cSJim Jagielski          xProps->getPropertySetInfo()->hasPropertyByName(
1495*b1cdbd2cSJim Jagielski             OUString(RTL_CONSTASCII_USTRINGPARAM("StartPositionInHoriL2R"))) &&
1496*b1cdbd2cSJim Jagielski          xProps->getPropertySetInfo()->hasPropertyByName(
1497*b1cdbd2cSJim Jagielski             OUString(RTL_CONSTASCII_USTRINGPARAM("EndPositionInHoriL2R"))) )
1498*b1cdbd2cSJim Jagielski     {
1499*b1cdbd2cSJim Jagielski         xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPositionInHoriL2R"))) >>= aStart;
1500*b1cdbd2cSJim Jagielski         xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPositionInHoriL2R"))) >>= aEnd;
1501*b1cdbd2cSJim Jagielski     }
1502*b1cdbd2cSJim Jagielski     else
1503*b1cdbd2cSJim Jagielski     {
1504*b1cdbd2cSJim Jagielski         xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition"))) >>= aStart;
1505*b1cdbd2cSJim Jagielski         xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition"))) >>= aEnd;
1506*b1cdbd2cSJim Jagielski     }
1507*b1cdbd2cSJim Jagielski     // <--
1508*b1cdbd2cSJim Jagielski 
1509*b1cdbd2cSJim Jagielski 	if( pRefPoint )
1510*b1cdbd2cSJim Jagielski 	{
1511*b1cdbd2cSJim Jagielski 		aStart.X -= pRefPoint->X;
1512*b1cdbd2cSJim Jagielski 		aStart.Y -= pRefPoint->Y;
1513*b1cdbd2cSJim Jagielski 		aEnd.X -= pRefPoint->X;
1514*b1cdbd2cSJim Jagielski 		aEnd.Y -= pRefPoint->Y;
1515*b1cdbd2cSJim Jagielski 	}
1516*b1cdbd2cSJim Jagielski 
1517*b1cdbd2cSJim Jagielski 	if( nFeatures & SEF_EXPORT_X )
1518*b1cdbd2cSJim Jagielski 	{
1519*b1cdbd2cSJim Jagielski 		// svg: x1
1520*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.X);
1521*b1cdbd2cSJim Jagielski 		aStr = sStringBuffer.makeStringAndClear();
1522*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X1, aStr);
1523*b1cdbd2cSJim Jagielski 	}
1524*b1cdbd2cSJim Jagielski 	else
1525*b1cdbd2cSJim Jagielski 	{
1526*b1cdbd2cSJim Jagielski 		aEnd.X -= aStart.X;
1527*b1cdbd2cSJim Jagielski 	}
1528*b1cdbd2cSJim Jagielski 
1529*b1cdbd2cSJim Jagielski 	if( nFeatures & SEF_EXPORT_Y )
1530*b1cdbd2cSJim Jagielski 	{
1531*b1cdbd2cSJim Jagielski 		// svg: y1
1532*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.Y);
1533*b1cdbd2cSJim Jagielski 		aStr = sStringBuffer.makeStringAndClear();
1534*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y1, aStr);
1535*b1cdbd2cSJim Jagielski 	}
1536*b1cdbd2cSJim Jagielski 	else
1537*b1cdbd2cSJim Jagielski 	{
1538*b1cdbd2cSJim Jagielski 		aEnd.Y -= aStart.Y;
1539*b1cdbd2cSJim Jagielski 	}
1540*b1cdbd2cSJim Jagielski 
1541*b1cdbd2cSJim Jagielski 	// svg: x2
1542*b1cdbd2cSJim Jagielski 	mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.X);
1543*b1cdbd2cSJim Jagielski 	aStr = sStringBuffer.makeStringAndClear();
1544*b1cdbd2cSJim Jagielski 	mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X2, aStr);
1545*b1cdbd2cSJim Jagielski 
1546*b1cdbd2cSJim Jagielski 	// svg: y2
1547*b1cdbd2cSJim Jagielski 	mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.Y);
1548*b1cdbd2cSJim Jagielski 	aStr = sStringBuffer.makeStringAndClear();
1549*b1cdbd2cSJim Jagielski 	mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y2, aStr);
1550*b1cdbd2cSJim Jagielski 
1551*b1cdbd2cSJim Jagielski 	// write measure shape
1552*b1cdbd2cSJim Jagielski 	sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1553*b1cdbd2cSJim Jagielski 	SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_MEASURE, bCreateNewline, sal_True);
1554*b1cdbd2cSJim Jagielski 
1555*b1cdbd2cSJim Jagielski 	ImpExportDescription( xShape ); // #i68101#
1556*b1cdbd2cSJim Jagielski 	ImpExportEvents( xShape );
1557*b1cdbd2cSJim Jagielski 	ImpExportGluePoints( xShape );
1558*b1cdbd2cSJim Jagielski 
1559*b1cdbd2cSJim Jagielski 	uno::Reference< text::XText > xText( xShape, uno::UNO_QUERY );
1560*b1cdbd2cSJim Jagielski 	if( xText.is() )
1561*b1cdbd2cSJim Jagielski 		mrExport.GetTextParagraphExport()->exportText( xText );
1562*b1cdbd2cSJim Jagielski }
1563*b1cdbd2cSJim Jagielski 
1564*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1565*b1cdbd2cSJim Jagielski 
1566*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportOLE2Shape(
1567*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1568*b1cdbd2cSJim Jagielski 	XmlShapeType eShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */,
1569*b1cdbd2cSJim Jagielski     SvXMLAttributeList* pAttrList /* = NULL */ )
1570*b1cdbd2cSJim Jagielski {
1571*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
1572*b1cdbd2cSJim Jagielski 	uno::Reference< container::XNamed > xNamed(xShape, uno::UNO_QUERY);
1573*b1cdbd2cSJim Jagielski 
1574*b1cdbd2cSJim Jagielski 	DBG_ASSERT( xPropSet.is() && xNamed.is(), "ole shape is not implementing needed interfaces");
1575*b1cdbd2cSJim Jagielski 	if(xPropSet.is() && xNamed.is())
1576*b1cdbd2cSJim Jagielski 	{
1577*b1cdbd2cSJim Jagielski 		// Transformation
1578*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
1579*b1cdbd2cSJim Jagielski 
1580*b1cdbd2cSJim Jagielski 		sal_Bool bIsEmptyPresObj = sal_False;
1581*b1cdbd2cSJim Jagielski 
1582*b1cdbd2cSJim Jagielski 		// presentation settings
1583*b1cdbd2cSJim Jagielski 		if(eShapeType == XmlShapeTypePresOLE2Shape)
1584*b1cdbd2cSJim Jagielski 			bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_OBJECT) );
1585*b1cdbd2cSJim Jagielski 		else if(eShapeType == XmlShapeTypePresChartShape)
1586*b1cdbd2cSJim Jagielski 			bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_CHART) );
1587*b1cdbd2cSJim Jagielski 		else if(eShapeType == XmlShapeTypePresSheetShape)
1588*b1cdbd2cSJim Jagielski 			bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_TABLE) );
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1591*b1cdbd2cSJim Jagielski 		sal_Bool bExportEmbedded(0 != (mrExport.getExportFlags() & EXPORT_EMBEDDED));
1592*b1cdbd2cSJim Jagielski 		OUString sPersistName;
1593*b1cdbd2cSJim Jagielski 		SvXMLElementExport aElement( mrExport, XML_NAMESPACE_DRAW,
1594*b1cdbd2cSJim Jagielski 								  XML_FRAME, bCreateNewline, sal_True );
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski 		const bool bSaveBackwardsCompatible = ( mrExport.getExportFlags() & EXPORT_SAVEBACKWARDCOMPATIBLE );
1597*b1cdbd2cSJim Jagielski 
1598*b1cdbd2cSJim Jagielski 		if( !bIsEmptyPresObj || bSaveBackwardsCompatible )
1599*b1cdbd2cSJim Jagielski 		{
1600*b1cdbd2cSJim Jagielski             if (pAttrList)
1601*b1cdbd2cSJim Jagielski             {
1602*b1cdbd2cSJim Jagielski                 mrExport.AddAttributeList(pAttrList);
1603*b1cdbd2cSJim Jagielski             }
1604*b1cdbd2cSJim Jagielski 
1605*b1cdbd2cSJim Jagielski 			OUString sClassId;
1606*b1cdbd2cSJim Jagielski 			OUString sURL;
1607*b1cdbd2cSJim Jagielski 			sal_Bool bInternal = false;
1608*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("IsInternal"))) >>= bInternal;
1609*b1cdbd2cSJim Jagielski 
1610*b1cdbd2cSJim Jagielski 			if( !bIsEmptyPresObj )
1611*b1cdbd2cSJim Jagielski 			{
1612*b1cdbd2cSJim Jagielski 
1613*b1cdbd2cSJim Jagielski 				if ( bInternal )
1614*b1cdbd2cSJim Jagielski 				{
1615*b1cdbd2cSJim Jagielski 					// OOo internal links have no storage persistance, URL is stored in the XML file
1616*b1cdbd2cSJim Jagielski 					// the result LinkURL is empty in case the object is not a link
1617*b1cdbd2cSJim Jagielski 					xPropSet->getPropertyValue( OUString::createFromAscii( "LinkURL" ) ) >>= sURL;
1618*b1cdbd2cSJim Jagielski 				}
1619*b1cdbd2cSJim Jagielski 
1620*b1cdbd2cSJim Jagielski 				xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ) ) >>= sPersistName;
1621*b1cdbd2cSJim Jagielski 				if ( !sURL.getLength() )
1622*b1cdbd2cSJim Jagielski 				{
1623*b1cdbd2cSJim Jagielski 					if( sPersistName.getLength() )
1624*b1cdbd2cSJim Jagielski 					{
1625*b1cdbd2cSJim Jagielski 						sURL = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ) );
1626*b1cdbd2cSJim Jagielski 						sURL += sPersistName;
1627*b1cdbd2cSJim Jagielski 					}
1628*b1cdbd2cSJim Jagielski 				}
1629*b1cdbd2cSJim Jagielski 
1630*b1cdbd2cSJim Jagielski 				if( !bInternal )
1631*b1cdbd2cSJim Jagielski 					xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID"))) >>= sClassId;
1632*b1cdbd2cSJim Jagielski 
1633*b1cdbd2cSJim Jagielski 				if( sClassId.getLength() )
1634*b1cdbd2cSJim Jagielski 					mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_CLASS_ID, sClassId );
1635*b1cdbd2cSJim Jagielski 				if(!bExportEmbedded)
1636*b1cdbd2cSJim Jagielski 				{
1637*b1cdbd2cSJim Jagielski 					// xlink:href
1638*b1cdbd2cSJim Jagielski 					if( sURL.getLength() )
1639*b1cdbd2cSJim Jagielski 					{
1640*b1cdbd2cSJim Jagielski 						// #96717# in theorie, if we don't have a url we shouldn't even
1641*b1cdbd2cSJim Jagielski 						// export this ole shape. But practical its to risky right now
1642*b1cdbd2cSJim Jagielski 						// to change this so we better dispose this on load
1643*b1cdbd2cSJim Jagielski 						sURL = mrExport.AddEmbeddedObject( sURL );
1644*b1cdbd2cSJim Jagielski 
1645*b1cdbd2cSJim Jagielski 						mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sURL );
1646*b1cdbd2cSJim Jagielski 						mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1647*b1cdbd2cSJim Jagielski 						mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1648*b1cdbd2cSJim Jagielski 						mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1649*b1cdbd2cSJim Jagielski 					}
1650*b1cdbd2cSJim Jagielski 				}
1651*b1cdbd2cSJim Jagielski 			}
1652*b1cdbd2cSJim Jagielski 			else
1653*b1cdbd2cSJim Jagielski 			{
1654*b1cdbd2cSJim Jagielski 				// export empty href for empty placeholders to be valid odf
1655*b1cdbd2cSJim Jagielski 				OUString sEmptyURL;
1656*b1cdbd2cSJim Jagielski 
1657*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sEmptyURL );
1658*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1659*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1660*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1661*b1cdbd2cSJim Jagielski 			}
1662*b1cdbd2cSJim Jagielski 
1663*b1cdbd2cSJim Jagielski 			enum XMLTokenEnum eElem = sClassId.getLength() ? XML_OBJECT_OLE : XML_OBJECT;
1664*b1cdbd2cSJim Jagielski 			SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, eElem, sal_True, sal_True );
1665*b1cdbd2cSJim Jagielski 
1666*b1cdbd2cSJim Jagielski             // #i118485# Add text export, the draw OLE shape allows text now
1667*b1cdbd2cSJim Jagielski             ImpExportText( xShape );
1668*b1cdbd2cSJim Jagielski 
1669*b1cdbd2cSJim Jagielski 			if(bExportEmbedded && !bIsEmptyPresObj)
1670*b1cdbd2cSJim Jagielski 			{
1671*b1cdbd2cSJim Jagielski 				// #100592#
1672*b1cdbd2cSJim Jagielski 				if(bInternal)
1673*b1cdbd2cSJim Jagielski 				{
1674*b1cdbd2cSJim Jagielski 					// embedded XML
1675*b1cdbd2cSJim Jagielski 					uno::Reference< lang::XComponent > xComp;
1676*b1cdbd2cSJim Jagielski 					xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ) >>= xComp;
1677*b1cdbd2cSJim Jagielski 					DBG_ASSERT( xComp.is(), "no xModel for own OLE format" );
1678*b1cdbd2cSJim Jagielski 					mrExport.ExportEmbeddedOwnObject( xComp );
1679*b1cdbd2cSJim Jagielski 				}
1680*b1cdbd2cSJim Jagielski 				else
1681*b1cdbd2cSJim Jagielski 				{
1682*b1cdbd2cSJim Jagielski 					// embed as Base64
1683*b1cdbd2cSJim Jagielski 					// this is an alien object ( currently MSOLE is the only supported type of such objects )
1684*b1cdbd2cSJim Jagielski 					// in case it is not an OASIS format the object should be asked to store replacement image if possible
1685*b1cdbd2cSJim Jagielski 
1686*b1cdbd2cSJim Jagielski 					::rtl::OUString sURLRequest( sURL );
1687*b1cdbd2cSJim Jagielski     				if ( ( mrExport.getExportFlags() & EXPORT_OASIS ) == 0 )
1688*b1cdbd2cSJim Jagielski 						sURLRequest += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "?oasis=false" ) );
1689*b1cdbd2cSJim Jagielski 					mrExport.AddEmbeddedObjectAsBase64( sURLRequest );
1690*b1cdbd2cSJim Jagielski 				}
1691*b1cdbd2cSJim Jagielski 			}
1692*b1cdbd2cSJim Jagielski 		}
1693*b1cdbd2cSJim Jagielski 		if( !bIsEmptyPresObj )
1694*b1cdbd2cSJim Jagielski 		{
1695*b1cdbd2cSJim Jagielski 			OUString sURL( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) );
1696*b1cdbd2cSJim Jagielski 			sURL += sPersistName;
1697*b1cdbd2cSJim Jagielski 			if( !bExportEmbedded )
1698*b1cdbd2cSJim Jagielski 			{
1699*b1cdbd2cSJim Jagielski 				sURL = GetExport().AddEmbeddedObject( sURL );
1700*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sURL );
1701*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1702*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1703*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1704*b1cdbd2cSJim Jagielski 			}
1705*b1cdbd2cSJim Jagielski 
1706*b1cdbd2cSJim Jagielski 			SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_DRAW,
1707*b1cdbd2cSJim Jagielski 									  XML_IMAGE, sal_False, sal_True );
1708*b1cdbd2cSJim Jagielski 
1709*b1cdbd2cSJim Jagielski 			if( bExportEmbedded )
1710*b1cdbd2cSJim Jagielski 				GetExport().AddEmbeddedObjectAsBase64( sURL );
1711*b1cdbd2cSJim Jagielski 		}
1712*b1cdbd2cSJim Jagielski 
1713*b1cdbd2cSJim Jagielski         ImpExportEvents( xShape );
1714*b1cdbd2cSJim Jagielski 		ImpExportGluePoints( xShape );
1715*b1cdbd2cSJim Jagielski 		ImpExportDescription( xShape ); // #i68101#
1716*b1cdbd2cSJim Jagielski 	}
1717*b1cdbd2cSJim Jagielski }
1718*b1cdbd2cSJim Jagielski 
1719*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1720*b1cdbd2cSJim Jagielski 
1721*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportPageShape(
1722*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1723*b1cdbd2cSJim Jagielski 	XmlShapeType eShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */)
1724*b1cdbd2cSJim Jagielski {
1725*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
1726*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
1727*b1cdbd2cSJim Jagielski 	{
1728*b1cdbd2cSJim Jagielski 		// #86163# Transformation
1729*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski 		// export page number used for this page
1732*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
1733*b1cdbd2cSJim Jagielski 		const OUString aPageNumberStr(RTL_CONSTASCII_USTRINGPARAM("PageNumber"));
1734*b1cdbd2cSJim Jagielski 		if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(aPageNumberStr))
1735*b1cdbd2cSJim Jagielski 		{
1736*b1cdbd2cSJim Jagielski 			sal_Int32 nPageNumber = 0;
1737*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue(aPageNumberStr) >>= nPageNumber;
1738*b1cdbd2cSJim Jagielski 			if( nPageNumber )
1739*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_PAGE_NUMBER, OUString::valueOf(nPageNumber));
1740*b1cdbd2cSJim Jagielski 		}
1741*b1cdbd2cSJim Jagielski 
1742*b1cdbd2cSJim Jagielski 		// a presentation page shape, normally used on notes pages only. If
1743*b1cdbd2cSJim Jagielski 		// it is used not as presentation shape, it may have been created with
1744*b1cdbd2cSJim Jagielski 		// copy-paste exchange between draw and impress (this IS possible...)
1745*b1cdbd2cSJim Jagielski 		if(eShapeType == XmlShapeTypePresPageShape)
1746*b1cdbd2cSJim Jagielski 		{
1747*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_CLASS,
1748*b1cdbd2cSJim Jagielski                                  XML_PRESENTATION_PAGE);
1749*b1cdbd2cSJim Jagielski 		}
1750*b1cdbd2cSJim Jagielski 
1751*b1cdbd2cSJim Jagielski 		// write Page shape
1752*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1753*b1cdbd2cSJim Jagielski 		SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_PAGE_THUMBNAIL, bCreateNewline, sal_True);
1754*b1cdbd2cSJim Jagielski 	}
1755*b1cdbd2cSJim Jagielski }
1756*b1cdbd2cSJim Jagielski 
1757*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1758*b1cdbd2cSJim Jagielski 
1759*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportCaptionShape(
1760*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1761*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */)
1762*b1cdbd2cSJim Jagielski {
1763*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
1764*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
1765*b1cdbd2cSJim Jagielski 	{
1766*b1cdbd2cSJim Jagielski 		// Transformation
1767*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
1768*b1cdbd2cSJim Jagielski 
1769*b1cdbd2cSJim Jagielski 		// evtl. corner radius?
1770*b1cdbd2cSJim Jagielski 		sal_Int32 nCornerRadius(0L);
1771*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius"))) >>= nCornerRadius;
1772*b1cdbd2cSJim Jagielski 		if(nCornerRadius)
1773*b1cdbd2cSJim Jagielski 		{
1774*b1cdbd2cSJim Jagielski 			OUStringBuffer sStringBuffer;
1775*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nCornerRadius);
1776*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_CORNER_RADIUS, sStringBuffer.makeStringAndClear());
1777*b1cdbd2cSJim Jagielski 		}
1778*b1cdbd2cSJim Jagielski 
1779*b1cdbd2cSJim Jagielski 		awt::Point aCaptionPoint;
1780*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "CaptionPoint" ) ) ) >>= aCaptionPoint;
1781*b1cdbd2cSJim Jagielski 
1782*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aCaptionPoint.X);
1783*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CAPTION_POINT_X, msBuffer.makeStringAndClear() );
1784*b1cdbd2cSJim Jagielski 		mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aCaptionPoint.Y);
1785*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CAPTION_POINT_Y, msBuffer.makeStringAndClear() );
1786*b1cdbd2cSJim Jagielski 
1787*b1cdbd2cSJim Jagielski 		// write Caption shape. Add export later.
1788*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1789*b1cdbd2cSJim Jagielski 		sal_Bool bAnnotation( (nFeatures & SEF_EXPORT_ANNOTATION) == SEF_EXPORT_ANNOTATION );
1790*b1cdbd2cSJim Jagielski 
1791*b1cdbd2cSJim Jagielski         SvXMLElementExport aObj( mrExport,
1792*b1cdbd2cSJim Jagielski 								 (bAnnotation ? XML_NAMESPACE_OFFICE
1793*b1cdbd2cSJim Jagielski 								 			  : XML_NAMESPACE_DRAW),
1794*b1cdbd2cSJim Jagielski 								 (bAnnotation ?	XML_ANNOTATION : XML_CAPTION),
1795*b1cdbd2cSJim Jagielski 								 bCreateNewline, sal_True );
1796*b1cdbd2cSJim Jagielski 
1797*b1cdbd2cSJim Jagielski 		ImpExportDescription( xShape ); // #i68101#
1798*b1cdbd2cSJim Jagielski 		ImpExportEvents( xShape );
1799*b1cdbd2cSJim Jagielski 		ImpExportGluePoints( xShape );
1800*b1cdbd2cSJim Jagielski 		if( bAnnotation )
1801*b1cdbd2cSJim Jagielski 			mrExport.exportAnnotationMeta( xShape );
1802*b1cdbd2cSJim Jagielski 		ImpExportText( xShape );
1803*b1cdbd2cSJim Jagielski 	}
1804*b1cdbd2cSJim Jagielski }
1805*b1cdbd2cSJim Jagielski 
1806*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1807*b1cdbd2cSJim Jagielski 
1808*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportFrameShape(
1809*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1810*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint)
1811*b1cdbd2cSJim Jagielski {
1812*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
1813*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
1814*b1cdbd2cSJim Jagielski 	{
1815*b1cdbd2cSJim Jagielski 		// Transformation
1816*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
1817*b1cdbd2cSJim Jagielski 
1818*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1819*b1cdbd2cSJim Jagielski 		SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW,
1820*b1cdbd2cSJim Jagielski 								  XML_FRAME, bCreateNewline, sal_True );
1821*b1cdbd2cSJim Jagielski 
1822*b1cdbd2cSJim Jagielski 		// export frame url
1823*b1cdbd2cSJim Jagielski 		OUString aStr;
1824*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameURL" ) ) ) >>= aStr;
1825*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(aStr) );
1826*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1827*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1828*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1829*b1cdbd2cSJim Jagielski 
1830*b1cdbd2cSJim Jagielski 		// export name
1831*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameName" ) ) ) >>= aStr;
1832*b1cdbd2cSJim Jagielski 		if( aStr.getLength() )
1833*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_FRAME_NAME, aStr );
1834*b1cdbd2cSJim Jagielski 
1835*b1cdbd2cSJim Jagielski 		// write floating frame
1836*b1cdbd2cSJim Jagielski 		{
1837*b1cdbd2cSJim Jagielski 			SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_FLOATING_FRAME, sal_True, sal_True);
1838*b1cdbd2cSJim Jagielski 		}
1839*b1cdbd2cSJim Jagielski 	}
1840*b1cdbd2cSJim Jagielski }
1841*b1cdbd2cSJim Jagielski 
1842*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1843*b1cdbd2cSJim Jagielski 
1844*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportAppletShape(
1845*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1846*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint)
1847*b1cdbd2cSJim Jagielski {
1848*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
1849*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
1850*b1cdbd2cSJim Jagielski 	{
1851*b1cdbd2cSJim Jagielski 		// Transformation
1852*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
1853*b1cdbd2cSJim Jagielski 
1854*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1855*b1cdbd2cSJim Jagielski 		SvXMLElementExport aElement( mrExport, XML_NAMESPACE_DRAW,
1856*b1cdbd2cSJim Jagielski 								  XML_FRAME, bCreateNewline, sal_True );
1857*b1cdbd2cSJim Jagielski 
1858*b1cdbd2cSJim Jagielski 		// export frame url
1859*b1cdbd2cSJim Jagielski 		OUString aStr;
1860*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCodeBase" ) ) ) >>= aStr;
1861*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(aStr) );
1862*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1863*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1864*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1865*b1cdbd2cSJim Jagielski 
1866*b1cdbd2cSJim Jagielski 		// export draw:applet-name
1867*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletName" ) ) ) >>= aStr;
1868*b1cdbd2cSJim Jagielski 		if( aStr.getLength() )
1869*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_APPLET_NAME, aStr );
1870*b1cdbd2cSJim Jagielski 
1871*b1cdbd2cSJim Jagielski 		// export draw:code
1872*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCode" ) ) ) >>= aStr;
1873*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CODE, aStr );
1874*b1cdbd2cSJim Jagielski 
1875*b1cdbd2cSJim Jagielski 		// export draw:may-script
1876*b1cdbd2cSJim Jagielski 		sal_Bool bIsScript = false;
1877*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletIsScript" ) ) ) >>= bIsScript;
1878*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MAY_SCRIPT, bIsScript ? XML_TRUE : XML_FALSE );
1879*b1cdbd2cSJim Jagielski 
1880*b1cdbd2cSJim Jagielski 		{
1881*b1cdbd2cSJim Jagielski 			// write applet
1882*b1cdbd2cSJim Jagielski 			SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_APPLET, sal_True, sal_True);
1883*b1cdbd2cSJim Jagielski 
1884*b1cdbd2cSJim Jagielski 			// export parameters
1885*b1cdbd2cSJim Jagielski 			uno::Sequence< beans::PropertyValue > aCommands;
1886*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCommands" ) ) ) >>= aCommands;
1887*b1cdbd2cSJim Jagielski 			const sal_Int32 nCount = aCommands.getLength();
1888*b1cdbd2cSJim Jagielski 			for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
1889*b1cdbd2cSJim Jagielski 			{
1890*b1cdbd2cSJim Jagielski 				aCommands[nIndex].Value >>= aStr;
1891*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aCommands[nIndex].Name );
1892*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, aStr );
1893*b1cdbd2cSJim Jagielski 				SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True );
1894*b1cdbd2cSJim Jagielski 			}
1895*b1cdbd2cSJim Jagielski 		}
1896*b1cdbd2cSJim Jagielski 	}
1897*b1cdbd2cSJim Jagielski }
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1900*b1cdbd2cSJim Jagielski 
1901*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportPluginShape(
1902*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1903*b1cdbd2cSJim Jagielski 	XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint)
1904*b1cdbd2cSJim Jagielski {
1905*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
1906*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
1907*b1cdbd2cSJim Jagielski 	{
1908*b1cdbd2cSJim Jagielski 		// Transformation
1909*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
1910*b1cdbd2cSJim Jagielski 
1911*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1912*b1cdbd2cSJim Jagielski 		SvXMLElementExport aElement( mrExport, XML_NAMESPACE_DRAW,
1913*b1cdbd2cSJim Jagielski 								  XML_FRAME, bCreateNewline, sal_True );
1914*b1cdbd2cSJim Jagielski 
1915*b1cdbd2cSJim Jagielski 		// export plugin url
1916*b1cdbd2cSJim Jagielski 		OUString aStr;
1917*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginURL" ) ) ) >>= aStr;
1918*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(aStr) );
1919*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1920*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1921*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1922*b1cdbd2cSJim Jagielski 
1923*b1cdbd2cSJim Jagielski 
1924*b1cdbd2cSJim Jagielski 		// export mime-type
1925*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginMimeType" ) ) ) >>= aStr;
1926*b1cdbd2cSJim Jagielski 		if(aStr.getLength())
1927*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MIME_TYPE, aStr );
1928*b1cdbd2cSJim Jagielski 
1929*b1cdbd2cSJim Jagielski 		{
1930*b1cdbd2cSJim Jagielski 			// write plugin
1931*b1cdbd2cSJim Jagielski 			SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_PLUGIN, sal_True, sal_True);
1932*b1cdbd2cSJim Jagielski 
1933*b1cdbd2cSJim Jagielski 			// export parameters
1934*b1cdbd2cSJim Jagielski 			uno::Sequence< beans::PropertyValue > aCommands;
1935*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginCommands" ) ) ) >>= aCommands;
1936*b1cdbd2cSJim Jagielski 			const sal_Int32 nCount = aCommands.getLength();
1937*b1cdbd2cSJim Jagielski 			for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
1938*b1cdbd2cSJim Jagielski 			{
1939*b1cdbd2cSJim Jagielski 				aCommands[nIndex].Value >>= aStr;
1940*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aCommands[nIndex].Name );
1941*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, aStr );
1942*b1cdbd2cSJim Jagielski 				SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True );
1943*b1cdbd2cSJim Jagielski 			}
1944*b1cdbd2cSJim Jagielski 		}
1945*b1cdbd2cSJim Jagielski 	}
1946*b1cdbd2cSJim Jagielski }
1947*b1cdbd2cSJim Jagielski 
1948*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1949*b1cdbd2cSJim Jagielski 
1950*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportMediaShape(
1951*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xShape,
1952*b1cdbd2cSJim Jagielski 	XmlShapeType eShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint)
1953*b1cdbd2cSJim Jagielski {
1954*b1cdbd2cSJim Jagielski 	const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
1955*b1cdbd2cSJim Jagielski 	if(xPropSet.is())
1956*b1cdbd2cSJim Jagielski 	{
1957*b1cdbd2cSJim Jagielski 		// Transformation
1958*b1cdbd2cSJim Jagielski 		ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
1959*b1cdbd2cSJim Jagielski 
1960*b1cdbd2cSJim Jagielski 		if(eShapeType == XmlShapeTypePresMediaShape)
1961*b1cdbd2cSJim Jagielski 			ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_OBJECT) );
1962*b1cdbd2cSJim Jagielski 
1963*b1cdbd2cSJim Jagielski 		sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
1964*b1cdbd2cSJim Jagielski 		SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW,
1965*b1cdbd2cSJim Jagielski 								  XML_FRAME, bCreateNewline, sal_True );
1966*b1cdbd2cSJim Jagielski 
1967*b1cdbd2cSJim Jagielski 		// export media url
1968*b1cdbd2cSJim Jagielski 		OUString aMediaURL;
1969*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ) ) >>= aMediaURL;
1970*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference( aMediaURL ) );
1971*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1972*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
1973*b1cdbd2cSJim Jagielski         mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
1974*b1cdbd2cSJim Jagielski 
1975*b1cdbd2cSJim Jagielski 		// export mime-type
1976*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MIME_TYPE, OUString( RTL_CONSTASCII_USTRINGPARAM( "application/vnd.sun.star.media" ) ) );
1977*b1cdbd2cSJim Jagielski 
1978*b1cdbd2cSJim Jagielski 		// write plugin
1979*b1cdbd2cSJim Jagielski 		SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_PLUGIN, !( nFeatures & SEF_EXPORT_NO_WS ), sal_True);
1980*b1cdbd2cSJim Jagielski 
1981*b1cdbd2cSJim Jagielski 		// export parameters
1982*b1cdbd2cSJim Jagielski 		const OUString aFalseStr( RTL_CONSTASCII_USTRINGPARAM( "false" ) ), aTrueStr( RTL_CONSTASCII_USTRINGPARAM( "true" ) );
1983*b1cdbd2cSJim Jagielski 
1984*b1cdbd2cSJim Jagielski 		sal_Bool bLoop = false;
1985*b1cdbd2cSJim Jagielski 		const OUString aLoopStr( RTL_CONSTASCII_USTRINGPARAM( "Loop" ) );
1986*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( aLoopStr ) >>= bLoop;
1987*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aLoopStr );
1988*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, bLoop ? aTrueStr : aFalseStr );
1989*b1cdbd2cSJim Jagielski 		delete( new SvXMLElementExport( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ) );
1990*b1cdbd2cSJim Jagielski 
1991*b1cdbd2cSJim Jagielski 		sal_Bool bMute = false;
1992*b1cdbd2cSJim Jagielski 		const OUString aMuteStr( RTL_CONSTASCII_USTRINGPARAM( "Mute" ) );
1993*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( aMuteStr ) >>= bMute;
1994*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aMuteStr );
1995*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, bMute ? aTrueStr : aFalseStr );
1996*b1cdbd2cSJim Jagielski 		delete( new SvXMLElementExport( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ) );
1997*b1cdbd2cSJim Jagielski 
1998*b1cdbd2cSJim Jagielski 		sal_Int16 nVolumeDB = 0;
1999*b1cdbd2cSJim Jagielski 		const OUString aVolumeDBStr( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ) );
2000*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ) ) ) >>= nVolumeDB;
2001*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aVolumeDBStr );
2002*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, OUString::valueOf( static_cast< sal_Int32 >( nVolumeDB ) ) );
2003*b1cdbd2cSJim Jagielski 		delete( new SvXMLElementExport( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ) );
2004*b1cdbd2cSJim Jagielski 
2005*b1cdbd2cSJim Jagielski 		media::ZoomLevel eZoom;
2006*b1cdbd2cSJim Jagielski 		const OUString aZoomStr( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ) );
2007*b1cdbd2cSJim Jagielski 		OUString aZoomValue;
2008*b1cdbd2cSJim Jagielski 		xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ) ) ) >>= eZoom;
2009*b1cdbd2cSJim Jagielski 		switch( eZoom )
2010*b1cdbd2cSJim Jagielski 		{
2011*b1cdbd2cSJim Jagielski 			case( media::ZoomLevel_ZOOM_1_TO_4 ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "25%" ) ); break;
2012*b1cdbd2cSJim Jagielski 			case( media::ZoomLevel_ZOOM_1_TO_2 ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "50%" ) ); break;
2013*b1cdbd2cSJim Jagielski 			case( media::ZoomLevel_ORIGINAL ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "100%" ) ); break;
2014*b1cdbd2cSJim Jagielski 			case( media::ZoomLevel_ZOOM_2_TO_1 ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "200%" ) ); break;
2015*b1cdbd2cSJim Jagielski 			case( media::ZoomLevel_ZOOM_4_TO_1 ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "400%" ) ); break;
2016*b1cdbd2cSJim Jagielski 		    case( media::ZoomLevel_FIT_TO_WINDOW ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "fit" ) ); break;
2017*b1cdbd2cSJim Jagielski 		    case( media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "fixedfit" ) ); break;
2018*b1cdbd2cSJim Jagielski 		    case( media::ZoomLevel_FULLSCREEN ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "fullscreen" ) ); break;
2019*b1cdbd2cSJim Jagielski 
2020*b1cdbd2cSJim Jagielski 			default:
2021*b1cdbd2cSJim Jagielski 			break;
2022*b1cdbd2cSJim Jagielski 		}
2023*b1cdbd2cSJim Jagielski 
2024*b1cdbd2cSJim Jagielski 		if( aZoomValue.getLength() )
2025*b1cdbd2cSJim Jagielski 		{
2026*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aZoomStr );
2027*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, aZoomValue );
2028*b1cdbd2cSJim Jagielski 			delete( new SvXMLElementExport( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ) );
2029*b1cdbd2cSJim Jagielski 		}
2030*b1cdbd2cSJim Jagielski 	}
2031*b1cdbd2cSJim Jagielski }
2032