1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*63bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*63bba73cSAndrew Rist  * distributed with this work for additional information
6*63bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*63bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*63bba73cSAndrew Rist  *
11*63bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*63bba73cSAndrew Rist  *
13*63bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist  * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*63bba73cSAndrew Rist  * specific language governing permissions and limitations
18*63bba73cSAndrew Rist  * under the License.
19*63bba73cSAndrew Rist  *
20*63bba73cSAndrew Rist  *************************************************************/
21*63bba73cSAndrew Rist 
22*63bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir #include <comphelper/extract.hxx>
27cdf0e10cSrcweir #include "ximp3dobject.hxx"
28cdf0e10cSrcweir #include <xmloff/XMLShapeStyleContext.hxx>
29cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
30cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
31cdf0e10cSrcweir #include <com/sun/star/drawing/PointSequenceSequence.hpp>
32cdf0e10cSrcweir #include <com/sun/star/drawing/PointSequence.hpp>
33cdf0e10cSrcweir #include "xexptran.hxx"
34cdf0e10cSrcweir #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
35cdf0e10cSrcweir #include <xmloff/families.hxx>
36cdf0e10cSrcweir #include "ximpstyl.hxx"
37cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
38cdf0e10cSrcweir #include <com/sun/star/drawing/PolyPolygonShape3D.hpp>
39cdf0e10cSrcweir #include <com/sun/star/drawing/DoubleSequence.hpp>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir using ::rtl::OUString;
42cdf0e10cSrcweir using ::rtl::OUStringBuffer;
43cdf0e10cSrcweir 
44cdf0e10cSrcweir using namespace ::com::sun::star;
45cdf0e10cSrcweir 
46cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
47cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
48cdf0e10cSrcweir 
49cdf0e10cSrcweir TYPEINIT1( SdXML3DObjectContext, SdXMLShapeContext );
50cdf0e10cSrcweir 
51cdf0e10cSrcweir SdXML3DObjectContext::SdXML3DObjectContext(
52cdf0e10cSrcweir 	SvXMLImport& rImport,
53cdf0e10cSrcweir 	sal_uInt16 nPrfx,
54cdf0e10cSrcweir 	const OUString& rLocalName,
55cdf0e10cSrcweir 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
56cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes,
57cdf0e10cSrcweir     sal_Bool bTemporaryShape)
58cdf0e10cSrcweir :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
59cdf0e10cSrcweir 	mbSetTransform( sal_False )
60cdf0e10cSrcweir {
61cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
62cdf0e10cSrcweir 	for(sal_Int16 i=0; i < nAttrCount; i++)
63cdf0e10cSrcweir 	{
64cdf0e10cSrcweir 		OUString sAttrName = xAttrList->getNameByIndex( i );
65cdf0e10cSrcweir 		OUString aLocalName;
66cdf0e10cSrcweir 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
67cdf0e10cSrcweir 		OUString sValue = xAttrList->getValueByIndex( i );
68cdf0e10cSrcweir 		const SvXMLTokenMap& rAttrTokenMap = GetImport().GetShapeImport()->Get3DObjectAttrTokenMap();
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 		switch(rAttrTokenMap.Get(nPrefix, aLocalName))
71cdf0e10cSrcweir 		{
72cdf0e10cSrcweir 			case XML_TOK_3DOBJECT_DRAWSTYLE_NAME:
73cdf0e10cSrcweir 			{
74cdf0e10cSrcweir 				maDrawStyleName = sValue;
75cdf0e10cSrcweir 				break;
76cdf0e10cSrcweir 			}
77cdf0e10cSrcweir 			case XML_TOK_3DOBJECT_TRANSFORM:
78cdf0e10cSrcweir 			{
79cdf0e10cSrcweir 				SdXMLImExTransform3D aTransform(sValue, GetImport().GetMM100UnitConverter());
80cdf0e10cSrcweir 				if(aTransform.NeedsAction())
81cdf0e10cSrcweir 					mbSetTransform = aTransform.GetFullHomogenTransform(mxHomMat);
82cdf0e10cSrcweir 				break;
83cdf0e10cSrcweir 			}
84cdf0e10cSrcweir 		}
85cdf0e10cSrcweir 	}
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
89cdf0e10cSrcweir 
90cdf0e10cSrcweir SdXML3DObjectContext::~SdXML3DObjectContext()
91cdf0e10cSrcweir {
92cdf0e10cSrcweir }
93cdf0e10cSrcweir 
94cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
95cdf0e10cSrcweir 
96cdf0e10cSrcweir void SdXML3DObjectContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
97cdf0e10cSrcweir {
98cdf0e10cSrcweir 	uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
99cdf0e10cSrcweir 	if(xPropSet.is())
100cdf0e10cSrcweir 	{
101cdf0e10cSrcweir 		// set parameters
102cdf0e10cSrcweir 		if(mbSetTransform)
103cdf0e10cSrcweir 		{
104cdf0e10cSrcweir 			uno::Any aAny;
105cdf0e10cSrcweir 			aAny <<= mxHomMat;
106cdf0e10cSrcweir 			xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("D3DTransformMatrix")), aAny);
107cdf0e10cSrcweir 		}
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 		// call parent
110cdf0e10cSrcweir 		SdXMLShapeContext::StartElement(xAttrList);
111cdf0e10cSrcweir 	}
112cdf0e10cSrcweir }
113cdf0e10cSrcweir 
114cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
115cdf0e10cSrcweir 
116cdf0e10cSrcweir void SdXML3DObjectContext::EndElement()
117cdf0e10cSrcweir {
118cdf0e10cSrcweir 	// call parent
119cdf0e10cSrcweir 	SdXMLShapeContext::EndElement();
120cdf0e10cSrcweir }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
123cdf0e10cSrcweir /*
124cdf0e10cSrcweir void SdXML3DObjectContext::AddShape(uno::Reference< drawing::XShape >& xShape)
125cdf0e10cSrcweir {
126cdf0e10cSrcweir 	if(xShape.is() && mxShapes.is())
127cdf0e10cSrcweir 	{
128cdf0e10cSrcweir 		// set shape local
129cdf0e10cSrcweir 		mxShape = xShape;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 		// add new shape to parent
132cdf0e10cSrcweir 		mxShapes->add( xShape );
133cdf0e10cSrcweir 	}
134cdf0e10cSrcweir }
135cdf0e10cSrcweir */
136cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
137cdf0e10cSrcweir /*
138cdf0e10cSrcweir void SdXML3DObjectContext::SetStyle()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir 	// set style on shape
141cdf0e10cSrcweir 	if(maDrawStyleName.getLength() && mxShape.is())
142cdf0e10cSrcweir 	{
143cdf0e10cSrcweir 		const SvXMLStyleContext* pStyle = 0L;
144cdf0e10cSrcweir 		sal_Bool bAutoStyle(sal_False);
145cdf0e10cSrcweir 
146cdf0e10cSrcweir 		if(GetImport().GetShapeImport()->GetAutoStylesContext())
147cdf0e10cSrcweir 			pStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(
148cdf0e10cSrcweir 			XML_STYLE_FAMILY_SD_GRAPHICS_ID, maDrawStyleName);
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 		if(pStyle)
151cdf0e10cSrcweir 			bAutoStyle = sal_True;
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 		if(!pStyle && GetImport().GetShapeImport()->GetStylesContext())
154cdf0e10cSrcweir 			pStyle = GetImport().GetShapeImport()->GetStylesContext()->
155cdf0e10cSrcweir 			FindStyleChildContext(XML_STYLE_FAMILY_SD_GRAPHICS_ID, maDrawStyleName);
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 		if(pStyle && pStyle->ISA(XMLShapeStyleContext))
158cdf0e10cSrcweir 		{
159cdf0e10cSrcweir 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
160cdf0e10cSrcweir 			if(xPropSet.is())
161cdf0e10cSrcweir 			{
162cdf0e10cSrcweir 				XMLShapeStyleContext* pDocStyle = (XMLShapeStyleContext*)pStyle;
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 				if(pDocStyle->GetStyle().is())
165cdf0e10cSrcweir 				{
166cdf0e10cSrcweir 					// set style on object
167cdf0e10cSrcweir 					uno::Any aAny;
168cdf0e10cSrcweir 					aAny <<= pDocStyle->GetStyle();
169cdf0e10cSrcweir 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Style")), aAny);
170cdf0e10cSrcweir 				}
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 				if(bAutoStyle)
173cdf0e10cSrcweir 				{
174cdf0e10cSrcweir 					// set PropertySet on object
175cdf0e10cSrcweir 					pDocStyle->FillPropertySet(xPropSet);
176cdf0e10cSrcweir 				}
177cdf0e10cSrcweir 			}
178cdf0e10cSrcweir 		}
179cdf0e10cSrcweir 	}
180cdf0e10cSrcweir }
181cdf0e10cSrcweir */
182cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
183cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
184cdf0e10cSrcweir 
185cdf0e10cSrcweir TYPEINIT1( SdXML3DCubeObjectShapeContext, SdXML3DObjectContext);
186cdf0e10cSrcweir 
187cdf0e10cSrcweir SdXML3DCubeObjectShapeContext::SdXML3DCubeObjectShapeContext(
188cdf0e10cSrcweir 	SvXMLImport& rImport,
189cdf0e10cSrcweir 	sal_uInt16 nPrfx,
190cdf0e10cSrcweir 	const OUString& rLocalName,
191cdf0e10cSrcweir 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
192cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes,
193cdf0e10cSrcweir     sal_Bool bTemporaryShape)
194cdf0e10cSrcweir :	SdXML3DObjectContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
195cdf0e10cSrcweir 	maMinEdge(-2500.0, -2500.0, -2500.0),
196cdf0e10cSrcweir 	maMaxEdge(2500.0, 2500.0, 2500.0),
197cdf0e10cSrcweir 	mbMinEdgeUsed(sal_False),
198cdf0e10cSrcweir 	mbMaxEdgeUsed(sal_False)
199cdf0e10cSrcweir {
200cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
201cdf0e10cSrcweir 	for(sal_Int16 i=0; i < nAttrCount; i++)
202cdf0e10cSrcweir 	{
203cdf0e10cSrcweir 		OUString sAttrName = xAttrList->getNameByIndex( i );
204cdf0e10cSrcweir 		OUString aLocalName;
205cdf0e10cSrcweir 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
206cdf0e10cSrcweir 		OUString sValue = xAttrList->getValueByIndex( i );
207cdf0e10cSrcweir 		const SvXMLTokenMap& rAttrTokenMap = GetImport().GetShapeImport()->Get3DCubeObjectAttrTokenMap();
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 		switch(rAttrTokenMap.Get(nPrefix, aLocalName))
210cdf0e10cSrcweir 		{
211cdf0e10cSrcweir 			case XML_TOK_3DCUBEOBJ_MINEDGE:
212cdf0e10cSrcweir 			{
213cdf0e10cSrcweir 				::basegfx::B3DVector aNewVec;
214cdf0e10cSrcweir 				GetImport().GetMM100UnitConverter().convertB3DVector(aNewVec, sValue);
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 				if(aNewVec != maMinEdge)
217cdf0e10cSrcweir 				{
218cdf0e10cSrcweir 					maMinEdge = aNewVec;
219cdf0e10cSrcweir 					mbMinEdgeUsed = sal_True;
220cdf0e10cSrcweir 				}
221cdf0e10cSrcweir 				break;
222cdf0e10cSrcweir 			}
223cdf0e10cSrcweir 			case XML_TOK_3DCUBEOBJ_MAXEDGE:
224cdf0e10cSrcweir 			{
225cdf0e10cSrcweir 				::basegfx::B3DVector aNewVec;
226cdf0e10cSrcweir 				GetImport().GetMM100UnitConverter().convertB3DVector(aNewVec, sValue);
227cdf0e10cSrcweir 
228cdf0e10cSrcweir 				if(aNewVec != maMaxEdge)
229cdf0e10cSrcweir 				{
230cdf0e10cSrcweir 					maMaxEdge = aNewVec;
231cdf0e10cSrcweir 					mbMaxEdgeUsed = sal_True;
232cdf0e10cSrcweir 				}
233cdf0e10cSrcweir 				break;
234cdf0e10cSrcweir 			}
235cdf0e10cSrcweir 		}
236cdf0e10cSrcweir 	}
237cdf0e10cSrcweir }
238cdf0e10cSrcweir 
239cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
240cdf0e10cSrcweir 
241cdf0e10cSrcweir SdXML3DCubeObjectShapeContext::~SdXML3DCubeObjectShapeContext()
242cdf0e10cSrcweir {
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
246cdf0e10cSrcweir 
247cdf0e10cSrcweir void SdXML3DCubeObjectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
248cdf0e10cSrcweir {
249cdf0e10cSrcweir 	// create shape
250cdf0e10cSrcweir 	AddShape( "com.sun.star.drawing.Shape3DCubeObject" );
251cdf0e10cSrcweir 	if(mxShape.is())
252cdf0e10cSrcweir 	{
253cdf0e10cSrcweir 		// add, set style and properties from base shape
254cdf0e10cSrcweir 		SetStyle();
255cdf0e10cSrcweir 		SdXML3DObjectContext::StartElement(xAttrList);
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 		// set local parameters on shape
258cdf0e10cSrcweir 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
259cdf0e10cSrcweir 		if(xPropSet.is())
260cdf0e10cSrcweir 		{
261cdf0e10cSrcweir 			// set parameters
262cdf0e10cSrcweir 			drawing::Position3D aPosition3D;
263cdf0e10cSrcweir 			drawing::Direction3D aDirection3D;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 			// convert from min, max to size to be set
266cdf0e10cSrcweir 			maMaxEdge = maMaxEdge - maMinEdge;
267cdf0e10cSrcweir 
268cdf0e10cSrcweir 			aPosition3D.PositionX = maMinEdge.getX();
269cdf0e10cSrcweir 			aPosition3D.PositionY = maMinEdge.getY();
270cdf0e10cSrcweir 			aPosition3D.PositionZ = maMinEdge.getZ();
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 			aDirection3D.DirectionX = maMaxEdge.getX();
273cdf0e10cSrcweir 			aDirection3D.DirectionY = maMaxEdge.getY();
274cdf0e10cSrcweir 			aDirection3D.DirectionZ = maMaxEdge.getZ();
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 			uno::Any aAny;
277cdf0e10cSrcweir 			aAny <<= aPosition3D;
278cdf0e10cSrcweir 			xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("D3DPosition")), aAny);
279cdf0e10cSrcweir 			aAny <<= aDirection3D;
280cdf0e10cSrcweir 			xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("D3DSize")), aAny);
281cdf0e10cSrcweir 		}
282cdf0e10cSrcweir 	}
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
285cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
286cdf0e10cSrcweir 
287cdf0e10cSrcweir void SdXML3DCubeObjectShapeContext::EndElement()
288cdf0e10cSrcweir {
289cdf0e10cSrcweir 	// call parent
290cdf0e10cSrcweir 	SdXML3DObjectContext::EndElement();
291cdf0e10cSrcweir }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
294cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
295cdf0e10cSrcweir 
296cdf0e10cSrcweir TYPEINIT1( SdXML3DSphereObjectShapeContext, SdXML3DObjectContext);
297cdf0e10cSrcweir 
298cdf0e10cSrcweir SdXML3DSphereObjectShapeContext::SdXML3DSphereObjectShapeContext(
299cdf0e10cSrcweir 	SvXMLImport& rImport,
300cdf0e10cSrcweir 	sal_uInt16 nPrfx,
301cdf0e10cSrcweir 	const OUString& rLocalName,
302cdf0e10cSrcweir 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
303cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes,
304cdf0e10cSrcweir     sal_Bool bTemporaryShape)
305cdf0e10cSrcweir :	SdXML3DObjectContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
306cdf0e10cSrcweir 	maCenter(0.0, 0.0, 0.0),
307cdf0e10cSrcweir 	maSize(5000.0, 5000.0, 5000.0),
308cdf0e10cSrcweir 	mbCenterUsed(sal_False),
309cdf0e10cSrcweir 	mbSizeUsed(sal_False)
310cdf0e10cSrcweir {
311cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
312cdf0e10cSrcweir 	for(sal_Int16 i=0; i < nAttrCount; i++)
313cdf0e10cSrcweir 	{
314cdf0e10cSrcweir 		OUString sAttrName = xAttrList->getNameByIndex( i );
315cdf0e10cSrcweir 		OUString aLocalName;
316cdf0e10cSrcweir 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
317cdf0e10cSrcweir 		OUString sValue = xAttrList->getValueByIndex( i );
318cdf0e10cSrcweir 		const SvXMLTokenMap& rAttrTokenMap = GetImport().GetShapeImport()->Get3DSphereObjectAttrTokenMap();
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 		switch(rAttrTokenMap.Get(nPrefix, aLocalName))
321cdf0e10cSrcweir 		{
322cdf0e10cSrcweir 			case XML_TOK_3DSPHEREOBJ_CENTER:
323cdf0e10cSrcweir 			{
324cdf0e10cSrcweir 				::basegfx::B3DVector aNewVec;
325cdf0e10cSrcweir 				GetImport().GetMM100UnitConverter().convertB3DVector(aNewVec, sValue);
326cdf0e10cSrcweir 
327cdf0e10cSrcweir 				if(aNewVec != maCenter)
328cdf0e10cSrcweir 				{
329cdf0e10cSrcweir 					maCenter = aNewVec;
330cdf0e10cSrcweir 					mbCenterUsed = sal_True;
331cdf0e10cSrcweir 				}
332cdf0e10cSrcweir 				break;
333cdf0e10cSrcweir 			}
334cdf0e10cSrcweir 			case XML_TOK_3DSPHEREOBJ_SIZE:
335cdf0e10cSrcweir 			{
336cdf0e10cSrcweir 				::basegfx::B3DVector aNewVec;
337cdf0e10cSrcweir 				GetImport().GetMM100UnitConverter().convertB3DVector(aNewVec, sValue);
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 				if(aNewVec != maSize)
340cdf0e10cSrcweir 				{
341cdf0e10cSrcweir 					maSize = aNewVec;
342cdf0e10cSrcweir 					mbSizeUsed = sal_True;
343cdf0e10cSrcweir 				}
344cdf0e10cSrcweir 				break;
345cdf0e10cSrcweir 			}
346cdf0e10cSrcweir 		}
347cdf0e10cSrcweir 	}
348cdf0e10cSrcweir }
349cdf0e10cSrcweir 
350cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
351cdf0e10cSrcweir 
352cdf0e10cSrcweir SdXML3DSphereObjectShapeContext::~SdXML3DSphereObjectShapeContext()
353cdf0e10cSrcweir {
354cdf0e10cSrcweir }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
357cdf0e10cSrcweir 
358cdf0e10cSrcweir void SdXML3DSphereObjectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
359cdf0e10cSrcweir {
360cdf0e10cSrcweir 	// create shape
361cdf0e10cSrcweir 	AddShape( "com.sun.star.drawing.Shape3DSphereObject" );
362cdf0e10cSrcweir 	if(mxShape.is())
363cdf0e10cSrcweir 	{
364cdf0e10cSrcweir 		// add, set style and properties from base shape
365cdf0e10cSrcweir 		SetStyle();
366cdf0e10cSrcweir 		SdXML3DObjectContext::StartElement(xAttrList);
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 		// set local parameters on shape
369cdf0e10cSrcweir 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
370cdf0e10cSrcweir 		if(xPropSet.is())
371cdf0e10cSrcweir 		{
372cdf0e10cSrcweir 			// set parameters
373cdf0e10cSrcweir 			drawing::Position3D aPosition3D;
374cdf0e10cSrcweir 			drawing::Direction3D aDirection3D;
375cdf0e10cSrcweir 
376cdf0e10cSrcweir 			aPosition3D.PositionX = maCenter.getX();
377cdf0e10cSrcweir 			aPosition3D.PositionY = maCenter.getY();
378cdf0e10cSrcweir 			aPosition3D.PositionZ = maCenter.getZ();
379cdf0e10cSrcweir 
380cdf0e10cSrcweir 			aDirection3D.DirectionX = maSize.getX();
381cdf0e10cSrcweir 			aDirection3D.DirectionY = maSize.getY();
382cdf0e10cSrcweir 			aDirection3D.DirectionZ = maSize.getZ();
383cdf0e10cSrcweir 
384cdf0e10cSrcweir 			uno::Any aAny;
385cdf0e10cSrcweir 			aAny <<= aPosition3D;
386cdf0e10cSrcweir 			xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("D3DPosition")), aAny);
387cdf0e10cSrcweir 			aAny <<= aDirection3D;
388cdf0e10cSrcweir 			xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("D3DSize")), aAny);
389cdf0e10cSrcweir 		}
390cdf0e10cSrcweir 	}
391cdf0e10cSrcweir }
392cdf0e10cSrcweir 
393cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
394cdf0e10cSrcweir 
395cdf0e10cSrcweir void SdXML3DSphereObjectShapeContext::EndElement()
396cdf0e10cSrcweir {
397cdf0e10cSrcweir 	// call parent
398cdf0e10cSrcweir 	SdXML3DObjectContext::EndElement();
399cdf0e10cSrcweir }
400cdf0e10cSrcweir 
401cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
402cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
403cdf0e10cSrcweir 
404cdf0e10cSrcweir TYPEINIT1( SdXML3DPolygonBasedShapeContext, SdXML3DObjectContext );
405cdf0e10cSrcweir 
406cdf0e10cSrcweir SdXML3DPolygonBasedShapeContext::SdXML3DPolygonBasedShapeContext(
407cdf0e10cSrcweir 	SvXMLImport& rImport,
408cdf0e10cSrcweir 	sal_uInt16 nPrfx,
409cdf0e10cSrcweir 	const OUString& rLocalName,
410cdf0e10cSrcweir 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
411cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes,
412cdf0e10cSrcweir     sal_Bool bTemporaryShape)
413cdf0e10cSrcweir :	SdXML3DObjectContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
414cdf0e10cSrcweir {
415cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
416cdf0e10cSrcweir 	for(sal_Int16 i=0; i < nAttrCount; i++)
417cdf0e10cSrcweir 	{
418cdf0e10cSrcweir 		OUString sAttrName = xAttrList->getNameByIndex( i );
419cdf0e10cSrcweir 		OUString aLocalName;
420cdf0e10cSrcweir 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
421cdf0e10cSrcweir 		OUString sValue = xAttrList->getValueByIndex( i );
422cdf0e10cSrcweir 		const SvXMLTokenMap& rAttrTokenMap = GetImport().GetShapeImport()->Get3DPolygonBasedAttrTokenMap();
423cdf0e10cSrcweir 
424cdf0e10cSrcweir 		switch(rAttrTokenMap.Get(nPrefix, aLocalName))
425cdf0e10cSrcweir 		{
426cdf0e10cSrcweir 			case XML_TOK_3DPOLYGONBASED_VIEWBOX:
427cdf0e10cSrcweir 			{
428cdf0e10cSrcweir 				maViewBox = sValue;
429cdf0e10cSrcweir 				break;
430cdf0e10cSrcweir 			}
431cdf0e10cSrcweir 			case XML_TOK_3DPOLYGONBASED_D:
432cdf0e10cSrcweir 			{
433cdf0e10cSrcweir 				maPoints = sValue;
434cdf0e10cSrcweir 				break;
435cdf0e10cSrcweir 			}
436cdf0e10cSrcweir 		}
437cdf0e10cSrcweir 	}
438cdf0e10cSrcweir }
439cdf0e10cSrcweir 
440cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
441cdf0e10cSrcweir 
442cdf0e10cSrcweir SdXML3DPolygonBasedShapeContext::~SdXML3DPolygonBasedShapeContext()
443cdf0e10cSrcweir {
444cdf0e10cSrcweir }
445cdf0e10cSrcweir 
446cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
447cdf0e10cSrcweir 
448cdf0e10cSrcweir void SdXML3DPolygonBasedShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
449cdf0e10cSrcweir {
450cdf0e10cSrcweir 	uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
451cdf0e10cSrcweir 	if(xPropSet.is())
452cdf0e10cSrcweir 	{
453cdf0e10cSrcweir 		// set parameters
454cdf0e10cSrcweir 		if(maPoints.getLength() && maViewBox.getLength())
455cdf0e10cSrcweir 		{
456cdf0e10cSrcweir 			SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
457cdf0e10cSrcweir 			awt::Point aMinPoint(aViewBox.GetX(), aViewBox.GetY());
458cdf0e10cSrcweir 			awt::Size aMaxSize(aViewBox.GetWidth(), aViewBox.GetHeight());
459cdf0e10cSrcweir 			SdXMLImExSvgDElement aPoints(maPoints, aViewBox,
460cdf0e10cSrcweir 				aMinPoint, aMaxSize, GetImport().GetMM100UnitConverter());
461cdf0e10cSrcweir 
462cdf0e10cSrcweir 			// convert to double sequences
463cdf0e10cSrcweir 			drawing::PointSequenceSequence& xPoSeSe =
464cdf0e10cSrcweir 				(drawing::PointSequenceSequence&)aPoints.GetPointSequenceSequence();
465cdf0e10cSrcweir 			sal_Int32 nOuterSequenceCount = xPoSeSe.getLength();
466cdf0e10cSrcweir 			drawing::PointSequence* pInnerSequence = xPoSeSe.getArray();
467cdf0e10cSrcweir 
468cdf0e10cSrcweir 			drawing::PolyPolygonShape3D xPolyPolygon3D;
469cdf0e10cSrcweir 			xPolyPolygon3D.SequenceX.realloc(nOuterSequenceCount);
470cdf0e10cSrcweir 			xPolyPolygon3D.SequenceY.realloc(nOuterSequenceCount);
471cdf0e10cSrcweir 			xPolyPolygon3D.SequenceZ.realloc(nOuterSequenceCount);
472cdf0e10cSrcweir 			drawing::DoubleSequence* pOuterSequenceX = xPolyPolygon3D.SequenceX.getArray();
473cdf0e10cSrcweir 			drawing::DoubleSequence* pOuterSequenceY = xPolyPolygon3D.SequenceY.getArray();
474cdf0e10cSrcweir 			drawing::DoubleSequence* pOuterSequenceZ = xPolyPolygon3D.SequenceZ.getArray();
475cdf0e10cSrcweir 
476cdf0e10cSrcweir 			for(sal_Int32 a(0L); a < nOuterSequenceCount; a++)
477cdf0e10cSrcweir 			{
478cdf0e10cSrcweir 				sal_Int32 nInnerSequenceCount(pInnerSequence->getLength());
479cdf0e10cSrcweir 				awt::Point* pArray = pInnerSequence->getArray();
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 				pOuterSequenceX->realloc(nInnerSequenceCount);
482cdf0e10cSrcweir 				pOuterSequenceY->realloc(nInnerSequenceCount);
483cdf0e10cSrcweir 				pOuterSequenceZ->realloc(nInnerSequenceCount);
484cdf0e10cSrcweir 				double* pInnerSequenceX = pOuterSequenceX->getArray();
485cdf0e10cSrcweir 				double* pInnerSequenceY = pOuterSequenceY->getArray();
486cdf0e10cSrcweir 				double* pInnerSequenceZ = pOuterSequenceZ->getArray();
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 				for(sal_Int32 b(0L); b < nInnerSequenceCount; b++)
489cdf0e10cSrcweir 				{
490cdf0e10cSrcweir 					*pInnerSequenceX++ = pArray->X;
491cdf0e10cSrcweir 					*pInnerSequenceY++ = pArray->Y;
492cdf0e10cSrcweir 					*pInnerSequenceZ++ = 0.0;
493cdf0e10cSrcweir 					pArray++;
494cdf0e10cSrcweir 				}
495cdf0e10cSrcweir 				pInnerSequence++;
496cdf0e10cSrcweir 
497cdf0e10cSrcweir 				pOuterSequenceX++;
498cdf0e10cSrcweir 				pOuterSequenceY++;
499cdf0e10cSrcweir 				pOuterSequenceZ++;
500cdf0e10cSrcweir 			}
501cdf0e10cSrcweir 
502cdf0e10cSrcweir 			// set poly
503cdf0e10cSrcweir 			uno::Any aAny;
504cdf0e10cSrcweir 			aAny <<= xPolyPolygon3D;
505cdf0e10cSrcweir 			xPropSet->setPropertyValue(
506cdf0e10cSrcweir 				OUString(RTL_CONSTASCII_USTRINGPARAM("D3DPolyPolygon3D")), aAny);
507cdf0e10cSrcweir 		}
508cdf0e10cSrcweir 
509cdf0e10cSrcweir 		// call parent
510cdf0e10cSrcweir 		SdXML3DObjectContext::StartElement(xAttrList);
511cdf0e10cSrcweir 	}
512cdf0e10cSrcweir }
513cdf0e10cSrcweir 
514cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
515cdf0e10cSrcweir 
516cdf0e10cSrcweir void SdXML3DPolygonBasedShapeContext::EndElement()
517cdf0e10cSrcweir {
518cdf0e10cSrcweir 	// call parent
519cdf0e10cSrcweir 	SdXML3DObjectContext::EndElement();
520cdf0e10cSrcweir }
521cdf0e10cSrcweir 
522cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
523cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
524cdf0e10cSrcweir 
525cdf0e10cSrcweir TYPEINIT1( SdXML3DLatheObjectShapeContext, SdXML3DPolygonBasedShapeContext);
526cdf0e10cSrcweir 
527cdf0e10cSrcweir SdXML3DLatheObjectShapeContext::SdXML3DLatheObjectShapeContext(
528cdf0e10cSrcweir 	SvXMLImport& rImport,
529cdf0e10cSrcweir 	sal_uInt16 nPrfx,
530cdf0e10cSrcweir 	const OUString& rLocalName,
531cdf0e10cSrcweir 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
532cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes,
533cdf0e10cSrcweir     sal_Bool bTemporaryShape)
534cdf0e10cSrcweir :	SdXML3DPolygonBasedShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
535cdf0e10cSrcweir {
536cdf0e10cSrcweir }
537cdf0e10cSrcweir 
538cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
539cdf0e10cSrcweir 
540cdf0e10cSrcweir SdXML3DLatheObjectShapeContext::~SdXML3DLatheObjectShapeContext()
541cdf0e10cSrcweir {
542cdf0e10cSrcweir }
543cdf0e10cSrcweir 
544cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
545cdf0e10cSrcweir 
546cdf0e10cSrcweir void SdXML3DLatheObjectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
547cdf0e10cSrcweir {
548cdf0e10cSrcweir 	// create shape
549cdf0e10cSrcweir 	AddShape( "com.sun.star.drawing.Shape3DLatheObject" );
550cdf0e10cSrcweir 	if(mxShape.is())
551cdf0e10cSrcweir 	{
552cdf0e10cSrcweir 		// add, set style and properties from base shape
553cdf0e10cSrcweir 		SetStyle();
554cdf0e10cSrcweir 		SdXML3DPolygonBasedShapeContext::StartElement(xAttrList);
555cdf0e10cSrcweir 	}
556cdf0e10cSrcweir }
557cdf0e10cSrcweir 
558cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
559cdf0e10cSrcweir 
560cdf0e10cSrcweir void SdXML3DLatheObjectShapeContext::EndElement()
561cdf0e10cSrcweir {
562cdf0e10cSrcweir 	// call parent
563cdf0e10cSrcweir 	SdXML3DPolygonBasedShapeContext::EndElement();
564cdf0e10cSrcweir }
565cdf0e10cSrcweir 
566cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
567cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
568cdf0e10cSrcweir 
569cdf0e10cSrcweir TYPEINIT1( SdXML3DExtrudeObjectShapeContext, SdXML3DPolygonBasedShapeContext);
570cdf0e10cSrcweir 
571cdf0e10cSrcweir SdXML3DExtrudeObjectShapeContext::SdXML3DExtrudeObjectShapeContext(
572cdf0e10cSrcweir 	SvXMLImport& rImport,
573cdf0e10cSrcweir 	sal_uInt16 nPrfx,
574cdf0e10cSrcweir 	const OUString& rLocalName,
575cdf0e10cSrcweir 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
576cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes,
577cdf0e10cSrcweir     sal_Bool bTemporaryShape)
578cdf0e10cSrcweir :	SdXML3DPolygonBasedShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
579cdf0e10cSrcweir {
580cdf0e10cSrcweir }
581cdf0e10cSrcweir 
582cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
583cdf0e10cSrcweir 
584cdf0e10cSrcweir SdXML3DExtrudeObjectShapeContext::~SdXML3DExtrudeObjectShapeContext()
585cdf0e10cSrcweir {
586cdf0e10cSrcweir }
587cdf0e10cSrcweir 
588cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
589cdf0e10cSrcweir 
590cdf0e10cSrcweir void SdXML3DExtrudeObjectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
591cdf0e10cSrcweir {
592cdf0e10cSrcweir 	AddShape( "com.sun.star.drawing.Shape3DExtrudeObject" );
593cdf0e10cSrcweir 	if(mxShape.is())
594cdf0e10cSrcweir 	{
595cdf0e10cSrcweir 		// add, set style and properties from base shape
596cdf0e10cSrcweir 		SetStyle();
597cdf0e10cSrcweir 		SdXML3DPolygonBasedShapeContext::StartElement(xAttrList);
598cdf0e10cSrcweir 	}
599cdf0e10cSrcweir }
600cdf0e10cSrcweir 
601cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
602cdf0e10cSrcweir 
603cdf0e10cSrcweir void SdXML3DExtrudeObjectShapeContext::EndElement()
604cdf0e10cSrcweir {
605cdf0e10cSrcweir 	// call parent
606cdf0e10cSrcweir 	SdXML3DPolygonBasedShapeContext::EndElement();
607cdf0e10cSrcweir }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir // EOF
610