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