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 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <memory>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "unointerfacetouniqueidentifiermapper.hxx"
30*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/ClickAction.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XChartDocument.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XControlShape.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/style/XStyle.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XGluePointsSupplier.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIdentifierAccess.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/GluePoint2.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/Alignment.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/EscapeDirection.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/table/XColumnRowRange.hpp>
43*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
44*b1cdbd2cSJim Jagielski #include "PropertySetMerger.hxx"
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski #include <xmloff/shapeexport.hxx>
47*b1cdbd2cSJim Jagielski #include "sdpropls.hxx"
48*b1cdbd2cSJim Jagielski #include "sdxmlexp_impl.hxx"
49*b1cdbd2cSJim Jagielski #include <xmloff/families.hxx>
50*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
51*b1cdbd2cSJim Jagielski #include <xmloff/contextid.hxx>
52*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
53*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
54*b1cdbd2cSJim Jagielski #include <sot/clsids.hxx>
55*b1cdbd2cSJim Jagielski #include <tools/globname.hxx>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyState.hpp>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XCustomShapeEngine.hpp>
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski using ::rtl::OUString;
65*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
68*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
71*b1cdbd2cSJim Jagielski 
XMLShapeExport(SvXMLExport & rExp,SvXMLExportPropertyMapper * pExtMapper)72*b1cdbd2cSJim Jagielski XMLShapeExport::XMLShapeExport(SvXMLExport& rExp,
73*b1cdbd2cSJim Jagielski 								SvXMLExportPropertyMapper *pExtMapper )
74*b1cdbd2cSJim Jagielski :	mrExport( rExp ),
75*b1cdbd2cSJim Jagielski 	mnNextUniqueShapeId(1),
76*b1cdbd2cSJim Jagielski     maShapesInfos(),
77*b1cdbd2cSJim Jagielski     maCurrentShapesIter(maShapesInfos.end()),
78*b1cdbd2cSJim Jagielski 	mbExportLayer( sal_False ),
79*b1cdbd2cSJim Jagielski 	// #88546# init to sal_False
80*b1cdbd2cSJim Jagielski 	mbHandleProgressBar( sal_False ),
81*b1cdbd2cSJim Jagielski 	msZIndex( RTL_CONSTASCII_USTRINGPARAM("ZOrder") ),
82*b1cdbd2cSJim Jagielski 	msPrintable( RTL_CONSTASCII_USTRINGPARAM("Printable") ),
83*b1cdbd2cSJim Jagielski 	msVisible( RTL_CONSTASCII_USTRINGPARAM("Visible") ),
84*b1cdbd2cSJim Jagielski 	msEmptyPres( RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ),
85*b1cdbd2cSJim Jagielski 	msModel( RTL_CONSTASCII_USTRINGPARAM("Model") ),
86*b1cdbd2cSJim Jagielski 	msStartShape( RTL_CONSTASCII_USTRINGPARAM("StartShape") ),
87*b1cdbd2cSJim Jagielski 	msEndShape( RTL_CONSTASCII_USTRINGPARAM("EndShape") ),
88*b1cdbd2cSJim Jagielski 	msOnClick( RTL_CONSTASCII_USTRINGPARAM("OnClick") ),
89*b1cdbd2cSJim Jagielski #ifdef ISSUE66550_HLINK_FOR_SHAPES
90*b1cdbd2cSJim Jagielski 	msOnAction( RTL_CONSTASCII_USTRINGPARAM("OnAction") ),
91*b1cdbd2cSJim Jagielski 	msAction( RTL_CONSTASCII_USTRINGPARAM("Action") ),
92*b1cdbd2cSJim Jagielski 	msURL( RTL_CONSTASCII_USTRINGPARAM("URL") ),
93*b1cdbd2cSJim Jagielski #endif
94*b1cdbd2cSJim Jagielski 	msEventType( RTL_CONSTASCII_USTRINGPARAM("EventType") ),
95*b1cdbd2cSJim Jagielski 	msPresentation( RTL_CONSTASCII_USTRINGPARAM("Presentation") ),
96*b1cdbd2cSJim Jagielski 	msMacroName( RTL_CONSTASCII_USTRINGPARAM("MacroName") ),
97*b1cdbd2cSJim Jagielski 	msScript( RTL_CONSTASCII_USTRINGPARAM("Script") ),
98*b1cdbd2cSJim Jagielski 	msLibrary( RTL_CONSTASCII_USTRINGPARAM("Library") ),
99*b1cdbd2cSJim Jagielski 	msClickAction( RTL_CONSTASCII_USTRINGPARAM("ClickAction") ),
100*b1cdbd2cSJim Jagielski 	msBookmark( RTL_CONSTASCII_USTRINGPARAM("Bookmark") ),
101*b1cdbd2cSJim Jagielski 	msEffect( RTL_CONSTASCII_USTRINGPARAM("Effect") ),
102*b1cdbd2cSJim Jagielski 	msPlayFull( RTL_CONSTASCII_USTRINGPARAM("PlayFull") ),
103*b1cdbd2cSJim Jagielski 	msVerb( RTL_CONSTASCII_USTRINGPARAM("Verb") ),
104*b1cdbd2cSJim Jagielski 	msSoundURL( RTL_CONSTASCII_USTRINGPARAM("SoundURL") ),
105*b1cdbd2cSJim Jagielski 	msSpeed( RTL_CONSTASCII_USTRINGPARAM("Speed") ),
106*b1cdbd2cSJim Jagielski 	msStarBasic( RTL_CONSTASCII_USTRINGPARAM("StarBasic") )
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski 	// construct PropertyHandlerFactory
109*b1cdbd2cSJim Jagielski 	mxSdPropHdlFactory = new XMLSdPropHdlFactory( mrExport.GetModel(), rExp );
110*b1cdbd2cSJim Jagielski 	// construct PropertySetMapper
111*b1cdbd2cSJim Jagielski 	mxPropertySetMapper = CreateShapePropMapper( mrExport );
112*b1cdbd2cSJim Jagielski 	if( pExtMapper )
113*b1cdbd2cSJim Jagielski 	{
114*b1cdbd2cSJim Jagielski 		UniReference < SvXMLExportPropertyMapper > xExtMapper( pExtMapper );
115*b1cdbd2cSJim Jagielski 		mxPropertySetMapper->ChainExportMapper( xExtMapper );
116*b1cdbd2cSJim Jagielski 	}
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski /*
119*b1cdbd2cSJim Jagielski 	// chain text attributes
120*b1cdbd2cSJim Jagielski 	xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(rExp));
121*b1cdbd2cSJim Jagielski */
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 	mrExport.GetAutoStylePool()->AddFamily(
124*b1cdbd2cSJim Jagielski 		XML_STYLE_FAMILY_SD_GRAPHICS_ID,
125*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)),
126*b1cdbd2cSJim Jagielski 		GetPropertySetMapper(),
127*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_PREFIX)));
128*b1cdbd2cSJim Jagielski 	mrExport.GetAutoStylePool()->AddFamily(
129*b1cdbd2cSJim Jagielski 		XML_STYLE_FAMILY_SD_PRESENTATION_ID,
130*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME)),
131*b1cdbd2cSJim Jagielski 		GetPropertySetMapper(),
132*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_PREFIX)));
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	maCurrentInfo = maShapeInfos.end();
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 	// create table export helper and let him add his families in time
137*b1cdbd2cSJim Jagielski 	GetShapeTableExport();
138*b1cdbd2cSJim Jagielski }
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
141*b1cdbd2cSJim Jagielski 
~XMLShapeExport()142*b1cdbd2cSJim Jagielski XMLShapeExport::~XMLShapeExport()
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski // sj: replacing CustomShapes with standard objects that are also supported in OpenOffice.org format
checkForCustomShapeReplacement(const uno::Reference<drawing::XShape> & xShape)149*b1cdbd2cSJim Jagielski uno::Reference< drawing::XShape > XMLShapeExport::checkForCustomShapeReplacement( const uno::Reference< drawing::XShape >& xShape )
150*b1cdbd2cSJim Jagielski {
151*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShape > xCustomShapeReplacement;
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 	if( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 )
154*b1cdbd2cSJim Jagielski 	{
155*b1cdbd2cSJim Jagielski 		String aType( (OUString)xShape->getShapeType() );
156*b1cdbd2cSJim Jagielski         if( aType.EqualsAscii( (const sal_Char*)"com.sun.star.drawing.CustomShape" ) )
157*b1cdbd2cSJim Jagielski 		{
158*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY );
159*b1cdbd2cSJim Jagielski 			if( xSet.is() )
160*b1cdbd2cSJim Jagielski 			{
161*b1cdbd2cSJim Jagielski 				rtl::OUString aEngine;
162*b1cdbd2cSJim Jagielski 				xSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "CustomShapeEngine" ) ) ) >>= aEngine;
163*b1cdbd2cSJim Jagielski 				if ( !aEngine.getLength() )
164*b1cdbd2cSJim Jagielski 					aEngine = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.EnhancedCustomShapeEngine" ) );
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski 				uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
167*b1cdbd2cSJim Jagielski 		/*
168*b1cdbd2cSJim Jagielski 				uno::Reference< drawing::XShape > aXShape = GetXShapeForSdrObject( (SdrObjCustomShape*)pCustomShape );
169*b1cdbd2cSJim Jagielski 				if ( !aXShape.is() )
170*b1cdbd2cSJim Jagielski 					aXShape = new SvxCustomShape( (SdrObjCustomShape*)pCustomShape );
171*b1cdbd2cSJim Jagielski 		*/
172*b1cdbd2cSJim Jagielski 				if ( aEngine.getLength() && xFactory.is() )
173*b1cdbd2cSJim Jagielski 				{
174*b1cdbd2cSJim Jagielski 					uno::Sequence< uno::Any > aArgument( 1 );
175*b1cdbd2cSJim Jagielski 					uno::Sequence< beans::PropertyValue > aPropValues( 2 );
176*b1cdbd2cSJim Jagielski 					aPropValues[ 0 ].Name = rtl::OUString::createFromAscii( "CustomShape" );
177*b1cdbd2cSJim Jagielski 					aPropValues[ 0 ].Value <<= xShape;
178*b1cdbd2cSJim Jagielski 					sal_Bool bForceGroupWithText = sal_True;
179*b1cdbd2cSJim Jagielski 					aPropValues[ 1 ].Name = rtl::OUString::createFromAscii( "ForceGroupWithText" );
180*b1cdbd2cSJim Jagielski 					aPropValues[ 1 ].Value <<= bForceGroupWithText;
181*b1cdbd2cSJim Jagielski 					aArgument[ 0 ] <<= aPropValues;
182*b1cdbd2cSJim Jagielski 					uno::Reference< uno::XInterface > xInterface( xFactory->createInstanceWithArguments( aEngine, aArgument ) );
183*b1cdbd2cSJim Jagielski 					if ( xInterface.is() )
184*b1cdbd2cSJim Jagielski 					{
185*b1cdbd2cSJim Jagielski 						uno::Reference< drawing::XCustomShapeEngine > xCustomShapeEngine(
186*b1cdbd2cSJim Jagielski 							uno::Reference< drawing::XCustomShapeEngine >( xInterface, uno::UNO_QUERY ) );
187*b1cdbd2cSJim Jagielski 						if ( xCustomShapeEngine.is() )
188*b1cdbd2cSJim Jagielski 							xCustomShapeReplacement = xCustomShapeEngine->render();
189*b1cdbd2cSJim Jagielski 					}
190*b1cdbd2cSJim Jagielski 				}
191*b1cdbd2cSJim Jagielski 			}
192*b1cdbd2cSJim Jagielski 		}
193*b1cdbd2cSJim Jagielski 	}
194*b1cdbd2cSJim Jagielski 	return xCustomShapeReplacement;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski // This method collects all automatic styles for the given XShape
collectShapeAutoStyles(const uno::Reference<drawing::XShape> & xShape)198*b1cdbd2cSJim Jagielski void XMLShapeExport::collectShapeAutoStyles(const uno::Reference< drawing::XShape >& xShape )
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski 	if( maCurrentShapesIter == maShapesInfos.end() )
201*b1cdbd2cSJim Jagielski 	{
202*b1cdbd2cSJim Jagielski 		DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): no call to seekShapes()!" );
203*b1cdbd2cSJim Jagielski 		return;
204*b1cdbd2cSJim Jagielski 	}
205*b1cdbd2cSJim Jagielski 	sal_Int32 nZIndex = 0;
206*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY );
207*b1cdbd2cSJim Jagielski 	if( xSet.is() )
208*b1cdbd2cSJim Jagielski 		xSet->getPropertyValue(msZIndex) >>= nZIndex;
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 	ImplXMLShapeExportInfoVector& aShapeInfoVector = (*maCurrentShapesIter).second;
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 	if( (sal_Int32)aShapeInfoVector.size() <= nZIndex )
213*b1cdbd2cSJim Jagielski 	{
214*b1cdbd2cSJim Jagielski 		DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): no shape info allocated for a given shape" );
215*b1cdbd2cSJim Jagielski 		return;
216*b1cdbd2cSJim Jagielski 	}
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 	ImplXMLShapeExportInfo& aShapeInfo = aShapeInfoVector[nZIndex];
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShape > xCustomShapeReplacement = checkForCustomShapeReplacement( xShape );
221*b1cdbd2cSJim Jagielski 	if ( xCustomShapeReplacement.is() )
222*b1cdbd2cSJim Jagielski 		aShapeInfo.xCustomShapeReplacement = xCustomShapeReplacement;
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 	// -----------------------------
225*b1cdbd2cSJim Jagielski 	// first compute the shapes type
226*b1cdbd2cSJim Jagielski 	// -----------------------------
227*b1cdbd2cSJim Jagielski 	ImpCalcShapeType(xShape, aShapeInfo.meShapeType);
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski     // #i118485# enabled XmlShapeTypeDrawChartShape and XmlShapeTypeDrawOLE2Shape
230*b1cdbd2cSJim Jagielski     // to have text
231*b1cdbd2cSJim Jagielski 	const bool bObjSupportsText =
232*b1cdbd2cSJim Jagielski //		aShapeInfo.meShapeType != XmlShapeTypeDrawControlShape &&
233*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypePresChartShape &&
234*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypePresOLE2Shape &&
235*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDrawSheetShape &&
236*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypePresSheetShape &&
237*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDraw3DSceneObject &&
238*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDraw3DCubeObject &&
239*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDraw3DSphereObject &&
240*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDraw3DLatheObject &&
241*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDraw3DExtrudeObject &&
242*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDrawPageShape &&
243*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypePresPageShape &&
244*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDrawGroupShape;
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 	const bool bObjSupportsStyle =
247*b1cdbd2cSJim Jagielski 		aShapeInfo.meShapeType != XmlShapeTypeDrawGroupShape;
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 	sal_Bool bIsEmptyPresObj = sal_False;
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
252*b1cdbd2cSJim Jagielski 	if ( aShapeInfo.xCustomShapeReplacement.is() )
253*b1cdbd2cSJim Jagielski 		xPropSet.clear();
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 	// ----------------
256*b1cdbd2cSJim Jagielski 	// prep text styles
257*b1cdbd2cSJim Jagielski 	// ----------------
258*b1cdbd2cSJim Jagielski 	if( xPropSet.is() && bObjSupportsText )
259*b1cdbd2cSJim Jagielski 	{
260*b1cdbd2cSJim Jagielski 		uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY);
261*b1cdbd2cSJim Jagielski 		if(xText.is() && xText->getString().getLength())
262*b1cdbd2cSJim Jagielski 		{
263*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 			if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(msEmptyPres) )
266*b1cdbd2cSJim Jagielski 			{
267*b1cdbd2cSJim Jagielski 				uno::Any aAny = xPropSet->getPropertyValue(msEmptyPres);
268*b1cdbd2cSJim Jagielski 				aAny >>= bIsEmptyPresObj;
269*b1cdbd2cSJim Jagielski 			}
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 			if(!bIsEmptyPresObj)
272*b1cdbd2cSJim Jagielski 			{
273*b1cdbd2cSJim Jagielski 				GetExport().GetTextParagraphExport()->collectTextAutoStyles( xText );
274*b1cdbd2cSJim Jagielski 			}
275*b1cdbd2cSJim Jagielski 		}
276*b1cdbd2cSJim Jagielski 	}
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 	// ------------------------------
279*b1cdbd2cSJim Jagielski 	// compute the shape parent style
280*b1cdbd2cSJim Jagielski 	// ------------------------------
281*b1cdbd2cSJim Jagielski 	if( xPropSet.is() )
282*b1cdbd2cSJim Jagielski 	{
283*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySetInfo > xPropertySetInfo( xPropSet->getPropertySetInfo() );
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 		OUString aParentName;
286*b1cdbd2cSJim Jagielski 		uno::Reference< style::XStyle > xStyle;
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 		if( bObjSupportsStyle )
289*b1cdbd2cSJim Jagielski 		{
290*b1cdbd2cSJim Jagielski 			if( xPropertySetInfo.is() && xPropertySetInfo->hasPropertyByName( OUString(RTL_CONSTASCII_USTRINGPARAM("Style"))) )
291*b1cdbd2cSJim Jagielski 				xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Style"))) >>= xStyle;
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 			if(xStyle.is())
294*b1cdbd2cSJim Jagielski 			{
295*b1cdbd2cSJim Jagielski 				// get family ID
296*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySet > xStylePropSet(xStyle, uno::UNO_QUERY);
297*b1cdbd2cSJim Jagielski 				DBG_ASSERT( xStylePropSet.is(), "style without a XPropertySet?" );
298*b1cdbd2cSJim Jagielski                 try
299*b1cdbd2cSJim Jagielski                 {
300*b1cdbd2cSJim Jagielski 				    if(xStylePropSet.is())
301*b1cdbd2cSJim Jagielski 				    {
302*b1cdbd2cSJim Jagielski 					    OUString aFamilyName;
303*b1cdbd2cSJim Jagielski     					xStylePropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Family"))) >>= aFamilyName;
304*b1cdbd2cSJim Jagielski 	    				if(aFamilyName.getLength() && !aFamilyName.equals(OUString(RTL_CONSTASCII_USTRINGPARAM("graphics"))))
305*b1cdbd2cSJim Jagielski 		    				aShapeInfo.mnFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID;
306*b1cdbd2cSJim Jagielski 			    	}
307*b1cdbd2cSJim Jagielski                 }
308*b1cdbd2cSJim Jagielski                 catch(beans::UnknownPropertyException aException)
309*b1cdbd2cSJim Jagielski                 {
310*b1cdbd2cSJim Jagielski                     // Ignored.
311*b1cdbd2cSJim Jagielski                     DBG_ASSERT(false,
312*b1cdbd2cSJim Jagielski                         "XMLShapeExport::collectShapeAutoStyles: style has no 'Family' property");
313*b1cdbd2cSJim Jagielski                 }
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 				// get parent-style name
316*b1cdbd2cSJim Jagielski 				if(XML_STYLE_FAMILY_SD_PRESENTATION_ID == aShapeInfo.mnFamily)
317*b1cdbd2cSJim Jagielski 				{
318*b1cdbd2cSJim Jagielski 					aParentName = msPresentationStylePrefix;
319*b1cdbd2cSJim Jagielski 				}
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski 				aParentName += xStyle->getName();
322*b1cdbd2cSJim Jagielski 			}
323*b1cdbd2cSJim Jagielski 		}
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 		// filter propset
326*b1cdbd2cSJim Jagielski 		std::vector< XMLPropertyState > xPropStates;
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 		sal_Int32 nCount = 0;
329*b1cdbd2cSJim Jagielski 		if( (!bIsEmptyPresObj || (aShapeInfo.meShapeType != XmlShapeTypePresPageShape)) )
330*b1cdbd2cSJim Jagielski 		{
331*b1cdbd2cSJim Jagielski 			xPropStates = GetPropertySetMapper()->Filter( xPropSet );
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 			if (XmlShapeTypeDrawControlShape == aShapeInfo.meShapeType)
334*b1cdbd2cSJim Jagielski 			{
335*b1cdbd2cSJim Jagielski 				// for control shapes, we additionally need the number format style (if any)
336*b1cdbd2cSJim Jagielski 				uno::Reference< drawing::XControlShape > xControl(xShape, uno::UNO_QUERY);
337*b1cdbd2cSJim Jagielski 				DBG_ASSERT(xControl.is(), "XMLShapeExport::collectShapeAutoStyles: ShapeType control, but no XControlShape!");
338*b1cdbd2cSJim Jagielski 				if (xControl.is())
339*b1cdbd2cSJim Jagielski 				{
340*b1cdbd2cSJim Jagielski 					uno::Reference< beans::XPropertySet > xControlModel(xControl->getControl(), uno::UNO_QUERY);
341*b1cdbd2cSJim Jagielski 					DBG_ASSERT(xControlModel.is(), "XMLShapeExport::collectShapeAutoStyles: no control model on the control shape!");
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski 					::rtl::OUString sNumberStyle = mrExport.GetFormExport()->getControlNumberStyle(xControlModel);
344*b1cdbd2cSJim Jagielski 					if (0 != sNumberStyle.getLength())
345*b1cdbd2cSJim Jagielski 					{
346*b1cdbd2cSJim Jagielski 						sal_Int32 nIndex = GetPropertySetMapper()->getPropertySetMapper()->FindEntryIndex(CTF_SD_CONTROL_SHAPE_DATA_STYLE);
347*b1cdbd2cSJim Jagielski 							// TODO : this retrieval of the index could be moved into the ctor, holding the index
348*b1cdbd2cSJim Jagielski 							//			as member, thus saving time.
349*b1cdbd2cSJim Jagielski 						DBG_ASSERT(-1 != nIndex, "XMLShapeExport::collectShapeAutoStyles: could not obtain the index for our context id!");
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski 						XMLPropertyState aNewState(nIndex, uno::makeAny(sNumberStyle));
352*b1cdbd2cSJim Jagielski 						xPropStates.push_back(aNewState);
353*b1cdbd2cSJim Jagielski 					}
354*b1cdbd2cSJim Jagielski 				}
355*b1cdbd2cSJim Jagielski 			}
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 			std::vector< XMLPropertyState >::iterator aIter = xPropStates.begin();
358*b1cdbd2cSJim Jagielski 			std::vector< XMLPropertyState >::iterator aEnd = xPropStates.end();
359*b1cdbd2cSJim Jagielski 			while( aIter != aEnd )
360*b1cdbd2cSJim Jagielski 			{
361*b1cdbd2cSJim Jagielski 				if( aIter->mnIndex != -1 )
362*b1cdbd2cSJim Jagielski 					nCount++;
363*b1cdbd2cSJim Jagielski 				aIter++;
364*b1cdbd2cSJim Jagielski 			}
365*b1cdbd2cSJim Jagielski 		}
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 		if(nCount == 0)
368*b1cdbd2cSJim Jagielski 		{
369*b1cdbd2cSJim Jagielski 			// no hard attributes, use parent style name for export
370*b1cdbd2cSJim Jagielski 			aShapeInfo.msStyleName = aParentName;
371*b1cdbd2cSJim Jagielski 		}
372*b1cdbd2cSJim Jagielski 		else
373*b1cdbd2cSJim Jagielski 		{
374*b1cdbd2cSJim Jagielski 			// there are filtered properties -> hard attributes
375*b1cdbd2cSJim Jagielski 			// try to find this style in AutoStylePool
376*b1cdbd2cSJim Jagielski 			aShapeInfo.msStyleName = mrExport.GetAutoStylePool()->Find(aShapeInfo.mnFamily, aParentName, xPropStates);
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski 			if(!aShapeInfo.msStyleName.getLength())
379*b1cdbd2cSJim Jagielski 			{
380*b1cdbd2cSJim Jagielski 				// Style did not exist, add it to AutoStalePool
381*b1cdbd2cSJim Jagielski 				aShapeInfo.msStyleName = mrExport.GetAutoStylePool()->Add(aShapeInfo.mnFamily, aParentName, xPropStates);
382*b1cdbd2cSJim Jagielski 			}
383*b1cdbd2cSJim Jagielski 		}
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 		// optionaly generate auto style for text attributes
386*b1cdbd2cSJim Jagielski 		if( (!bIsEmptyPresObj || (aShapeInfo.meShapeType != XmlShapeTypePresPageShape)) && bObjSupportsText )
387*b1cdbd2cSJim Jagielski 		{
388*b1cdbd2cSJim Jagielski 			xPropStates = GetExport().GetTextParagraphExport()->GetParagraphPropertyMapper()->Filter( xPropSet );
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 			// ----------------------------------------------------------------------
391*b1cdbd2cSJim Jagielski 			// yet more additionally, we need to care for the ParaAdjust property
392*b1cdbd2cSJim Jagielski 			if ( XmlShapeTypeDrawControlShape == aShapeInfo.meShapeType )
393*b1cdbd2cSJim Jagielski 			{
394*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
395*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertyState > xPropState( xPropSet, uno::UNO_QUERY );
396*b1cdbd2cSJim Jagielski                 if ( xPropSetInfo.is() && xPropState.is() )
397*b1cdbd2cSJim Jagielski                 {
398*b1cdbd2cSJim Jagielski 				    // this is because:
399*b1cdbd2cSJim Jagielski 				    // * if controls shapes have a ParaAdjust property, then this is the Align property of the control model
400*b1cdbd2cSJim Jagielski 				    // * control models are allowed to have an Align of "void"
401*b1cdbd2cSJim Jagielski 				    // * the Default for control model's Align is TextAlign_LEFT
402*b1cdbd2cSJim Jagielski 				    // * defaults for style properties are not written, but we need to write the "left",
403*b1cdbd2cSJim Jagielski 				    //   because we need to distiguish this "left" from the case where not align attribute
404*b1cdbd2cSJim Jagielski 				    //   is present which means "void"
405*b1cdbd2cSJim Jagielski 				    // 102407 - 2002-11-01 - fs@openoffice.org
406*b1cdbd2cSJim Jagielski 				    static const ::rtl::OUString s_sParaAdjustPropertyName( RTL_CONSTASCII_USTRINGPARAM( "ParaAdjust" ) );
407*b1cdbd2cSJim Jagielski 				    if  (   xPropSetInfo->hasPropertyByName( s_sParaAdjustPropertyName )
408*b1cdbd2cSJim Jagielski                         &&  ( beans::PropertyState_DEFAULT_VALUE == xPropState->getPropertyState( s_sParaAdjustPropertyName ) )
409*b1cdbd2cSJim Jagielski                         )
410*b1cdbd2cSJim Jagielski 					{
411*b1cdbd2cSJim Jagielski 						sal_Int32 nIndex = GetExport().GetTextParagraphExport()->GetParagraphPropertyMapper()->getPropertySetMapper()->FindEntryIndex( CTF_SD_SHAPE_PARA_ADJUST );
412*b1cdbd2cSJim Jagielski 							// TODO : this retrieval of the index should be moved into the ctor, holding the index
413*b1cdbd2cSJim Jagielski 							//			as member, thus saving time.
414*b1cdbd2cSJim Jagielski 						DBG_ASSERT(-1 != nIndex, "XMLShapeExport::collectShapeAutoStyles: could not obtain the index for the ParaAdjust context id!");
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 						uno::Any aParaAdjustValue = xPropSet->getPropertyValue( s_sParaAdjustPropertyName );
417*b1cdbd2cSJim Jagielski 						XMLPropertyState aAlignDefaultState( nIndex, aParaAdjustValue );
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 						xPropStates.push_back( aAlignDefaultState );
420*b1cdbd2cSJim Jagielski 					}
421*b1cdbd2cSJim Jagielski                 }
422*b1cdbd2cSJim Jagielski 			}
423*b1cdbd2cSJim Jagielski 			// ----------------------------------------------------------------------
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 			nCount = 0;
426*b1cdbd2cSJim Jagielski 			std::vector< XMLPropertyState >::iterator aIter = xPropStates.begin();
427*b1cdbd2cSJim Jagielski 			std::vector< XMLPropertyState >::iterator aEnd = xPropStates.end();
428*b1cdbd2cSJim Jagielski 			while( aIter != aEnd )
429*b1cdbd2cSJim Jagielski 			{
430*b1cdbd2cSJim Jagielski 				if( aIter->mnIndex != -1 )
431*b1cdbd2cSJim Jagielski 					nCount++;
432*b1cdbd2cSJim Jagielski 				aIter++;
433*b1cdbd2cSJim Jagielski 			}
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski 			if( nCount )
436*b1cdbd2cSJim Jagielski 			{
437*b1cdbd2cSJim Jagielski 				const OUString aEmpty;
438*b1cdbd2cSJim Jagielski 				aShapeInfo.msTextStyleName = mrExport.GetAutoStylePool()->Find( XML_STYLE_FAMILY_TEXT_PARAGRAPH, aEmpty, xPropStates );
439*b1cdbd2cSJim Jagielski 				if(!aShapeInfo.msTextStyleName.getLength())
440*b1cdbd2cSJim Jagielski 				{
441*b1cdbd2cSJim Jagielski 					// Style did not exist, add it to AutoStalePool
442*b1cdbd2cSJim Jagielski 					aShapeInfo.msTextStyleName = mrExport.GetAutoStylePool()->Add(XML_STYLE_FAMILY_TEXT_PARAGRAPH, aEmpty, xPropStates);
443*b1cdbd2cSJim Jagielski 				}
444*b1cdbd2cSJim Jagielski 			}
445*b1cdbd2cSJim Jagielski 		}
446*b1cdbd2cSJim Jagielski 	}
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 	// ----------------------------------------
449*b1cdbd2cSJim Jagielski 	// prepare animation informations if needed
450*b1cdbd2cSJim Jagielski 	// ----------------------------------------
451*b1cdbd2cSJim Jagielski 	if( mxAnimationsExporter.is() )
452*b1cdbd2cSJim Jagielski 		mxAnimationsExporter->prepare( xShape, mrExport );
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski 	// check for special shapes
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski 	switch( aShapeInfo.meShapeType )
457*b1cdbd2cSJim Jagielski 	{
458*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawConnectorShape:
459*b1cdbd2cSJim Jagielski 		{
460*b1cdbd2cSJim Jagielski 			uno::Reference< uno::XInterface > xConnection;
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 			// create shape ids for export later
463*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue( msStartShape ) >>= xConnection;
464*b1cdbd2cSJim Jagielski 			if( xConnection.is() )
465*b1cdbd2cSJim Jagielski 				mrExport.getInterfaceToIdentifierMapper().registerReference( xConnection );
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 			xPropSet->getPropertyValue( msEndShape ) >>= xConnection;
468*b1cdbd2cSJim Jagielski 			if( xConnection.is() )
469*b1cdbd2cSJim Jagielski 				mrExport.getInterfaceToIdentifierMapper().registerReference( xConnection );
470*b1cdbd2cSJim Jagielski 			break;
471*b1cdbd2cSJim Jagielski 		}
472*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresTableShape:
473*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawTableShape:
474*b1cdbd2cSJim Jagielski 		{
475*b1cdbd2cSJim Jagielski 			try
476*b1cdbd2cSJim Jagielski 			{
477*b1cdbd2cSJim Jagielski 				uno::Reference< table::XColumnRowRange > xRange( xSet->getPropertyValue( msModel ), uno::UNO_QUERY_THROW );
478*b1cdbd2cSJim Jagielski 				GetShapeTableExport()->collectTableAutoStyles( xRange );
479*b1cdbd2cSJim Jagielski 			}
480*b1cdbd2cSJim Jagielski 			catch( uno::Exception& )
481*b1cdbd2cSJim Jagielski 			{
482*b1cdbd2cSJim Jagielski 				DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): exception caught while collection auto styles for a table!" );
483*b1cdbd2cSJim Jagielski 			}
484*b1cdbd2cSJim Jagielski 			break;
485*b1cdbd2cSJim Jagielski 		}
486*b1cdbd2cSJim Jagielski 		default:
487*b1cdbd2cSJim Jagielski 			break;
488*b1cdbd2cSJim Jagielski 	}
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski 	maShapeInfos.push_back( aShapeInfo );
491*b1cdbd2cSJim Jagielski 	maCurrentInfo = maShapeInfos.begin();
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------
494*b1cdbd2cSJim Jagielski 	// check for shape collections (group shape or 3d scene)
495*b1cdbd2cSJim Jagielski 	// and collect contained shapes style infos
496*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------
497*b1cdbd2cSJim Jagielski 	const uno::Reference< drawing::XShape >& xCollection = aShapeInfo.xCustomShapeReplacement.is()
498*b1cdbd2cSJim Jagielski 												? aShapeInfo.xCustomShapeReplacement : xShape;
499*b1cdbd2cSJim Jagielski 	{
500*b1cdbd2cSJim Jagielski 		uno::Reference< drawing::XShapes > xShapes( xCollection, uno::UNO_QUERY );
501*b1cdbd2cSJim Jagielski 		if( xShapes.is() )
502*b1cdbd2cSJim Jagielski 		{
503*b1cdbd2cSJim Jagielski 			collectShapesAutoStyles( xShapes );
504*b1cdbd2cSJim Jagielski 		}
505*b1cdbd2cSJim Jagielski 	}
506*b1cdbd2cSJim Jagielski }
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski // --> OD 2008-05-08 #refactorlists#
511*b1cdbd2cSJim Jagielski namespace
512*b1cdbd2cSJim Jagielski {
513*b1cdbd2cSJim Jagielski     class NewTextListsHelper
514*b1cdbd2cSJim Jagielski     {
515*b1cdbd2cSJim Jagielski         public:
NewTextListsHelper(SvXMLExport & rExp)516*b1cdbd2cSJim Jagielski             NewTextListsHelper( SvXMLExport& rExp )
517*b1cdbd2cSJim Jagielski                 : mrExport( rExp )
518*b1cdbd2cSJim Jagielski             {
519*b1cdbd2cSJim Jagielski                 mrExport.GetTextParagraphExport()->PushNewTextListsHelper();
520*b1cdbd2cSJim Jagielski             }
521*b1cdbd2cSJim Jagielski 
~NewTextListsHelper()522*b1cdbd2cSJim Jagielski             ~NewTextListsHelper()
523*b1cdbd2cSJim Jagielski             {
524*b1cdbd2cSJim Jagielski                 mrExport.GetTextParagraphExport()->PopTextListsHelper();
525*b1cdbd2cSJim Jagielski             }
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski         private:
528*b1cdbd2cSJim Jagielski             SvXMLExport& mrExport;
529*b1cdbd2cSJim Jagielski     };
530*b1cdbd2cSJim Jagielski }
531*b1cdbd2cSJim Jagielski // This method exports the given XShape
exportShape(const uno::Reference<drawing::XShape> & xShape,sal_Int32 nFeatures,com::sun::star::awt::Point * pRefPoint,SvXMLAttributeList * pAttrList)532*b1cdbd2cSJim Jagielski void XMLShapeExport::exportShape(const uno::Reference< drawing::XShape >& xShape,
533*b1cdbd2cSJim Jagielski 								 sal_Int32 nFeatures /* = SEF_DEFAULT */,
534*b1cdbd2cSJim Jagielski 								 com::sun::star::awt::Point* pRefPoint /* = NULL */,
535*b1cdbd2cSJim Jagielski                                  SvXMLAttributeList* pAttrList /* = NULL */ )
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski     if( maCurrentShapesIter == maShapesInfos.end() )
538*b1cdbd2cSJim Jagielski 	{
539*b1cdbd2cSJim Jagielski 		DBG_ERROR( "XMLShapeExport::exportShape(): no auto styles where collected before export" );
540*b1cdbd2cSJim Jagielski 		return;
541*b1cdbd2cSJim Jagielski 	}
542*b1cdbd2cSJim Jagielski 	sal_Int32 nZIndex = 0;
543*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 
546*b1cdbd2cSJim Jagielski 	::std::auto_ptr< SvXMLElementExport >  mpHyperlinkElement;
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski 	// export hyperlinks with <a><shape/></a>. Currently only in draw since draw
549*b1cdbd2cSJim Jagielski 	// does not support document events
550*b1cdbd2cSJim Jagielski 	if( xSet.is() && (GetExport().GetModelType() == SvtModuleOptions::E_DRAW) ) try
551*b1cdbd2cSJim Jagielski 	{
552*b1cdbd2cSJim Jagielski 		presentation::ClickAction eAction = presentation::ClickAction_NONE;
553*b1cdbd2cSJim Jagielski 		xSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("OnClick"))) >>= eAction;
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 		if( (eAction == presentation::ClickAction_DOCUMENT) ||
556*b1cdbd2cSJim Jagielski 			(eAction == presentation::ClickAction_BOOKMARK) )
557*b1cdbd2cSJim Jagielski 		{
558*b1cdbd2cSJim Jagielski 			OUString sURL;
559*b1cdbd2cSJim Jagielski 			xSet->getPropertyValue(msBookmark) >>= sURL;
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 			if( sURL.getLength() )
562*b1cdbd2cSJim Jagielski 			{
563*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sURL );
564*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
565*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
566*b1cdbd2cSJim Jagielski 				mpHyperlinkElement.reset( new SvXMLElementExport(mrExport, XML_NAMESPACE_DRAW, XML_A, sal_True, sal_True) );
567*b1cdbd2cSJim Jagielski 			}
568*b1cdbd2cSJim Jagielski 		}
569*b1cdbd2cSJim Jagielski 	}
570*b1cdbd2cSJim Jagielski 	catch( uno::Exception& )
571*b1cdbd2cSJim Jagielski 	{
572*b1cdbd2cSJim Jagielski 		DBG_ERROR("XMLShapeExport::exportShape(): exception during hyperlink export");
573*b1cdbd2cSJim Jagielski 	}
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 	if( xSet.is() )
577*b1cdbd2cSJim Jagielski 		xSet->getPropertyValue(msZIndex) >>= nZIndex;
578*b1cdbd2cSJim Jagielski 
579*b1cdbd2cSJim Jagielski 	ImplXMLShapeExportInfoVector& aShapeInfoVector = (*maCurrentShapesIter).second;
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski 	if( (sal_Int32)aShapeInfoVector.size() <= nZIndex )
582*b1cdbd2cSJim Jagielski 	{
583*b1cdbd2cSJim Jagielski 		DBG_ERROR( "XMLShapeExport::exportShape(): no shape info collected for a given shape" );
584*b1cdbd2cSJim Jagielski 		return;
585*b1cdbd2cSJim Jagielski 	}
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski     // --> OD 2008-05-08 #refactorlists#
588*b1cdbd2cSJim Jagielski     NewTextListsHelper aNewTextListsHelper( mrExport );
589*b1cdbd2cSJim Jagielski     // <--
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski 	const ImplXMLShapeExportInfo& aShapeInfo = aShapeInfoVector[nZIndex];
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
595*b1cdbd2cSJim Jagielski 	// ---------------------------------------
596*b1cdbd2cSJim Jagielski 	// check if this is the correct ShapesInfo
597*b1cdbd2cSJim Jagielski 	// ---------------------------------------
598*b1cdbd2cSJim Jagielski 	uno::Reference< container::XChild > xChild( xShape, uno::UNO_QUERY );
599*b1cdbd2cSJim Jagielski 	if( xChild.is() )
600*b1cdbd2cSJim Jagielski 	{
601*b1cdbd2cSJim Jagielski 		uno::Reference< drawing::XShapes > xParent( xChild->getParent(), uno::UNO_QUERY );
602*b1cdbd2cSJim Jagielski 		DBG_ASSERT( xParent.is() && xParent.get() == (*maCurrentShapesIter).first.get(), "XMLShapeExport::exportShape(): Wrong call to XMLShapeExport::seekShapes()" );
603*b1cdbd2cSJim Jagielski 	}
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 	// -----------------------------
606*b1cdbd2cSJim Jagielski 	// first compute the shapes type
607*b1cdbd2cSJim Jagielski 	// -----------------------------
608*b1cdbd2cSJim Jagielski 	{
609*b1cdbd2cSJim Jagielski 		XmlShapeType eShapeType(XmlShapeTypeNotYetSet);
610*b1cdbd2cSJim Jagielski 		ImpCalcShapeType(xShape, eShapeType);
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski 		DBG_ASSERT( eShapeType == aShapeInfo.meShapeType, "exportShape callings do not correspond to collectShapeAutoStyles calls!" );
613*b1cdbd2cSJim Jagielski 	}
614*b1cdbd2cSJim Jagielski #endif
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski 	// ----------------------------------------
617*b1cdbd2cSJim Jagielski 	// collect animation informations if needed
618*b1cdbd2cSJim Jagielski 	// ----------------------------------------
619*b1cdbd2cSJim Jagielski 	if( mxAnimationsExporter.is() )
620*b1cdbd2cSJim Jagielski 		mxAnimationsExporter->collect( xShape, mrExport );
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski 	// -------------------------------
623*b1cdbd2cSJim Jagielski 	// export shapes name if he has one
624*b1cdbd2cSJim Jagielski     // --> OD 2006-03-13 #i51726#
625*b1cdbd2cSJim Jagielski     // Export of the shape name for text documents only if the OpenDocument
626*b1cdbd2cSJim Jagielski     // file format is written - exceptions are group shapes.
627*b1cdbd2cSJim Jagielski     // Note: Writer documents in OpenOffice.org file format doesn't contain
628*b1cdbd2cSJim Jagielski     //       any names for shapes, except for group shapes.
629*b1cdbd2cSJim Jagielski 	// -------------------------------
630*b1cdbd2cSJim Jagielski 	{
631*b1cdbd2cSJim Jagielski         // --> OD 2006-03-10 #i51726#
632*b1cdbd2cSJim Jagielski         if ( ( GetExport().GetModelType() != SvtModuleOptions::E_WRITER &&
633*b1cdbd2cSJim Jagielski                GetExport().GetModelType() != SvtModuleOptions::E_WRITERWEB &&
634*b1cdbd2cSJim Jagielski                GetExport().GetModelType() != SvtModuleOptions::E_WRITERGLOBAL ) ||
635*b1cdbd2cSJim Jagielski              ( GetExport().getExportFlags() & EXPORT_OASIS ) != 0 ||
636*b1cdbd2cSJim Jagielski              aShapeInfo.meShapeType == XmlShapeTypeDrawGroupShape ||
637*b1cdbd2cSJim Jagielski              ( aShapeInfo.meShapeType == XmlShapeTypeDrawCustomShape &&
638*b1cdbd2cSJim Jagielski                aShapeInfo.xCustomShapeReplacement.is() ) )
639*b1cdbd2cSJim Jagielski         {
640*b1cdbd2cSJim Jagielski             uno::Reference< container::XNamed > xNamed( xShape, uno::UNO_QUERY );
641*b1cdbd2cSJim Jagielski             if( xNamed.is() )
642*b1cdbd2cSJim Jagielski             {
643*b1cdbd2cSJim Jagielski                 const OUString aName( xNamed->getName() );
644*b1cdbd2cSJim Jagielski                 if( aName.getLength() )
645*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_NAME, aName );
646*b1cdbd2cSJim Jagielski             }
647*b1cdbd2cSJim Jagielski         }
648*b1cdbd2cSJim Jagielski         // <--
649*b1cdbd2cSJim Jagielski 	}
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski 	// ------------------
652*b1cdbd2cSJim Jagielski 	// export style name
653*b1cdbd2cSJim Jagielski 	// ------------------
654*b1cdbd2cSJim Jagielski 	if( aShapeInfo.msStyleName.getLength() != 0 )
655*b1cdbd2cSJim Jagielski 	{
656*b1cdbd2cSJim Jagielski 		if(XML_STYLE_FAMILY_SD_GRAPHICS_ID == aShapeInfo.mnFamily)
657*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_STYLE_NAME, mrExport.EncodeStyleName( aShapeInfo.msStyleName) );
658*b1cdbd2cSJim Jagielski 		else
659*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_STYLE_NAME, mrExport.EncodeStyleName( aShapeInfo.msStyleName) );
660*b1cdbd2cSJim Jagielski 	}
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 	// ------------------
663*b1cdbd2cSJim Jagielski 	// export text style name
664*b1cdbd2cSJim Jagielski 	// ------------------
665*b1cdbd2cSJim Jagielski 	if( aShapeInfo.msTextStyleName.getLength() != 0 )
666*b1cdbd2cSJim Jagielski 	{
667*b1cdbd2cSJim Jagielski 		mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_TEXT_STYLE_NAME, aShapeInfo.msTextStyleName );
668*b1cdbd2cSJim Jagielski 	}
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski 	// --------------------------
671*b1cdbd2cSJim Jagielski 	// export shapes id if needed
672*b1cdbd2cSJim Jagielski 	// --------------------------
673*b1cdbd2cSJim Jagielski 	{
674*b1cdbd2cSJim Jagielski 		uno::Reference< uno::XInterface > xRef( xShape, uno::UNO_QUERY );
675*b1cdbd2cSJim Jagielski 		const OUString& rShapeId = mrExport.getInterfaceToIdentifierMapper().getIdentifier( xRef );
676*b1cdbd2cSJim Jagielski 		if( rShapeId.getLength() )
677*b1cdbd2cSJim Jagielski         {
678*b1cdbd2cSJim Jagielski             mrExport.AddAttributeIdLegacy(XML_NAMESPACE_DRAW, rShapeId);
679*b1cdbd2cSJim Jagielski         }
680*b1cdbd2cSJim Jagielski 	}
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski 	// --------------------------
683*b1cdbd2cSJim Jagielski 	// export layer information
684*b1cdbd2cSJim Jagielski 	// --------------------------
685*b1cdbd2cSJim Jagielski 	if( IsLayerExportEnabled() )
686*b1cdbd2cSJim Jagielski 	{
687*b1cdbd2cSJim Jagielski 		// check for group or scene shape and not export layer if this is one
688*b1cdbd2cSJim Jagielski 		uno::Reference< drawing::XShapes > xShapes( xShape, uno::UNO_QUERY );
689*b1cdbd2cSJim Jagielski 		if( !xShapes.is() )
690*b1cdbd2cSJim Jagielski 		{
691*b1cdbd2cSJim Jagielski 			try
692*b1cdbd2cSJim Jagielski 			{
693*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
694*b1cdbd2cSJim Jagielski 				OUString aLayerName;
695*b1cdbd2cSJim Jagielski 				xProps->getPropertyValue( OUString::createFromAscii( "LayerName" ) ) >>= aLayerName;
696*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_LAYER, aLayerName );
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski 			}
699*b1cdbd2cSJim Jagielski 			catch( uno::Exception e )
700*b1cdbd2cSJim Jagielski 			{
701*b1cdbd2cSJim Jagielski 				DBG_ERROR( "could not export layer name for shape!" );
702*b1cdbd2cSJim Jagielski 			}
703*b1cdbd2cSJim Jagielski 		}
704*b1cdbd2cSJim Jagielski 	}
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski 	// export draw:display (do not export in ODF 1.2 or older)
707*b1cdbd2cSJim Jagielski 	if( xSet.is() && ( mrExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012 ) )
708*b1cdbd2cSJim Jagielski 	{
709*b1cdbd2cSJim Jagielski 		if( aShapeInfo.meShapeType != XmlShapeTypeDrawPageShape && aShapeInfo.meShapeType != XmlShapeTypePresPageShape &&
710*b1cdbd2cSJim Jagielski 			aShapeInfo.meShapeType != XmlShapeTypeHandoutShape && aShapeInfo.meShapeType != XmlShapeTypeDrawChartShape )
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski 		try
713*b1cdbd2cSJim Jagielski 		{
714*b1cdbd2cSJim Jagielski 			sal_Bool bVisible = sal_True;
715*b1cdbd2cSJim Jagielski 			sal_Bool bPrintable = sal_True;
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 			xSet->getPropertyValue(msVisible) >>= bVisible;
718*b1cdbd2cSJim Jagielski 			xSet->getPropertyValue(msPrintable) >>= bPrintable;
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 			XMLTokenEnum eDisplayToken = XML_TOKEN_INVALID;
721*b1cdbd2cSJim Jagielski 			const unsigned short nDisplay = (bVisible ? 2 : 0) | (bPrintable ? 1 : 0);
722*b1cdbd2cSJim Jagielski 			switch( nDisplay )
723*b1cdbd2cSJim Jagielski 			{
724*b1cdbd2cSJim Jagielski 			case 0: eDisplayToken = XML_NONE; break;
725*b1cdbd2cSJim Jagielski 			case 1: eDisplayToken = XML_PRINTER; break;
726*b1cdbd2cSJim Jagielski 			case 2: eDisplayToken = XML_SCREEN; break;
727*b1cdbd2cSJim Jagielski 			// case 3: eDisplayToken = XML_ALWAYS break; this is the default
728*b1cdbd2cSJim Jagielski 			}
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski 			if( eDisplayToken != XML_TOKEN_INVALID )
731*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute(XML_NAMESPACE_DRAW_EXT, XML_DISPLAY, eDisplayToken );
732*b1cdbd2cSJim Jagielski 		}
733*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
734*b1cdbd2cSJim Jagielski 		{
735*b1cdbd2cSJim Jagielski 			DBG_ERROR( "XMLShapeExport::exportShape(), exception caught!" );
736*b1cdbd2cSJim Jagielski 		}
737*b1cdbd2cSJim Jagielski 	}
738*b1cdbd2cSJim Jagielski 
739*b1cdbd2cSJim Jagielski 	// #82003# test export count
740*b1cdbd2cSJim Jagielski 	// #91587# ALWAYS increment since now ALL to be exported shapes are counted.
741*b1cdbd2cSJim Jagielski 	if(mrExport.GetShapeExport()->IsHandleProgressBarEnabled())
742*b1cdbd2cSJim Jagielski 	{
743*b1cdbd2cSJim Jagielski 		mrExport.GetProgressBarHelper()->Increment();
744*b1cdbd2cSJim Jagielski 	}
745*b1cdbd2cSJim Jagielski 
746*b1cdbd2cSJim Jagielski 	onExport( xShape );
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski 	// --------------------
749*b1cdbd2cSJim Jagielski 	// export shape element
750*b1cdbd2cSJim Jagielski 	// --------------------
751*b1cdbd2cSJim Jagielski 	switch(aShapeInfo.meShapeType)
752*b1cdbd2cSJim Jagielski 	{
753*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawRectangleShape:
754*b1cdbd2cSJim Jagielski 		{
755*b1cdbd2cSJim Jagielski 			ImpExportRectangleShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
756*b1cdbd2cSJim Jagielski 			break;
757*b1cdbd2cSJim Jagielski 		}
758*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawEllipseShape:
759*b1cdbd2cSJim Jagielski 		{
760*b1cdbd2cSJim Jagielski 			ImpExportEllipseShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
761*b1cdbd2cSJim Jagielski 			break;
762*b1cdbd2cSJim Jagielski 		}
763*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawLineShape:
764*b1cdbd2cSJim Jagielski 		{
765*b1cdbd2cSJim Jagielski 			ImpExportLineShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
766*b1cdbd2cSJim Jagielski 			break;
767*b1cdbd2cSJim Jagielski 		}
768*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawPolyPolygonShape:	// closed PolyPolygon
769*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawPolyLineShape:		// open PolyPolygon
770*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawClosedBezierShape:	// closed PolyPolygon containing curves
771*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawOpenBezierShape:	// open PolyPolygon containing curves
772*b1cdbd2cSJim Jagielski 		{
773*b1cdbd2cSJim Jagielski 			ImpExportPolygonShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
774*b1cdbd2cSJim Jagielski 			break;
775*b1cdbd2cSJim Jagielski 		}
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawTextShape:
778*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresTitleTextShape:
779*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresOutlinerShape:
780*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresSubtitleShape:
781*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresNotesShape:
782*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresHeaderShape:
783*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresFooterShape:
784*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresSlideNumberShape:
785*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresDateTimeShape:
786*b1cdbd2cSJim Jagielski 		{
787*b1cdbd2cSJim Jagielski 			ImpExportTextBoxShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
788*b1cdbd2cSJim Jagielski 			break;
789*b1cdbd2cSJim Jagielski 		}
790*b1cdbd2cSJim Jagielski 
791*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawGraphicObjectShape:
792*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresGraphicObjectShape:
793*b1cdbd2cSJim Jagielski 		{
794*b1cdbd2cSJim Jagielski 			ImpExportGraphicObjectShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
795*b1cdbd2cSJim Jagielski 			break;
796*b1cdbd2cSJim Jagielski 		}
797*b1cdbd2cSJim Jagielski 
798*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawChartShape:
799*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresChartShape:
800*b1cdbd2cSJim Jagielski 		{
801*b1cdbd2cSJim Jagielski 			ImpExportChartShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint, pAttrList );
802*b1cdbd2cSJim Jagielski 			break;
803*b1cdbd2cSJim Jagielski 		}
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawControlShape:
806*b1cdbd2cSJim Jagielski 		{
807*b1cdbd2cSJim Jagielski 			ImpExportControlShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
808*b1cdbd2cSJim Jagielski 			break;
809*b1cdbd2cSJim Jagielski 		}
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawConnectorShape:
812*b1cdbd2cSJim Jagielski 		{
813*b1cdbd2cSJim Jagielski 			ImpExportConnectorShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
814*b1cdbd2cSJim Jagielski 			break;
815*b1cdbd2cSJim Jagielski 		}
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawMeasureShape:
818*b1cdbd2cSJim Jagielski 		{
819*b1cdbd2cSJim Jagielski 			ImpExportMeasureShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
820*b1cdbd2cSJim Jagielski 			break;
821*b1cdbd2cSJim Jagielski 		}
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawOLE2Shape:
824*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresOLE2Shape:
825*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawSheetShape:
826*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresSheetShape:
827*b1cdbd2cSJim Jagielski 		{
828*b1cdbd2cSJim Jagielski 			ImpExportOLE2Shape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
829*b1cdbd2cSJim Jagielski 			break;
830*b1cdbd2cSJim Jagielski 		}
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresTableShape:
833*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawTableShape:
834*b1cdbd2cSJim Jagielski 		{
835*b1cdbd2cSJim Jagielski 			ImpExportTableShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
836*b1cdbd2cSJim Jagielski 			break;
837*b1cdbd2cSJim Jagielski 		}
838*b1cdbd2cSJim Jagielski 
839*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawPageShape:
840*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresPageShape:
841*b1cdbd2cSJim Jagielski 		case XmlShapeTypeHandoutShape:
842*b1cdbd2cSJim Jagielski 		{
843*b1cdbd2cSJim Jagielski 			ImpExportPageShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
844*b1cdbd2cSJim Jagielski 			break;
845*b1cdbd2cSJim Jagielski 		}
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawCaptionShape:
848*b1cdbd2cSJim Jagielski 		{
849*b1cdbd2cSJim Jagielski 			ImpExportCaptionShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
850*b1cdbd2cSJim Jagielski 			break;
851*b1cdbd2cSJim Jagielski 		}
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDraw3DCubeObject:
854*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDraw3DSphereObject:
855*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDraw3DLatheObject:
856*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDraw3DExtrudeObject:
857*b1cdbd2cSJim Jagielski 		{
858*b1cdbd2cSJim Jagielski 			ImpExport3DShape(xShape, aShapeInfo.meShapeType);
859*b1cdbd2cSJim Jagielski 			break;
860*b1cdbd2cSJim Jagielski 		}
861*b1cdbd2cSJim Jagielski 
862*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDraw3DSceneObject:
863*b1cdbd2cSJim Jagielski 		{
864*b1cdbd2cSJim Jagielski 			ImpExport3DSceneShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
865*b1cdbd2cSJim Jagielski 			break;
866*b1cdbd2cSJim Jagielski 		}
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawGroupShape:
869*b1cdbd2cSJim Jagielski 		{
870*b1cdbd2cSJim Jagielski 			// empty group
871*b1cdbd2cSJim Jagielski 			ImpExportGroupShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
872*b1cdbd2cSJim Jagielski 			break;
873*b1cdbd2cSJim Jagielski 		}
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawFrameShape:
876*b1cdbd2cSJim Jagielski 		{
877*b1cdbd2cSJim Jagielski 			ImpExportFrameShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
878*b1cdbd2cSJim Jagielski 			break;
879*b1cdbd2cSJim Jagielski 		}
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawAppletShape:
882*b1cdbd2cSJim Jagielski 		{
883*b1cdbd2cSJim Jagielski 			ImpExportAppletShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
884*b1cdbd2cSJim Jagielski 			break;
885*b1cdbd2cSJim Jagielski 		}
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawPluginShape:
888*b1cdbd2cSJim Jagielski 		{
889*b1cdbd2cSJim Jagielski 			ImpExportPluginShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
890*b1cdbd2cSJim Jagielski 			break;
891*b1cdbd2cSJim Jagielski 		}
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawCustomShape:
894*b1cdbd2cSJim Jagielski 		{
895*b1cdbd2cSJim Jagielski 			if ( aShapeInfo.xCustomShapeReplacement.is() )
896*b1cdbd2cSJim Jagielski 				ImpExportGroupShape( aShapeInfo.xCustomShapeReplacement, XmlShapeTypeDrawGroupShape, nFeatures, pRefPoint );
897*b1cdbd2cSJim Jagielski 			else
898*b1cdbd2cSJim Jagielski 				ImpExportCustomShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
899*b1cdbd2cSJim Jagielski 			break;
900*b1cdbd2cSJim Jagielski 		}
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresMediaShape:
903*b1cdbd2cSJim Jagielski 		case XmlShapeTypeDrawMediaShape:
904*b1cdbd2cSJim Jagielski 		{
905*b1cdbd2cSJim Jagielski 			ImpExportMediaShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
906*b1cdbd2cSJim Jagielski 			break;
907*b1cdbd2cSJim Jagielski 		}
908*b1cdbd2cSJim Jagielski 
909*b1cdbd2cSJim Jagielski 		case XmlShapeTypePresOrgChartShape:
910*b1cdbd2cSJim Jagielski 		case XmlShapeTypeUnknown:
911*b1cdbd2cSJim Jagielski 		case XmlShapeTypeNotYetSet:
912*b1cdbd2cSJim Jagielski 		default:
913*b1cdbd2cSJim Jagielski 		{
914*b1cdbd2cSJim Jagielski 			// this should never happen and is an error
915*b1cdbd2cSJim Jagielski 			DBG_ERROR("XMLEXP: WriteShape: unknown or unexpected type of shape in export!");
916*b1cdbd2cSJim Jagielski 			break;
917*b1cdbd2cSJim Jagielski 		}
918*b1cdbd2cSJim Jagielski 	}
919*b1cdbd2cSJim Jagielski 
920*b1cdbd2cSJim Jagielski 	mpHyperlinkElement.reset();
921*b1cdbd2cSJim Jagielski 
922*b1cdbd2cSJim Jagielski 	// #97489# #97111#
923*b1cdbd2cSJim Jagielski 	// if there was an error and no element for the shape was exported
924*b1cdbd2cSJim Jagielski 	// we need to clear the attribute list or the attributes will be
925*b1cdbd2cSJim Jagielski 	// set on the next exported element, which can result in corrupt
926*b1cdbd2cSJim Jagielski 	// xml files due to duplicate attributes
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski 	mrExport.CheckAttrList();	// asserts in non pro if we have attributes left
929*b1cdbd2cSJim Jagielski 	mrExport.ClearAttrList();	// clears the attributes
930*b1cdbd2cSJim Jagielski }
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski // This method collects all automatic styles for the shapes inside the given XShapes collection
collectShapesAutoStyles(const uno::Reference<drawing::XShapes> & xShapes)935*b1cdbd2cSJim Jagielski void XMLShapeExport::collectShapesAutoStyles( const uno::Reference < drawing::XShapes >& xShapes )
936*b1cdbd2cSJim Jagielski {
937*b1cdbd2cSJim Jagielski 	ShapesInfos::iterator aOldCurrentShapesIter = maCurrentShapesIter;
938*b1cdbd2cSJim Jagielski 	seekShapes( xShapes );
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShape > xShape;
941*b1cdbd2cSJim Jagielski 	const sal_Int32 nShapeCount(xShapes->getCount());
942*b1cdbd2cSJim Jagielski 	for(sal_Int32 nShapeId = 0; nShapeId < nShapeCount; nShapeId++)
943*b1cdbd2cSJim Jagielski 	{
944*b1cdbd2cSJim Jagielski 		xShapes->getByIndex(nShapeId) >>= xShape;
945*b1cdbd2cSJim Jagielski 		DBG_ASSERT( xShape.is(), "Shape without a XShape?" );
946*b1cdbd2cSJim Jagielski 		if(!xShape.is())
947*b1cdbd2cSJim Jagielski 			continue;
948*b1cdbd2cSJim Jagielski 
949*b1cdbd2cSJim Jagielski 		collectShapeAutoStyles( xShape );
950*b1cdbd2cSJim Jagielski 	}
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski 	maCurrentShapesIter = aOldCurrentShapesIter;
953*b1cdbd2cSJim Jagielski }
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski // This method exports all XShape inside the given XShapes collection
exportShapes(const uno::Reference<drawing::XShapes> & xShapes,sal_Int32 nFeatures,awt::Point * pRefPoint)958*b1cdbd2cSJim Jagielski void XMLShapeExport::exportShapes( const uno::Reference < drawing::XShapes >& xShapes, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */ )
959*b1cdbd2cSJim Jagielski {
960*b1cdbd2cSJim Jagielski 	ShapesInfos::iterator aOldCurrentShapesIter = maCurrentShapesIter;
961*b1cdbd2cSJim Jagielski 	seekShapes( xShapes );
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShape > xShape;
964*b1cdbd2cSJim Jagielski 	const sal_Int32 nShapeCount(xShapes->getCount());
965*b1cdbd2cSJim Jagielski 	for(sal_Int32 nShapeId = 0; nShapeId < nShapeCount; nShapeId++)
966*b1cdbd2cSJim Jagielski 	{
967*b1cdbd2cSJim Jagielski 		xShapes->getByIndex(nShapeId) >>= xShape;
968*b1cdbd2cSJim Jagielski 		DBG_ASSERT( xShape.is(), "Shape without a XShape?" );
969*b1cdbd2cSJim Jagielski 		if(!xShape.is())
970*b1cdbd2cSJim Jagielski 			continue;
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski 		exportShape( xShape, nFeatures, pRefPoint );
973*b1cdbd2cSJim Jagielski 	}
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski 	maCurrentShapesIter = aOldCurrentShapesIter;
976*b1cdbd2cSJim Jagielski }
977*b1cdbd2cSJim Jagielski 
978*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
979*b1cdbd2cSJim Jagielski 
seekShapes(const uno::Reference<drawing::XShapes> & xShapes)980*b1cdbd2cSJim Jagielski void XMLShapeExport::seekShapes( const uno::Reference< drawing::XShapes >& xShapes ) throw()
981*b1cdbd2cSJim Jagielski {
982*b1cdbd2cSJim Jagielski 	if( xShapes.is() )
983*b1cdbd2cSJim Jagielski 	{
984*b1cdbd2cSJim Jagielski 		maCurrentShapesIter = maShapesInfos.find( xShapes );
985*b1cdbd2cSJim Jagielski 		if( maCurrentShapesIter == maShapesInfos.end() )
986*b1cdbd2cSJim Jagielski 		{
987*b1cdbd2cSJim Jagielski 			ImplXMLShapeExportInfoVector aNewInfoVector;
988*b1cdbd2cSJim Jagielski 			aNewInfoVector.resize( (ShapesInfos::size_type) xShapes->getCount() );
989*b1cdbd2cSJim Jagielski 			maShapesInfos[ xShapes ] = aNewInfoVector;
990*b1cdbd2cSJim Jagielski 
991*b1cdbd2cSJim Jagielski 			maCurrentShapesIter = maShapesInfos.find( xShapes );
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski 			DBG_ASSERT( maCurrentShapesIter != maShapesInfos.end(), "XMLShapeExport::seekShapes(): insert into stl::map failed" );
994*b1cdbd2cSJim Jagielski 		}
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski 		DBG_ASSERT( (*maCurrentShapesIter).second.size() == (ShapesInfos::size_type)xShapes->getCount(), "XMLShapeExport::seekShapes(): XShapes size varied between calls" );
997*b1cdbd2cSJim Jagielski 
998*b1cdbd2cSJim Jagielski 	}
999*b1cdbd2cSJim Jagielski 	else
1000*b1cdbd2cSJim Jagielski 	{
1001*b1cdbd2cSJim Jagielski 		maCurrentShapesIter = maShapesInfos.end();
1002*b1cdbd2cSJim Jagielski 	}
1003*b1cdbd2cSJim Jagielski }
1004*b1cdbd2cSJim Jagielski 
1005*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
1006*b1cdbd2cSJim Jagielski 
exportAutoStyles()1007*b1cdbd2cSJim Jagielski void XMLShapeExport::exportAutoStyles()
1008*b1cdbd2cSJim Jagielski {
1009*b1cdbd2cSJim Jagielski 	// export all autostyle infos
1010*b1cdbd2cSJim Jagielski 
1011*b1cdbd2cSJim Jagielski 	// ...for graphic
1012*b1cdbd2cSJim Jagielski //	if(IsFamilyGraphicUsed())
1013*b1cdbd2cSJim Jagielski 	{
1014*b1cdbd2cSJim Jagielski 		GetExport().GetAutoStylePool()->exportXML(
1015*b1cdbd2cSJim Jagielski 			XML_STYLE_FAMILY_SD_GRAPHICS_ID
1016*b1cdbd2cSJim Jagielski             , GetExport().GetDocHandler(),
1017*b1cdbd2cSJim Jagielski 			GetExport().GetMM100UnitConverter(),
1018*b1cdbd2cSJim Jagielski 			GetExport().GetNamespaceMap()
1019*b1cdbd2cSJim Jagielski             );
1020*b1cdbd2cSJim Jagielski 	}
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski 	// ...for presentation
1023*b1cdbd2cSJim Jagielski //	if(IsFamilyPresentationUsed())
1024*b1cdbd2cSJim Jagielski 	{
1025*b1cdbd2cSJim Jagielski 		GetExport().GetAutoStylePool()->exportXML(
1026*b1cdbd2cSJim Jagielski 			XML_STYLE_FAMILY_SD_PRESENTATION_ID
1027*b1cdbd2cSJim Jagielski             , GetExport().GetDocHandler(),
1028*b1cdbd2cSJim Jagielski 			GetExport().GetMM100UnitConverter(),
1029*b1cdbd2cSJim Jagielski 			GetExport().GetNamespaceMap()
1030*b1cdbd2cSJim Jagielski             );
1031*b1cdbd2cSJim Jagielski 	}
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski 	if( mxShapeTableExport.is() )
1034*b1cdbd2cSJim Jagielski 		mxShapeTableExport->exportAutoStyles();
1035*b1cdbd2cSJim Jagielski }
1036*b1cdbd2cSJim Jagielski 
1037*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
1038*b1cdbd2cSJim Jagielski 
1039*b1cdbd2cSJim Jagielski /// returns the export property mapper for external chaining
CreateShapePropMapper(SvXMLExport & rExport)1040*b1cdbd2cSJim Jagielski SvXMLExportPropertyMapper* XMLShapeExport::CreateShapePropMapper(
1041*b1cdbd2cSJim Jagielski 	SvXMLExport& rExport )
1042*b1cdbd2cSJim Jagielski {
1043*b1cdbd2cSJim Jagielski 	UniReference< XMLPropertyHandlerFactory > xFactory = new XMLSdPropHdlFactory( rExport.GetModel(), rExport );
1044*b1cdbd2cSJim Jagielski 	UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory );
1045*b1cdbd2cSJim Jagielski 	SvXMLExportPropertyMapper* pResult =
1046*b1cdbd2cSJim Jagielski 		new XMLShapeExportPropertyMapper( xMapper,
1047*b1cdbd2cSJim Jagielski 										  (XMLTextListAutoStylePool*)&rExport.GetTextParagraphExport()->GetListAutoStylePool(),
1048*b1cdbd2cSJim Jagielski 										  rExport );
1049*b1cdbd2cSJim Jagielski 	// chain text attributes
1050*b1cdbd2cSJim Jagielski 	return pResult;
1051*b1cdbd2cSJim Jagielski }
1052*b1cdbd2cSJim Jagielski 
1053*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
1054*b1cdbd2cSJim Jagielski 
ImpCalcShapeType(const uno::Reference<drawing::XShape> & xShape,XmlShapeType & eShapeType)1055*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpCalcShapeType(const uno::Reference< drawing::XShape >& xShape,
1056*b1cdbd2cSJim Jagielski 	XmlShapeType& eShapeType)
1057*b1cdbd2cSJim Jagielski {
1058*b1cdbd2cSJim Jagielski 	// set in every case, so init here
1059*b1cdbd2cSJim Jagielski 	eShapeType = XmlShapeTypeUnknown;
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapeDescriptor > xShapeDescriptor(xShape, uno::UNO_QUERY);
1062*b1cdbd2cSJim Jagielski 	if(xShapeDescriptor.is())
1063*b1cdbd2cSJim Jagielski 	{
1064*b1cdbd2cSJim Jagielski 		String aType((OUString)xShapeDescriptor->getShapeType());
1065*b1cdbd2cSJim Jagielski 
1066*b1cdbd2cSJim Jagielski 		if(aType.EqualsAscii((const sal_Char*)"com.sun.star.", 0, 13))
1067*b1cdbd2cSJim Jagielski 		{
1068*b1cdbd2cSJim Jagielski 			if(aType.EqualsAscii("drawing.", 13, 8))
1069*b1cdbd2cSJim Jagielski 			{
1070*b1cdbd2cSJim Jagielski 				// drawing shapes
1071*b1cdbd2cSJim Jagielski 				if     (aType.EqualsAscii("Rectangle", 21, 9)) { eShapeType = XmlShapeTypeDrawRectangleShape; }
1072*b1cdbd2cSJim Jagielski 
1073*b1cdbd2cSJim Jagielski 				// #i72177# Note: Correcting CustomShape, CustomShape->Custom, len from 9 (was wrong anyways) to 6.
1074*b1cdbd2cSJim Jagielski 				// As can be seen at the other compares, the appendix "Shape" is left out of the comparison.
1075*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Custom", 21, 6)) { eShapeType = XmlShapeTypeDrawCustomShape; }
1076*b1cdbd2cSJim Jagielski 
1077*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Ellipse", 21, 7)) { eShapeType = XmlShapeTypeDrawEllipseShape; }
1078*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Control", 21, 7)) { eShapeType = XmlShapeTypeDrawControlShape; }
1079*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Connector", 21, 9)) { eShapeType = XmlShapeTypeDrawConnectorShape; }
1080*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Measure", 21, 7)) { eShapeType = XmlShapeTypeDrawMeasureShape; }
1081*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Line", 21, 4)) { eShapeType = XmlShapeTypeDrawLineShape; }
1082*b1cdbd2cSJim Jagielski 
1083*b1cdbd2cSJim Jagielski 				// #i72177# Note: This covers two types by purpose, PolyPolygonShape and PolyPolygonPathShape
1084*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("PolyPolygon", 21, 11)) { eShapeType = XmlShapeTypeDrawPolyPolygonShape; }
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski 				// #i72177# Note: This covers two types by purpose, PolyLineShape and PolyLinePathShape
1087*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("PolyLine", 21, 8)) { eShapeType = XmlShapeTypeDrawPolyLineShape; }
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("OpenBezier", 21, 10)) { eShapeType = XmlShapeTypeDrawOpenBezierShape; }
1090*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("ClosedBezier", 21, 12)) { eShapeType = XmlShapeTypeDrawClosedBezierShape; }
1091*b1cdbd2cSJim Jagielski 
1092*b1cdbd2cSJim Jagielski 				// #i72177# FreeHand (opened and closed) now supports the types OpenFreeHandShape and
1093*b1cdbd2cSJim Jagielski 				// ClosedFreeHandShape respectively. Represent them as bezier shapes
1094*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("OpenFreeHand", 21, 12)) { eShapeType = XmlShapeTypeDrawOpenBezierShape; }
1095*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("ClosedFreeHand", 21, 14)) { eShapeType = XmlShapeTypeDrawClosedBezierShape; }
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("GraphicObject", 21, 13)) { eShapeType = XmlShapeTypeDrawGraphicObjectShape; }
1098*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Group", 21, 5)) { eShapeType = XmlShapeTypeDrawGroupShape; }
1099*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Text", 21, 4)) { eShapeType = XmlShapeTypeDrawTextShape; }
1100*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("OLE2", 21, 4))
1101*b1cdbd2cSJim Jagielski 				{
1102*b1cdbd2cSJim Jagielski 					eShapeType = XmlShapeTypeDrawOLE2Shape;
1103*b1cdbd2cSJim Jagielski 
1104*b1cdbd2cSJim Jagielski 					// get info about presentation shape
1105*b1cdbd2cSJim Jagielski 					uno::Reference <beans::XPropertySet> xPropSet(xShape, uno::UNO_QUERY);
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski 					if(xPropSet.is())
1108*b1cdbd2cSJim Jagielski 					{
1109*b1cdbd2cSJim Jagielski 						rtl::OUString sCLSID;
1110*b1cdbd2cSJim Jagielski 						if(xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID"))) >>= sCLSID)
1111*b1cdbd2cSJim Jagielski 						{
1112*b1cdbd2cSJim Jagielski 							if (sCLSID.equals(mrExport.GetChartExport()->getChartCLSID()))
1113*b1cdbd2cSJim Jagielski 							{
1114*b1cdbd2cSJim Jagielski 								eShapeType = XmlShapeTypeDrawChartShape;
1115*b1cdbd2cSJim Jagielski 							}
1116*b1cdbd2cSJim Jagielski 							else if (
1117*b1cdbd2cSJim Jagielski 								sCLSID.equals(rtl::OUString( SvGlobalName( SO3_SC_CLASSID ).GetHexName()))
1118*b1cdbd2cSJim Jagielski 								// #110680#
1119*b1cdbd2cSJim Jagielski 								// same reaction for binfilter
1120*b1cdbd2cSJim Jagielski 								|| sCLSID.equals(rtl::OUString( SvGlobalName( BF_SO3_SC_CLASSID ).GetHexName()))
1121*b1cdbd2cSJim Jagielski 								)
1122*b1cdbd2cSJim Jagielski 							{
1123*b1cdbd2cSJim Jagielski 								eShapeType = XmlShapeTypeDrawSheetShape;
1124*b1cdbd2cSJim Jagielski 							}
1125*b1cdbd2cSJim Jagielski 							else
1126*b1cdbd2cSJim Jagielski 							{
1127*b1cdbd2cSJim Jagielski 								// general OLE2 Object
1128*b1cdbd2cSJim Jagielski 							}
1129*b1cdbd2cSJim Jagielski 						}
1130*b1cdbd2cSJim Jagielski 					}
1131*b1cdbd2cSJim Jagielski 				}
1132*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Page", 21, 4)) { eShapeType = XmlShapeTypeDrawPageShape; }
1133*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Frame", 21, 5)) { eShapeType = XmlShapeTypeDrawFrameShape; }
1134*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Caption", 21, 7)) { eShapeType = XmlShapeTypeDrawCaptionShape; }
1135*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Plugin", 21, 6)) { eShapeType = XmlShapeTypeDrawPluginShape; }
1136*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Applet", 21, 6)) { eShapeType = XmlShapeTypeDrawAppletShape; }
1137*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("MediaShape", 21, 10)) { eShapeType = XmlShapeTypeDrawMediaShape; }
1138*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("TableShape", 21, 10)) { eShapeType = XmlShapeTypeDrawTableShape; }
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski 				// 3D shapes
1141*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Scene", 21 + 7, 5)) { eShapeType = XmlShapeTypeDraw3DSceneObject; }
1142*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Cube", 21 + 7, 4)) { eShapeType = XmlShapeTypeDraw3DCubeObject; }
1143*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Sphere", 21 + 7, 6)) { eShapeType = XmlShapeTypeDraw3DSphereObject; }
1144*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Lathe", 21 + 7, 5)) { eShapeType = XmlShapeTypeDraw3DLatheObject; }
1145*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Extrude", 21 + 7, 7)) { eShapeType = XmlShapeTypeDraw3DExtrudeObject; }
1146*b1cdbd2cSJim Jagielski 			}
1147*b1cdbd2cSJim Jagielski 			else if(aType.EqualsAscii("presentation.", 13, 13))
1148*b1cdbd2cSJim Jagielski 			{
1149*b1cdbd2cSJim Jagielski 				// presentation shapes
1150*b1cdbd2cSJim Jagielski 				if     (aType.EqualsAscii("TitleText", 26, 9)) { eShapeType = XmlShapeTypePresTitleTextShape; }
1151*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Outliner", 26, 8)) { eShapeType = XmlShapeTypePresOutlinerShape;  }
1152*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Subtitle", 26, 8)) { eShapeType = XmlShapeTypePresSubtitleShape;  }
1153*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("GraphicObject", 26, 13)) { eShapeType = XmlShapeTypePresGraphicObjectShape;  }
1154*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Page", 26, 4)) { eShapeType = XmlShapeTypePresPageShape;  }
1155*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("OLE2", 26, 4))
1156*b1cdbd2cSJim Jagielski 				{
1157*b1cdbd2cSJim Jagielski 					eShapeType = XmlShapeTypePresOLE2Shape;
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski 					// get info about presentation shape
1160*b1cdbd2cSJim Jagielski 					uno::Reference <beans::XPropertySet> xPropSet(xShape, uno::UNO_QUERY);
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski 					if(xPropSet.is()) try
1163*b1cdbd2cSJim Jagielski 					{
1164*b1cdbd2cSJim Jagielski 						rtl::OUString sCLSID;
1165*b1cdbd2cSJim Jagielski 						if(xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID"))) >>= sCLSID)
1166*b1cdbd2cSJim Jagielski 						{
1167*b1cdbd2cSJim Jagielski 							if( sCLSID.equals(rtl::OUString( SvGlobalName( SO3_SC_CLASSID ).GetHexName())) ||
1168*b1cdbd2cSJim Jagielski 								sCLSID.equals(rtl::OUString( SvGlobalName( BF_SO3_SC_CLASSID ).GetHexName())) )
1169*b1cdbd2cSJim Jagielski 							{
1170*b1cdbd2cSJim Jagielski 								eShapeType = XmlShapeTypePresSheetShape;
1171*b1cdbd2cSJim Jagielski 							}
1172*b1cdbd2cSJim Jagielski 						}
1173*b1cdbd2cSJim Jagielski 					}
1174*b1cdbd2cSJim Jagielski 					catch( uno::Exception& )
1175*b1cdbd2cSJim Jagielski 					{
1176*b1cdbd2cSJim Jagielski 						DBG_ERROR( "XMLShapeExport::ImpCalcShapeType(), expected ole shape to have the CLSID property?" );
1177*b1cdbd2cSJim Jagielski 					}
1178*b1cdbd2cSJim Jagielski 				}
1179*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Chart", 26, 5)) { eShapeType = XmlShapeTypePresChartShape;  }
1180*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("OrgChart", 26, 8)) { eShapeType = XmlShapeTypePresOrgChartShape;  }
1181*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("CalcShape", 26, 9)) { eShapeType = XmlShapeTypePresSheetShape; }
1182*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("TableShape", 26, 10)) { eShapeType = XmlShapeTypePresTableShape; }
1183*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("Notes", 26, 5)) { eShapeType = XmlShapeTypePresNotesShape;  }
1184*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("HandoutShape", 26, 12)) { eShapeType = XmlShapeTypeHandoutShape; }
1185*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("HeaderShape", 26, 11)) { eShapeType = XmlShapeTypePresHeaderShape; }
1186*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("FooterShape", 26, 11)) { eShapeType = XmlShapeTypePresFooterShape; }
1187*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("SlideNumberShape", 26, 16)) { eShapeType = XmlShapeTypePresSlideNumberShape; }
1188*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("DateTimeShape", 26, 13)) { eShapeType = XmlShapeTypePresDateTimeShape; }
1189*b1cdbd2cSJim Jagielski 				else if(aType.EqualsAscii("MediaShape", 26, 10)) { eShapeType = XmlShapeTypePresMediaShape; }
1190*b1cdbd2cSJim Jagielski 			}
1191*b1cdbd2cSJim Jagielski 		}
1192*b1cdbd2cSJim Jagielski 	}
1193*b1cdbd2cSJim Jagielski }
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski extern SvXMLEnumMapEntry aXML_GlueAlignment_EnumMap[];
1198*b1cdbd2cSJim Jagielski extern SvXMLEnumMapEntry aXML_GlueEscapeDirection_EnumMap[];
1199*b1cdbd2cSJim Jagielski 
1200*b1cdbd2cSJim Jagielski /** exports all user defined glue points */
ImpExportGluePoints(const uno::Reference<drawing::XShape> & xShape)1201*b1cdbd2cSJim Jagielski void XMLShapeExport::ImpExportGluePoints( const uno::Reference< drawing::XShape >& xShape )
1202*b1cdbd2cSJim Jagielski {
1203*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XGluePointsSupplier > xSupplier( xShape, uno::UNO_QUERY );
1204*b1cdbd2cSJim Jagielski 	if( !xSupplier.is() )
1205*b1cdbd2cSJim Jagielski 		return;
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 	uno::Reference< container::XIdentifierAccess > xGluePoints( xSupplier->getGluePoints(), uno::UNO_QUERY );
1208*b1cdbd2cSJim Jagielski 	if( !xGluePoints.is() )
1209*b1cdbd2cSJim Jagielski 		return;
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski 	drawing::GluePoint2 aGluePoint;
1212*b1cdbd2cSJim Jagielski 
1213*b1cdbd2cSJim Jagielski 	uno::Sequence< sal_Int32 > aIdSequence( xGluePoints->getIdentifiers() );
1214*b1cdbd2cSJim Jagielski 
1215*b1cdbd2cSJim Jagielski 	const sal_Int32 nCount = aIdSequence.getLength();
1216*b1cdbd2cSJim Jagielski 	for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
1217*b1cdbd2cSJim Jagielski 	{
1218*b1cdbd2cSJim Jagielski 		const sal_Int32 nIdentifier = aIdSequence[nIndex];
1219*b1cdbd2cSJim Jagielski 		if( (xGluePoints->getByIdentifier( nIdentifier ) >>= aGluePoint) && aGluePoint.IsUserDefined )
1220*b1cdbd2cSJim Jagielski 		{
1221*b1cdbd2cSJim Jagielski 			// export only user defined glue points
1222*b1cdbd2cSJim Jagielski 
1223*b1cdbd2cSJim Jagielski 			const OUString sId( OUString::valueOf( nIdentifier ) );
1224*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_ID, sId );
1225*b1cdbd2cSJim Jagielski 
1226*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aGluePoint.Position.X);
1227*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X, msBuffer.makeStringAndClear());
1228*b1cdbd2cSJim Jagielski 
1229*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aGluePoint.Position.Y);
1230*b1cdbd2cSJim Jagielski 			mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y, msBuffer.makeStringAndClear());
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski 			if( !aGluePoint.IsRelative )
1233*b1cdbd2cSJim Jagielski 			{
1234*b1cdbd2cSJim Jagielski 				SvXMLUnitConverter::convertEnum( msBuffer, aGluePoint.PositionAlignment, aXML_GlueAlignment_EnumMap );
1235*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_ALIGN, msBuffer.makeStringAndClear() );
1236*b1cdbd2cSJim Jagielski 			}
1237*b1cdbd2cSJim Jagielski 
1238*b1cdbd2cSJim Jagielski 			if( aGluePoint.Escape != drawing::EscapeDirection_SMART )
1239*b1cdbd2cSJim Jagielski 			{
1240*b1cdbd2cSJim Jagielski 				SvXMLUnitConverter::convertEnum( msBuffer, aGluePoint.Escape, aXML_GlueEscapeDirection_EnumMap );
1241*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_ESCAPE_DIRECTION, msBuffer.makeStringAndClear() );
1242*b1cdbd2cSJim Jagielski 			}
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski 			SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_DRAW, XML_GLUE_POINT, sal_True, sal_True);
1245*b1cdbd2cSJim Jagielski 		}
1246*b1cdbd2cSJim Jagielski 	}
1247*b1cdbd2cSJim Jagielski }
1248*b1cdbd2cSJim Jagielski 
ExportGraphicDefaults()1249*b1cdbd2cSJim Jagielski void XMLShapeExport::ExportGraphicDefaults()
1250*b1cdbd2cSJim Jagielski {
1251*b1cdbd2cSJim Jagielski 	XMLStyleExport aStEx(mrExport, OUString(), mrExport.GetAutoStylePool().get());
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski 	// construct PropertySetMapper
1254*b1cdbd2cSJim Jagielski 	UniReference< SvXMLExportPropertyMapper > xPropertySetMapper( CreateShapePropMapper( mrExport ) );
1255*b1cdbd2cSJim Jagielski 	((XMLShapeExportPropertyMapper*)xPropertySetMapper.get())->SetAutoStyles( sal_False );
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski 	// chain text attributes
1258*b1cdbd2cSJim Jagielski 	xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(mrExport));
1259*b1cdbd2cSJim Jagielski 
1260*b1cdbd2cSJim Jagielski 	// chain special Writer/text frame default attributes
1261*b1cdbd2cSJim Jagielski     xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaDefaultExtPropMapper(mrExport));
1262*b1cdbd2cSJim Jagielski 
1263*b1cdbd2cSJim Jagielski 	// write graphic family default style
1264*b1cdbd2cSJim Jagielski 	uno::Reference< lang::XMultiServiceFactory > xFact( mrExport.GetModel(), uno::UNO_QUERY );
1265*b1cdbd2cSJim Jagielski 	if( xFact.is() )
1266*b1cdbd2cSJim Jagielski 	{
1267*b1cdbd2cSJim Jagielski 		try
1268*b1cdbd2cSJim Jagielski 		{
1269*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xDefaults( xFact->createInstance( OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.Defaults") ) ), uno::UNO_QUERY );
1270*b1cdbd2cSJim Jagielski 			if( xDefaults.is() )
1271*b1cdbd2cSJim Jagielski 			{
1272*b1cdbd2cSJim Jagielski 				aStEx.exportDefaultStyle( xDefaults, OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), xPropertySetMapper );
1273*b1cdbd2cSJim Jagielski 
1274*b1cdbd2cSJim Jagielski 				// write graphic family styles
1275*b1cdbd2cSJim Jagielski 				aStEx.exportStyleFamily("graphics", OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), xPropertySetMapper, sal_False, XML_STYLE_FAMILY_SD_GRAPHICS_ID);
1276*b1cdbd2cSJim Jagielski 			}
1277*b1cdbd2cSJim Jagielski 		}
1278*b1cdbd2cSJim Jagielski 		catch( lang::ServiceNotRegisteredException& )
1279*b1cdbd2cSJim Jagielski 		{
1280*b1cdbd2cSJim Jagielski 		}
1281*b1cdbd2cSJim Jagielski 	}
1282*b1cdbd2cSJim Jagielski }
1283*b1cdbd2cSJim Jagielski 
onExport(const com::sun::star::uno::Reference<com::sun::star::drawing::XShape> &)1284*b1cdbd2cSJim Jagielski void XMLShapeExport::onExport( const com::sun::star::uno::Reference < com::sun::star::drawing::XShape >& )
1285*b1cdbd2cSJim Jagielski {
1286*b1cdbd2cSJim Jagielski }
1287*b1cdbd2cSJim Jagielski 
GetShapeTableExport()1288*b1cdbd2cSJim Jagielski const rtl::Reference< XMLTableExport >& XMLShapeExport::GetShapeTableExport()
1289*b1cdbd2cSJim Jagielski {
1290*b1cdbd2cSJim Jagielski 	if( !mxShapeTableExport.is() )
1291*b1cdbd2cSJim Jagielski 	{
1292*b1cdbd2cSJim Jagielski 		rtl::Reference< XMLPropertyHandlerFactory > xFactory( new XMLSdPropHdlFactory( mrExport.GetModel(), mrExport ) );
1293*b1cdbd2cSJim Jagielski         UniReference < XMLPropertySetMapper > xMapper( new XMLShapePropertySetMapper( xFactory.get() ) );
1294*b1cdbd2cSJim Jagielski 		rtl::Reference< SvXMLExportPropertyMapper > xPropertySetMapper( new XMLShapeExportPropertyMapper( xMapper, (XMLTextListAutoStylePool*)&mrExport.GetTextParagraphExport()->GetListAutoStylePool(), mrExport ) );
1295*b1cdbd2cSJim Jagielski 		mxShapeTableExport = new XMLTableExport( mrExport, xPropertySetMapper, xFactory );
1296*b1cdbd2cSJim Jagielski 	}
1297*b1cdbd2cSJim Jagielski 
1298*b1cdbd2cSJim Jagielski 	return mxShapeTableExport;
1299*b1cdbd2cSJim Jagielski }
1300