xref: /aoo4110/main/xmloff/source/draw/ximpshap.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
23*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx"
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
26*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEventsSupplier.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameReplace.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/ClickAction.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/FillStyle.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/LineStyle.hpp>
31*b1cdbd2cSJim Jagielski #include "unointerfacetouniqueidentifiermapper.hxx"
32*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XGluePointsSupplier.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIdentifierAccess.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/GluePoint2.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/Alignment.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/EscapeDirection.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/media/ZoomLevel.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Rectangle.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
41*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx>
42*b1cdbd2cSJim Jagielski #include "ximpshap.hxx"
43*b1cdbd2cSJim Jagielski #include <xmloff/XMLBase64ImportContext.hxx>
44*b1cdbd2cSJim Jagielski #include <xmloff/XMLShapeStyleContext.hxx>
45*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNamed.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/CircleKind.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XControlModel.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XControlShape.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PointSequenceSequence.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PointSequence.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XCloneable.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XMultiPropertyStates.hpp>
57*b1cdbd2cSJim Jagielski #include "xexptran.hxx"
58*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySetInfo.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/ConnectorType.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/HomogenMatrix3.hpp>
62*b1cdbd2cSJim Jagielski #include "PropertySetMerger.hxx"
63*b1cdbd2cSJim Jagielski #include <xmloff/families.hxx>
64*b1cdbd2cSJim Jagielski #include "ximpstyl.hxx"
65*b1cdbd2cSJim Jagielski #include"xmloff/xmlnmspe.hxx"
66*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
67*b1cdbd2cSJim Jagielski #include "EnhancedCustomShapeToken.hxx"
68*b1cdbd2cSJim Jagielski #include "XMLReplacementImageContext.hxx"
69*b1cdbd2cSJim Jagielski #include "XMLImageMapContext.hxx"
70*b1cdbd2cSJim Jagielski #include "sdpropls.hxx"
71*b1cdbd2cSJim Jagielski #include "eventimp.hxx"
72*b1cdbd2cSJim Jagielski #include "descriptionimp.hxx"
73*b1cdbd2cSJim Jagielski #include "ximpcustomshape.hxx"
74*b1cdbd2cSJim Jagielski #include "XMLEmbeddedObjectImportContext.hxx"
75*b1cdbd2cSJim Jagielski #include "xmloff/xmlerror.hxx"
76*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
77*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
78*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp>
79*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
80*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextDocument.hpp>
81*b1cdbd2cSJim Jagielski #include <basegfx/vector/b2dvector.hxx>
82*b1cdbd2cSJim Jagielski #include <basegfx/point/b2dpoint.hxx>
83*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
84*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
85*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygontools.hxx>
86*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrixtools.hxx>
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski using ::rtl::OUString;
89*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
92*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
93*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::drawing;
94*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::style;
95*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
96*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::document;
97*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
98*b1cdbd2cSJim Jagielski using namespace ::xmloff::EnhancedCustomShapeToken;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski SvXMLEnumMapEntry aXML_GlueAlignment_EnumMap[] =
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski 	{ XML_TOP_LEFT, 	drawing::Alignment_TOP_LEFT },
103*b1cdbd2cSJim Jagielski 	{ XML_TOP,			drawing::Alignment_TOP },
104*b1cdbd2cSJim Jagielski 	{ XML_TOP_RIGHT,	drawing::Alignment_TOP_RIGHT },
105*b1cdbd2cSJim Jagielski 	{ XML_LEFT,		    drawing::Alignment_LEFT },
106*b1cdbd2cSJim Jagielski 	{ XML_CENTER,		drawing::Alignment_CENTER },
107*b1cdbd2cSJim Jagielski 	{ XML_RIGHT,		drawing::Alignment_RIGHT },
108*b1cdbd2cSJim Jagielski 	{ XML_BOTTOM_LEFT,	drawing::Alignment_BOTTOM_LEFT },
109*b1cdbd2cSJim Jagielski 	{ XML_BOTTOM,		drawing::Alignment_BOTTOM },
110*b1cdbd2cSJim Jagielski 	{ XML_BOTTOM_RIGHT, drawing::Alignment_BOTTOM_RIGHT },
111*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID, 0 }
112*b1cdbd2cSJim Jagielski };
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski SvXMLEnumMapEntry aXML_GlueEscapeDirection_EnumMap[] =
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski 	{ XML_AUTO, 		drawing::EscapeDirection_SMART },
117*b1cdbd2cSJim Jagielski 	{ XML_LEFT,	    	drawing::EscapeDirection_LEFT },
118*b1cdbd2cSJim Jagielski     { XML_RIGHT,		drawing::EscapeDirection_RIGHT },
119*b1cdbd2cSJim Jagielski     { XML_UP,			drawing::EscapeDirection_UP },
120*b1cdbd2cSJim Jagielski     { XML_DOWN,		    drawing::EscapeDirection_DOWN },
121*b1cdbd2cSJim Jagielski     { XML_HORIZONTAL,	drawing::EscapeDirection_HORIZONTAL },
122*b1cdbd2cSJim Jagielski     { XML_VERTICAL,	    drawing::EscapeDirection_VERTICAL },
123*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID, 0 }
124*b1cdbd2cSJim Jagielski };
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
127*b1cdbd2cSJim Jagielski 
ImpIsEmptyURL(const::rtl::OUString & rURL)128*b1cdbd2cSJim Jagielski static bool ImpIsEmptyURL( const ::rtl::OUString& rURL )
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski     if( rURL.getLength() == 0 )
131*b1cdbd2cSJim Jagielski         return true;
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski     // #i13140# Also compare against 'toplevel' URLs. which also
134*b1cdbd2cSJim Jagielski     // result in empty filename strings.
135*b1cdbd2cSJim Jagielski     if( 0 == rURL.compareToAscii( "#./" ) )
136*b1cdbd2cSJim Jagielski         return true;
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     return false;
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski TYPEINIT1( SvXMLShapeContext, SvXMLImportContext );
144*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLShapeContext, SvXMLShapeContext );
145*b1cdbd2cSJim Jagielski 
SdXMLShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)146*b1cdbd2cSJim Jagielski SdXMLShapeContext::SdXMLShapeContext(
147*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
148*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
149*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
150*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
151*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
152*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
153*b1cdbd2cSJim Jagielski :	SvXMLShapeContext( rImport, nPrfx, rLocalName, bTemporaryShape )
154*b1cdbd2cSJim Jagielski ,	mxShapes( rShapes )
155*b1cdbd2cSJim Jagielski ,	mxAttrList(xAttrList)
156*b1cdbd2cSJim Jagielski ,	mbListContextPushed( false )
157*b1cdbd2cSJim Jagielski ,	mnStyleFamily(XML_STYLE_FAMILY_SD_GRAPHICS_ID)
158*b1cdbd2cSJim Jagielski ,	mbIsPlaceholder(sal_False)
159*b1cdbd2cSJim Jagielski ,	mbClearDefaultAttributes( true )
160*b1cdbd2cSJim Jagielski ,	mbIsUserTransformed(sal_False)
161*b1cdbd2cSJim Jagielski ,	mnZOrder(-1)
162*b1cdbd2cSJim Jagielski ,	maSize(1, 1)
163*b1cdbd2cSJim Jagielski ,	maPosition(0, 0)
164*b1cdbd2cSJim Jagielski ,   maUsedTransformation()
165*b1cdbd2cSJim Jagielski ,	mbVisible(true)
166*b1cdbd2cSJim Jagielski ,	mbPrintable(true)
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
171*b1cdbd2cSJim Jagielski 
~SdXMLShapeContext()172*b1cdbd2cSJim Jagielski SdXMLShapeContext::~SdXMLShapeContext()
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski }
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
177*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 p_nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)178*b1cdbd2cSJim Jagielski SvXMLImportContext *SdXMLShapeContext::CreateChildContext( sal_uInt16 p_nPrefix,
179*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
180*b1cdbd2cSJim Jagielski 	const uno::Reference< xml::sax::XAttributeList>& xAttrList )
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski 	SvXMLImportContext * pContext = NULL;
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 	// #i68101#
185*b1cdbd2cSJim Jagielski 	if( p_nPrefix == XML_NAMESPACE_SVG &&
186*b1cdbd2cSJim Jagielski 		(IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) )
187*b1cdbd2cSJim Jagielski 	{
188*b1cdbd2cSJim Jagielski 		pContext = new SdXMLDescriptionContext( GetImport(), p_nPrefix, rLocalName, xAttrList, mxShape );
189*b1cdbd2cSJim Jagielski 	}
190*b1cdbd2cSJim Jagielski 	else if( p_nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) )
191*b1cdbd2cSJim Jagielski 	{
192*b1cdbd2cSJim Jagielski 		pContext = new SdXMLEventsContext( GetImport(), p_nPrefix, rLocalName, xAttrList, mxShape );
193*b1cdbd2cSJim Jagielski 	}
194*b1cdbd2cSJim Jagielski 	else if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_GLUE_POINT ) )
195*b1cdbd2cSJim Jagielski 	{
196*b1cdbd2cSJim Jagielski 		addGluePoint( xAttrList );
197*b1cdbd2cSJim Jagielski 	}
198*b1cdbd2cSJim Jagielski 	else if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_THUMBNAIL ) )
199*b1cdbd2cSJim Jagielski 	{
200*b1cdbd2cSJim Jagielski 		// search attributes for xlink:href
201*b1cdbd2cSJim Jagielski 		sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
202*b1cdbd2cSJim Jagielski 		for(sal_Int16 i=0; i < nAttrCount; i++)
203*b1cdbd2cSJim Jagielski 		{
204*b1cdbd2cSJim Jagielski 			OUString sAttrName = xAttrList->getNameByIndex( i );
205*b1cdbd2cSJim Jagielski 			OUString aLocalName;
206*b1cdbd2cSJim Jagielski 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 			if( nPrefix == XML_NAMESPACE_XLINK )
209*b1cdbd2cSJim Jagielski 			{
210*b1cdbd2cSJim Jagielski 				if( IsXMLToken( aLocalName, XML_HREF ) )
211*b1cdbd2cSJim Jagielski 				{
212*b1cdbd2cSJim Jagielski 					maThumbnailURL = xAttrList->getValueByIndex( i );
213*b1cdbd2cSJim Jagielski 					break;
214*b1cdbd2cSJim Jagielski 				}
215*b1cdbd2cSJim Jagielski 			}
216*b1cdbd2cSJim Jagielski 		}
217*b1cdbd2cSJim Jagielski 	}
218*b1cdbd2cSJim Jagielski 	else
219*b1cdbd2cSJim Jagielski 	{
220*b1cdbd2cSJim Jagielski 		// create text cursor on demand
221*b1cdbd2cSJim Jagielski 		if( !mxCursor.is() )
222*b1cdbd2cSJim Jagielski 		{
223*b1cdbd2cSJim Jagielski 			uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
224*b1cdbd2cSJim Jagielski 			if( xText.is() )
225*b1cdbd2cSJim Jagielski 			{
226*b1cdbd2cSJim Jagielski 				UniReference < XMLTextImportHelper > xTxtImport =
227*b1cdbd2cSJim Jagielski 					GetImport().GetTextImport();
228*b1cdbd2cSJim Jagielski 				mxOldCursor = xTxtImport->GetCursor();
229*b1cdbd2cSJim Jagielski 				mxCursor = xText->createTextCursor();
230*b1cdbd2cSJim Jagielski 				if( mxCursor.is() )
231*b1cdbd2cSJim Jagielski 				{
232*b1cdbd2cSJim Jagielski 					xTxtImport->SetCursor( mxCursor );
233*b1cdbd2cSJim Jagielski 				}
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski 				// remember old list item and block (#91964#) and reset them
236*b1cdbd2cSJim Jagielski 				// for the text frame
237*b1cdbd2cSJim Jagielski                 xTxtImport->PushListContext();
238*b1cdbd2cSJim Jagielski                 mbListContextPushed = true;
239*b1cdbd2cSJim Jagielski 			}
240*b1cdbd2cSJim Jagielski 		}
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 		// if we have a text cursor, lets  try to import some text
243*b1cdbd2cSJim Jagielski 		if( mxCursor.is() )
244*b1cdbd2cSJim Jagielski 		{
245*b1cdbd2cSJim Jagielski 			pContext = GetImport().GetTextImport()->CreateTextChildContext(
246*b1cdbd2cSJim Jagielski 				GetImport(), p_nPrefix, rLocalName, xAttrList );
247*b1cdbd2cSJim Jagielski 		}
248*b1cdbd2cSJim Jagielski 	}
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 	// call parent for content
251*b1cdbd2cSJim Jagielski 	if(!pContext)
252*b1cdbd2cSJim Jagielski 		pContext = SvXMLImportContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 	return pContext;
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski 
addGluePoint(const uno::Reference<xml::sax::XAttributeList> & xAttrList)257*b1cdbd2cSJim Jagielski void SdXMLShapeContext::addGluePoint( const uno::Reference< xml::sax::XAttributeList>& xAttrList )
258*b1cdbd2cSJim Jagielski {
259*b1cdbd2cSJim Jagielski 	// get the glue points container for this shape if its not already there
260*b1cdbd2cSJim Jagielski 	if( !mxGluePoints.is() )
261*b1cdbd2cSJim Jagielski 	{
262*b1cdbd2cSJim Jagielski 		uno::Reference< drawing::XGluePointsSupplier > xSupplier( mxShape, uno::UNO_QUERY );
263*b1cdbd2cSJim Jagielski 		if( !xSupplier.is() )
264*b1cdbd2cSJim Jagielski 			return;
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 		mxGluePoints = uno::Reference< container::XIdentifierContainer >::query( xSupplier->getGluePoints() );
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski 		if( !mxGluePoints.is() )
269*b1cdbd2cSJim Jagielski 			return;
270*b1cdbd2cSJim Jagielski 	}
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 	drawing::GluePoint2 aGluePoint;
273*b1cdbd2cSJim Jagielski 	aGluePoint.IsUserDefined = sal_True;
274*b1cdbd2cSJim Jagielski 	aGluePoint.Position.X = 0;
275*b1cdbd2cSJim Jagielski 	aGluePoint.Position.Y = 0;
276*b1cdbd2cSJim Jagielski 	aGluePoint.Escape = drawing::EscapeDirection_SMART;
277*b1cdbd2cSJim Jagielski 	aGluePoint.PositionAlignment = drawing::Alignment_CENTER;
278*b1cdbd2cSJim Jagielski 	aGluePoint.IsRelative = sal_True;
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 	sal_Int32 nId = -1;
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 	// read attributes for the 3DScene
283*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
284*b1cdbd2cSJim Jagielski 	for(sal_Int16 i=0; i < nAttrCount; i++)
285*b1cdbd2cSJim Jagielski 	{
286*b1cdbd2cSJim Jagielski 		OUString sAttrName = xAttrList->getNameByIndex( i );
287*b1cdbd2cSJim Jagielski 		OUString aLocalName;
288*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
289*b1cdbd2cSJim Jagielski 		const OUString sValue( xAttrList->getValueByIndex( i ) );
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski 		if( nPrefix == XML_NAMESPACE_SVG )
292*b1cdbd2cSJim Jagielski 		{
293*b1cdbd2cSJim Jagielski 			if( IsXMLToken( aLocalName, XML_X ) )
294*b1cdbd2cSJim Jagielski 			{
295*b1cdbd2cSJim Jagielski 				GetImport().GetMM100UnitConverter().convertMeasure(aGluePoint.Position.X, sValue);
296*b1cdbd2cSJim Jagielski 			}
297*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( aLocalName, XML_Y ) )
298*b1cdbd2cSJim Jagielski 			{
299*b1cdbd2cSJim Jagielski 				GetImport().GetMM100UnitConverter().convertMeasure(aGluePoint.Position.Y, sValue);
300*b1cdbd2cSJim Jagielski 			}
301*b1cdbd2cSJim Jagielski 		}
302*b1cdbd2cSJim Jagielski 		else if( nPrefix == XML_NAMESPACE_DRAW )
303*b1cdbd2cSJim Jagielski 		{
304*b1cdbd2cSJim Jagielski 			if( IsXMLToken( aLocalName, XML_ID ) )
305*b1cdbd2cSJim Jagielski 			{
306*b1cdbd2cSJim Jagielski 				nId = sValue.toInt32();
307*b1cdbd2cSJim Jagielski 			}
308*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( aLocalName, XML_ALIGN ) )
309*b1cdbd2cSJim Jagielski 			{
310*b1cdbd2cSJim Jagielski 				sal_uInt16 eKind;
311*b1cdbd2cSJim Jagielski 				if( SvXMLUnitConverter::convertEnum( eKind, sValue, aXML_GlueAlignment_EnumMap ) )
312*b1cdbd2cSJim Jagielski 				{
313*b1cdbd2cSJim Jagielski 					aGluePoint.PositionAlignment = (drawing::Alignment)eKind;
314*b1cdbd2cSJim Jagielski 					aGluePoint.IsRelative = sal_False;
315*b1cdbd2cSJim Jagielski 				}
316*b1cdbd2cSJim Jagielski 			}
317*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( aLocalName, XML_ESCAPE_DIRECTION ) )
318*b1cdbd2cSJim Jagielski 			{
319*b1cdbd2cSJim Jagielski 				sal_uInt16 eKind;
320*b1cdbd2cSJim Jagielski 				if( SvXMLUnitConverter::convertEnum( eKind, sValue, aXML_GlueEscapeDirection_EnumMap ) )
321*b1cdbd2cSJim Jagielski 				{
322*b1cdbd2cSJim Jagielski 					aGluePoint.Escape = (drawing::EscapeDirection)eKind;
323*b1cdbd2cSJim Jagielski 				}
324*b1cdbd2cSJim Jagielski 			}
325*b1cdbd2cSJim Jagielski 		}
326*b1cdbd2cSJim Jagielski 	}
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 	if( nId != -1 )
329*b1cdbd2cSJim Jagielski 	{
330*b1cdbd2cSJim Jagielski 		try
331*b1cdbd2cSJim Jagielski 		{
332*b1cdbd2cSJim Jagielski 			sal_Int32 nInternalId = mxGluePoints->insert( uno::makeAny( aGluePoint ) );
333*b1cdbd2cSJim Jagielski 			GetImport().GetShapeImport()->addGluePointMapping( mxShape, nId, nInternalId );
334*b1cdbd2cSJim Jagielski 		}
335*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
336*b1cdbd2cSJim Jagielski 		{
337*b1cdbd2cSJim Jagielski 			DBG_ERROR( "exception during setting of glue points!");
338*b1cdbd2cSJim Jagielski 		}
339*b1cdbd2cSJim Jagielski 	}
340*b1cdbd2cSJim Jagielski }
341*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
342*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> &)343*b1cdbd2cSJim Jagielski void SdXMLShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
344*b1cdbd2cSJim Jagielski {
345*b1cdbd2cSJim Jagielski     GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
346*b1cdbd2cSJim Jagielski }
347*b1cdbd2cSJim Jagielski 
EndElement()348*b1cdbd2cSJim Jagielski void SdXMLShapeContext::EndElement()
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski 	if(mxCursor.is())
351*b1cdbd2cSJim Jagielski 	{
352*b1cdbd2cSJim Jagielski 		// delete addition newline
353*b1cdbd2cSJim Jagielski 		const OUString aEmpty;
354*b1cdbd2cSJim Jagielski 		mxCursor->gotoEnd( sal_False );
355*b1cdbd2cSJim Jagielski 		mxCursor->goLeft( 1, sal_True );
356*b1cdbd2cSJim Jagielski 		mxCursor->setString( aEmpty );
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 		// reset cursor
359*b1cdbd2cSJim Jagielski 		GetImport().GetTextImport()->ResetCursor();
360*b1cdbd2cSJim Jagielski 	}
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski 	if(mxOldCursor.is())
363*b1cdbd2cSJim Jagielski 		GetImport().GetTextImport()->SetCursor( mxOldCursor );
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski     // reinstall old list item (if necessary) #91964#
366*b1cdbd2cSJim Jagielski     if (mbListContextPushed) {
367*b1cdbd2cSJim Jagielski         GetImport().GetTextImport()->PopListContext();
368*b1cdbd2cSJim Jagielski     }
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 	if( msHyperlink.getLength() != 0 ) try
371*b1cdbd2cSJim Jagielski 	{
372*b1cdbd2cSJim Jagielski 		const OUString sBookmark( RTL_CONSTASCII_USTRINGPARAM( "Bookmark" ) );
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski         Reference< XEventsSupplier > xEventsSupplier( mxShape, UNO_QUERY );
375*b1cdbd2cSJim Jagielski 		if( xEventsSupplier.is() )
376*b1cdbd2cSJim Jagielski 		{
377*b1cdbd2cSJim Jagielski 			const OUString sEventType( RTL_CONSTASCII_USTRINGPARAM( "EventType" ) );
378*b1cdbd2cSJim Jagielski 			const OUString sClickAction( RTL_CONSTASCII_USTRINGPARAM( "ClickAction" ) );
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 			Reference< XNameReplace > xEvents( xEventsSupplier->getEvents(), UNO_QUERY_THROW );
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 			uno::Sequence< beans::PropertyValue > aProperties( 3 );
383*b1cdbd2cSJim Jagielski 			aProperties[0].Name = sEventType;
384*b1cdbd2cSJim Jagielski 			aProperties[0].Handle = -1;
385*b1cdbd2cSJim Jagielski 			aProperties[0].Value <<= OUString( RTL_CONSTASCII_USTRINGPARAM("Presentation") );
386*b1cdbd2cSJim Jagielski 			aProperties[0].State = beans::PropertyState_DIRECT_VALUE;
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 			aProperties[1].Name = sClickAction;
389*b1cdbd2cSJim Jagielski 			aProperties[1].Handle = -1;
390*b1cdbd2cSJim Jagielski 			aProperties[1].Value <<= ::com::sun::star::presentation::ClickAction_DOCUMENT;
391*b1cdbd2cSJim Jagielski 			aProperties[1].State = beans::PropertyState_DIRECT_VALUE;
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski 			aProperties[2].Name = sBookmark;
394*b1cdbd2cSJim Jagielski 			aProperties[2].Handle = -1;
395*b1cdbd2cSJim Jagielski 			aProperties[2].Value <<= msHyperlink;
396*b1cdbd2cSJim Jagielski 			aProperties[2].State = beans::PropertyState_DIRECT_VALUE;
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 			const OUString sAPIEventName( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) );
399*b1cdbd2cSJim Jagielski 			xEvents->replaceByName( sAPIEventName, Any( aProperties ) );
400*b1cdbd2cSJim Jagielski 		}
401*b1cdbd2cSJim Jagielski 		else
402*b1cdbd2cSJim Jagielski 		{
403*b1cdbd2cSJim Jagielski 			// in draw use the Bookmark property
404*b1cdbd2cSJim Jagielski 			Reference< beans::XPropertySet > xSet( mxShape, UNO_QUERY_THROW );
405*b1cdbd2cSJim Jagielski 			xSet->setPropertyValue( sBookmark, Any( msHyperlink ) );
406*b1cdbd2cSJim Jagielski 			xSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) ), Any( ::com::sun::star::presentation::ClickAction_DOCUMENT ) );
407*b1cdbd2cSJim Jagielski 		}
408*b1cdbd2cSJim Jagielski 	}
409*b1cdbd2cSJim Jagielski 	catch( Exception& )
410*b1cdbd2cSJim Jagielski 	{
411*b1cdbd2cSJim Jagielski 		DBG_ERROR("xmloff::SdXMLShapeContext::EndElement(), exception caught while setting hyperlink!");
412*b1cdbd2cSJim Jagielski 	}
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski 	if( mxLockable.is() )
415*b1cdbd2cSJim Jagielski 		mxLockable->removeActionLock();
416*b1cdbd2cSJim Jagielski }
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
419*b1cdbd2cSJim Jagielski 
AddShape(uno::Reference<drawing::XShape> & xShape)420*b1cdbd2cSJim Jagielski void SdXMLShapeContext::AddShape(uno::Reference< drawing::XShape >& xShape)
421*b1cdbd2cSJim Jagielski {
422*b1cdbd2cSJim Jagielski 	if(xShape.is())
423*b1cdbd2cSJim Jagielski 	{
424*b1cdbd2cSJim Jagielski 		// set shape local
425*b1cdbd2cSJim Jagielski 		mxShape = xShape;
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 		if(maShapeName.getLength())
428*b1cdbd2cSJim Jagielski 		{
429*b1cdbd2cSJim Jagielski 			uno::Reference< container::XNamed > xNamed( mxShape, uno::UNO_QUERY );
430*b1cdbd2cSJim Jagielski 			if( xNamed.is() )
431*b1cdbd2cSJim Jagielski 				xNamed->setName( maShapeName );
432*b1cdbd2cSJim Jagielski 		}
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski 		UniReference< XMLShapeImportHelper > xImp( GetImport().GetShapeImport() );
435*b1cdbd2cSJim Jagielski 		xImp->addShape( xShape, mxAttrList, mxShapes );
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski 		if( mbClearDefaultAttributes )
438*b1cdbd2cSJim Jagielski 		{
439*b1cdbd2cSJim Jagielski 	        uno::Reference<beans::XMultiPropertyStates> xMultiPropertyStates(xShape, uno::UNO_QUERY );
440*b1cdbd2cSJim Jagielski 		    if (xMultiPropertyStates.is())
441*b1cdbd2cSJim Jagielski 			    xMultiPropertyStates->setAllPropertiesToDefault();
442*b1cdbd2cSJim Jagielski 		}
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski 		if( !mbVisible || !mbPrintable ) try
445*b1cdbd2cSJim Jagielski 		{
446*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY_THROW );
447*b1cdbd2cSJim Jagielski 			if( !mbVisible )
448*b1cdbd2cSJim Jagielski 				xSet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Visible" ) ), uno::Any( sal_False ) );
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski 			if( !mbPrintable )
451*b1cdbd2cSJim Jagielski 				xSet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Printable" ) ), uno::Any( sal_False ) );
452*b1cdbd2cSJim Jagielski 		}
453*b1cdbd2cSJim Jagielski 		catch( Exception& )
454*b1cdbd2cSJim Jagielski 		{
455*b1cdbd2cSJim Jagielski 			DBG_ERROR( "SdXMLShapeContext::AddShape(), exception caught!" );
456*b1cdbd2cSJim Jagielski 		}
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski 		// #107848#
459*b1cdbd2cSJim Jagielski 		if(!mbTemporaryShape && (!GetImport().HasTextImport()
460*b1cdbd2cSJim Jagielski 			|| !GetImport().GetTextImport()->IsInsideDeleteContext()))
461*b1cdbd2cSJim Jagielski 		{
462*b1cdbd2cSJim Jagielski 			xImp->shapeWithZIndexAdded( xShape, mnZOrder );
463*b1cdbd2cSJim Jagielski 		}
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski 		if( maShapeId.getLength() )
466*b1cdbd2cSJim Jagielski 		{
467*b1cdbd2cSJim Jagielski             const SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(this);
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski             /* avoid registering when LateRegister is needed. E.g. MultiImage support where in-between multiple
470*b1cdbd2cSJim Jagielski                xShapes with the same ID would be registered. Registration is done after deciding which image
471*b1cdbd2cSJim Jagielski                to keep, see calls to solveMultipleImages */
472*b1cdbd2cSJim Jagielski             if(!pGSC || !pGSC->getLateAddToIdentifierMapper())
473*b1cdbd2cSJim Jagielski             {
474*b1cdbd2cSJim Jagielski                 uno::Reference< uno::XInterface > xRef( xShape, uno::UNO_QUERY );
475*b1cdbd2cSJim Jagielski                 GetImport().getInterfaceToIdentifierMapper().registerReference( maShapeId, xRef );
476*b1cdbd2cSJim Jagielski             }
477*b1cdbd2cSJim Jagielski 		}
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 		// #91065# count only if counting for shape import is enabled
480*b1cdbd2cSJim Jagielski 		if(GetImport().GetShapeImport()->IsHandleProgressBarEnabled())
481*b1cdbd2cSJim Jagielski 		{
482*b1cdbd2cSJim Jagielski 			// #80365# increment progress bar at load once for each draw object
483*b1cdbd2cSJim Jagielski 			GetImport().GetProgressBarHelper()->Increment();
484*b1cdbd2cSJim Jagielski 		}
485*b1cdbd2cSJim Jagielski 	}
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 	mxLockable = uno::Reference< document::XActionLockable >::query( xShape );
488*b1cdbd2cSJim Jagielski 
489*b1cdbd2cSJim Jagielski 	if( mxLockable.is() )
490*b1cdbd2cSJim Jagielski 		mxLockable->addActionLock();
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
495*b1cdbd2cSJim Jagielski 
AddShape(const char * pServiceName)496*b1cdbd2cSJim Jagielski void SdXMLShapeContext::AddShape(const char* pServiceName )
497*b1cdbd2cSJim Jagielski {
498*b1cdbd2cSJim Jagielski 	uno::Reference< lang::XMultiServiceFactory > xServiceFact(GetImport().GetModel(), uno::UNO_QUERY);
499*b1cdbd2cSJim Jagielski 	if(xServiceFact.is())
500*b1cdbd2cSJim Jagielski 	{
501*b1cdbd2cSJim Jagielski         try
502*b1cdbd2cSJim Jagielski         {
503*b1cdbd2cSJim Jagielski             // --> OD 2006-02-22 #b6382898#
504*b1cdbd2cSJim Jagielski             // Since fix for issue i33294 the Writer model doesn't support
505*b1cdbd2cSJim Jagielski             // com.sun.star.drawing.OLE2Shape anymore.
506*b1cdbd2cSJim Jagielski             // To handle Draw OLE objects it's decided to import these
507*b1cdbd2cSJim Jagielski             // objects as com.sun.star.drawing.OLE2Shape and convert these
508*b1cdbd2cSJim Jagielski             // objects after the import into com.sun.star.drawing.GraphicObjectShape.
509*b1cdbd2cSJim Jagielski             uno::Reference< drawing::XShape > xShape;
510*b1cdbd2cSJim Jagielski             if ( OUString::createFromAscii(pServiceName).compareToAscii( "com.sun.star.drawing.OLE2Shape" ) == 0 &&
511*b1cdbd2cSJim Jagielski                  uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() )
512*b1cdbd2cSJim Jagielski             {
513*b1cdbd2cSJim Jagielski                 xShape = uno::Reference< drawing::XShape >(xServiceFact->createInstance(OUString::createFromAscii("com.sun.star.drawing.temporaryForXMLImportOLE2Shape")), uno::UNO_QUERY);
514*b1cdbd2cSJim Jagielski             }
515*b1cdbd2cSJim Jagielski             else
516*b1cdbd2cSJim Jagielski             {
517*b1cdbd2cSJim Jagielski                 xShape = uno::Reference< drawing::XShape >(xServiceFact->createInstance(OUString::createFromAscii(pServiceName)), uno::UNO_QUERY);
518*b1cdbd2cSJim Jagielski             }
519*b1cdbd2cSJim Jagielski             // <--
520*b1cdbd2cSJim Jagielski             if( xShape.is() )
521*b1cdbd2cSJim Jagielski                 AddShape( xShape );
522*b1cdbd2cSJim Jagielski         }
523*b1cdbd2cSJim Jagielski         catch( const uno::Exception& e )
524*b1cdbd2cSJim Jagielski         {
525*b1cdbd2cSJim Jagielski             uno::Sequence<rtl::OUString> aSeq( 1 );
526*b1cdbd2cSJim Jagielski             aSeq[0] = OUString::createFromAscii(pServiceName);
527*b1cdbd2cSJim Jagielski             GetImport().SetError( XMLERROR_FLAG_ERROR | XMLERROR_API,
528*b1cdbd2cSJim Jagielski                                   aSeq, e.Message, NULL );
529*b1cdbd2cSJim Jagielski         }
530*b1cdbd2cSJim Jagielski 	}
531*b1cdbd2cSJim Jagielski }
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
534*b1cdbd2cSJim Jagielski 
SetTransformation()535*b1cdbd2cSJim Jagielski void SdXMLShapeContext::SetTransformation()
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski 	if(mxShape.is())
538*b1cdbd2cSJim Jagielski 	{
539*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
540*b1cdbd2cSJim Jagielski 		if(xPropSet.is())
541*b1cdbd2cSJim Jagielski 		{
542*b1cdbd2cSJim Jagielski 			maUsedTransformation.identity();
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 			if(maSize.Width != 1 || maSize.Height != 1)
545*b1cdbd2cSJim Jagielski 			{
546*b1cdbd2cSJim Jagielski 				// take care there are no zeros used by error
547*b1cdbd2cSJim Jagielski 				if(0 == maSize.Width)
548*b1cdbd2cSJim Jagielski 					maSize.Width = 1;
549*b1cdbd2cSJim Jagielski 				if(0 == maSize.Height)
550*b1cdbd2cSJim Jagielski 					maSize.Height = 1;
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski 				// set global size. This should always be used.
553*b1cdbd2cSJim Jagielski 				maUsedTransformation.scale(maSize.Width, maSize.Height);
554*b1cdbd2cSJim Jagielski 			}
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski 			if(maPosition.X != 0 || maPosition.Y != 0)
557*b1cdbd2cSJim Jagielski 			{
558*b1cdbd2cSJim Jagielski 				// if global position is used, add it to transformation
559*b1cdbd2cSJim Jagielski 				maUsedTransformation.translate(maPosition.X, maPosition.Y);
560*b1cdbd2cSJim Jagielski 			}
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski 			if(mnTransform.NeedsAction())
563*b1cdbd2cSJim Jagielski 			{
564*b1cdbd2cSJim Jagielski 				// transformation is used, apply to object.
565*b1cdbd2cSJim Jagielski 				// NOTICE: The transformation is applied AFTER evtl. used
566*b1cdbd2cSJim Jagielski 				// global positioning and scaling is used, so any shear or
567*b1cdbd2cSJim Jagielski 				// rotate used herein is applied around the (0,0) position
568*b1cdbd2cSJim Jagielski 				// of the PAGE object !!!
569*b1cdbd2cSJim Jagielski 				::basegfx::B2DHomMatrix aMat;
570*b1cdbd2cSJim Jagielski 				mnTransform.GetFullTransform(aMat);
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski 				// now add to transformation
573*b1cdbd2cSJim Jagielski 				maUsedTransformation *= aMat;
574*b1cdbd2cSJim Jagielski 			}
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 			// now set transformation for this object
577*b1cdbd2cSJim Jagielski 			uno::Any aAny;
578*b1cdbd2cSJim Jagielski 			drawing::HomogenMatrix3 aMatrix;
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski 			aMatrix.Line1.Column1 = maUsedTransformation.get(0, 0);
581*b1cdbd2cSJim Jagielski 			aMatrix.Line1.Column2 = maUsedTransformation.get(0, 1);
582*b1cdbd2cSJim Jagielski 			aMatrix.Line1.Column3 = maUsedTransformation.get(0, 2);
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski 			aMatrix.Line2.Column1 = maUsedTransformation.get(1, 0);
585*b1cdbd2cSJim Jagielski 			aMatrix.Line2.Column2 = maUsedTransformation.get(1, 1);
586*b1cdbd2cSJim Jagielski 			aMatrix.Line2.Column3 = maUsedTransformation.get(1, 2);
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski 			aMatrix.Line3.Column1 = maUsedTransformation.get(2, 0);
589*b1cdbd2cSJim Jagielski 			aMatrix.Line3.Column2 = maUsedTransformation.get(2, 1);
590*b1cdbd2cSJim Jagielski 			aMatrix.Line3.Column3 = maUsedTransformation.get(2, 2);
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 			aAny <<= aMatrix;
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski 			xPropSet->setPropertyValue(
595*b1cdbd2cSJim Jagielski 				OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation")), aAny);
596*b1cdbd2cSJim Jagielski         }
597*b1cdbd2cSJim Jagielski 	}
598*b1cdbd2cSJim Jagielski }
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
601*b1cdbd2cSJim Jagielski 
SetStyle(bool bSupportsStyle)602*b1cdbd2cSJim Jagielski void SdXMLShapeContext::SetStyle( bool bSupportsStyle /* = true */)
603*b1cdbd2cSJim Jagielski {
604*b1cdbd2cSJim Jagielski 	try
605*b1cdbd2cSJim Jagielski 	{
606*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
607*b1cdbd2cSJim Jagielski 		if( !xPropSet.is() )
608*b1cdbd2cSJim Jagielski 			return;
609*b1cdbd2cSJim Jagielski 
610*b1cdbd2cSJim Jagielski 		do
611*b1cdbd2cSJim Jagielski 		{
612*b1cdbd2cSJim Jagielski 			XMLPropStyleContext* pDocStyle = NULL;
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski 			// set style on shape
615*b1cdbd2cSJim Jagielski 			if(maDrawStyleName.getLength() == 0)
616*b1cdbd2cSJim Jagielski 				break;
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski 			const SvXMLStyleContext* pStyle = 0L;
619*b1cdbd2cSJim Jagielski 			sal_Bool bAutoStyle(sal_False);
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski 			if(GetImport().GetShapeImport()->GetAutoStylesContext())
622*b1cdbd2cSJim Jagielski 				pStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(mnStyleFamily, maDrawStyleName);
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski 			if(pStyle)
625*b1cdbd2cSJim Jagielski 				bAutoStyle = sal_True;
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski 			if(!pStyle && GetImport().GetShapeImport()->GetStylesContext())
628*b1cdbd2cSJim Jagielski 				pStyle = GetImport().GetShapeImport()->GetStylesContext()->FindStyleChildContext(mnStyleFamily, maDrawStyleName);
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 			OUString aStyleName = maDrawStyleName;
631*b1cdbd2cSJim Jagielski 			uno::Reference< style::XStyle > xStyle;
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski 			if( pStyle && pStyle->ISA(XMLShapeStyleContext) )
634*b1cdbd2cSJim Jagielski 			{
635*b1cdbd2cSJim Jagielski 				pDocStyle = PTR_CAST( XMLShapeStyleContext, pStyle );
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 				if( pDocStyle->GetStyle().is() )
638*b1cdbd2cSJim Jagielski 				{
639*b1cdbd2cSJim Jagielski 					xStyle = pDocStyle->GetStyle();
640*b1cdbd2cSJim Jagielski 				}
641*b1cdbd2cSJim Jagielski 				else
642*b1cdbd2cSJim Jagielski 				{
643*b1cdbd2cSJim Jagielski                     aStyleName = pDocStyle->GetParentName();
644*b1cdbd2cSJim Jagielski 				}
645*b1cdbd2cSJim Jagielski 			}
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 			if( !xStyle.is() && aStyleName.getLength() )
648*b1cdbd2cSJim Jagielski 			{
649*b1cdbd2cSJim Jagielski 				try
650*b1cdbd2cSJim Jagielski 				{
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski 					uno::Reference< style::XStyleFamiliesSupplier > xFamiliesSupplier( GetImport().GetModel(), uno::UNO_QUERY );
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski 					if( xFamiliesSupplier.is() )
655*b1cdbd2cSJim Jagielski 					{
656*b1cdbd2cSJim Jagielski 						uno::Reference< container::XNameAccess > xFamilies( xFamiliesSupplier->getStyleFamilies() );
657*b1cdbd2cSJim Jagielski 						if( xFamilies.is() )
658*b1cdbd2cSJim Jagielski 						{
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski 							uno::Reference< container::XNameAccess > xFamily;
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 							if( XML_STYLE_FAMILY_SD_PRESENTATION_ID == mnStyleFamily )
663*b1cdbd2cSJim Jagielski 							{
664*b1cdbd2cSJim Jagielski 								aStyleName = GetImport().GetStyleDisplayName(
665*b1cdbd2cSJim Jagielski 									XML_STYLE_FAMILY_SD_PRESENTATION_ID,
666*b1cdbd2cSJim Jagielski 									aStyleName );
667*b1cdbd2cSJim Jagielski 								sal_Int32 nPos = aStyleName.lastIndexOf( sal_Unicode('-') );
668*b1cdbd2cSJim Jagielski 								if( -1 != nPos )
669*b1cdbd2cSJim Jagielski 								{
670*b1cdbd2cSJim Jagielski 									OUString aFamily( aStyleName.copy( 0, nPos ) );
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski 									xFamilies->getByName( aFamily ) >>= xFamily;
673*b1cdbd2cSJim Jagielski 									aStyleName = aStyleName.copy( nPos + 1 );
674*b1cdbd2cSJim Jagielski 								}
675*b1cdbd2cSJim Jagielski 							}
676*b1cdbd2cSJim Jagielski 							else
677*b1cdbd2cSJim Jagielski 							{
678*b1cdbd2cSJim Jagielski 								// get graphics familie
679*b1cdbd2cSJim Jagielski 								xFamilies->getByName( OUString( RTL_CONSTASCII_USTRINGPARAM( "graphics" ) ) ) >>= xFamily;
680*b1cdbd2cSJim Jagielski 								aStyleName = GetImport().GetStyleDisplayName(
681*b1cdbd2cSJim Jagielski 									XML_STYLE_FAMILY_SD_GRAPHICS_ID,
682*b1cdbd2cSJim Jagielski 									aStyleName );
683*b1cdbd2cSJim Jagielski 							}
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski 							if( xFamily.is() )
686*b1cdbd2cSJim Jagielski 								xFamily->getByName( aStyleName ) >>= xStyle;
687*b1cdbd2cSJim Jagielski 						}
688*b1cdbd2cSJim Jagielski 					}
689*b1cdbd2cSJim Jagielski 				}
690*b1cdbd2cSJim Jagielski 				catch( uno::Exception& )
691*b1cdbd2cSJim Jagielski 				{
692*b1cdbd2cSJim Jagielski 					DBG_ERROR( "could not find style for shape!" );
693*b1cdbd2cSJim Jagielski 				}
694*b1cdbd2cSJim Jagielski 			}
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski 			if( bSupportsStyle && xStyle.is() )
697*b1cdbd2cSJim Jagielski 			{
698*b1cdbd2cSJim Jagielski 				try
699*b1cdbd2cSJim Jagielski 				{
700*b1cdbd2cSJim Jagielski 					// set style on object
701*b1cdbd2cSJim Jagielski 					uno::Any aAny;
702*b1cdbd2cSJim Jagielski 					aAny <<= xStyle;
703*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Style")), aAny);
704*b1cdbd2cSJim Jagielski 				}
705*b1cdbd2cSJim Jagielski 				catch( uno::Exception& )
706*b1cdbd2cSJim Jagielski 				{
707*b1cdbd2cSJim Jagielski 					DBG_ERROR( "could not find style for shape!" );
708*b1cdbd2cSJim Jagielski 				}
709*b1cdbd2cSJim Jagielski 			}
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 			// if this is an auto style, set its properties
712*b1cdbd2cSJim Jagielski 			if(bAutoStyle && pDocStyle)
713*b1cdbd2cSJim Jagielski 			{
714*b1cdbd2cSJim Jagielski 				// set PropertySet on object
715*b1cdbd2cSJim Jagielski 				pDocStyle->FillPropertySet(xPropSet);
716*b1cdbd2cSJim Jagielski 			}
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski 		} while(0);
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 		// try to set text auto style
721*b1cdbd2cSJim Jagielski 		do
722*b1cdbd2cSJim Jagielski 		{
723*b1cdbd2cSJim Jagielski 			// set style on shape
724*b1cdbd2cSJim Jagielski 			if( 0 == maTextStyleName.getLength() )
725*b1cdbd2cSJim Jagielski 				break;
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski 			if( NULL == GetImport().GetShapeImport()->GetAutoStylesContext())
728*b1cdbd2cSJim Jagielski 				break;
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski             const SvXMLStyleContext* pTempStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(XML_STYLE_FAMILY_TEXT_PARAGRAPH, maTextStyleName);
731*b1cdbd2cSJim Jagielski 			XMLPropStyleContext* pStyle = PTR_CAST( XMLPropStyleContext, pTempStyle ); // use temp var, PTR_CAST is a bad macro, FindStyleChildContext will be called twice
732*b1cdbd2cSJim Jagielski 			if( pStyle == NULL )
733*b1cdbd2cSJim Jagielski 				break;
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 			// set PropertySet on object
736*b1cdbd2cSJim Jagielski 			pStyle->FillPropertySet(xPropSet);
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski 		} while(0);
739*b1cdbd2cSJim Jagielski 	}
740*b1cdbd2cSJim Jagielski 	catch( uno::Exception& )
741*b1cdbd2cSJim Jagielski 	{
742*b1cdbd2cSJim Jagielski 	}
743*b1cdbd2cSJim Jagielski }
744*b1cdbd2cSJim Jagielski 
SetLayer()745*b1cdbd2cSJim Jagielski void SdXMLShapeContext::SetLayer()
746*b1cdbd2cSJim Jagielski {
747*b1cdbd2cSJim Jagielski 	if( maLayerName.getLength() )
748*b1cdbd2cSJim Jagielski 	{
749*b1cdbd2cSJim Jagielski 		try
750*b1cdbd2cSJim Jagielski 		{
751*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
752*b1cdbd2cSJim Jagielski 			if(xPropSet.is() )
753*b1cdbd2cSJim Jagielski 			{
754*b1cdbd2cSJim Jagielski 				uno::Any aAny;
755*b1cdbd2cSJim Jagielski 				aAny <<= maLayerName;
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("LayerName")), aAny);
758*b1cdbd2cSJim Jagielski 				return;
759*b1cdbd2cSJim Jagielski 			}
760*b1cdbd2cSJim Jagielski 		}
761*b1cdbd2cSJim Jagielski 		catch( uno::Exception e )
762*b1cdbd2cSJim Jagielski 		{
763*b1cdbd2cSJim Jagielski 		}
764*b1cdbd2cSJim Jagielski 	}
765*b1cdbd2cSJim Jagielski }
766*b1cdbd2cSJim Jagielski 
SetThumbnail()767*b1cdbd2cSJim Jagielski void SdXMLShapeContext::SetThumbnail()
768*b1cdbd2cSJim Jagielski {
769*b1cdbd2cSJim Jagielski 	if( 0 == maThumbnailURL.getLength() )
770*b1cdbd2cSJim Jagielski 		return;
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski 	try
773*b1cdbd2cSJim Jagielski 	{
774*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
775*b1cdbd2cSJim Jagielski 		if( !xPropSet.is() )
776*b1cdbd2cSJim Jagielski 			return;
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski 		const OUString sProperty(RTL_CONSTASCII_USTRINGPARAM("ThumbnailGraphicURL"));
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
781*b1cdbd2cSJim Jagielski 		if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName( sProperty ) )
782*b1cdbd2cSJim Jagielski 		{
783*b1cdbd2cSJim Jagielski 			// load the thumbnail graphic and export it to a wmf stream so we can set
784*b1cdbd2cSJim Jagielski 			// it at the api
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 			const OUString aInternalURL( GetImport().ResolveGraphicObjectURL( maThumbnailURL, sal_False ) );
787*b1cdbd2cSJim Jagielski 			xPropSet->setPropertyValue( sProperty, uno::makeAny( aInternalURL ) );
788*b1cdbd2cSJim Jagielski 		}
789*b1cdbd2cSJim Jagielski 	}
790*b1cdbd2cSJim Jagielski 	catch( uno::Exception e )
791*b1cdbd2cSJim Jagielski 	{
792*b1cdbd2cSJim Jagielski 	}
793*b1cdbd2cSJim Jagielski }
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)796*b1cdbd2cSJim Jagielski void SdXMLShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
797*b1cdbd2cSJim Jagielski {
798*b1cdbd2cSJim Jagielski     bool bHaveXmlId( false );
799*b1cdbd2cSJim Jagielski 	if( (XML_NAMESPACE_DRAW == nPrefix) || (XML_NAMESPACE_DRAW_EXT == nPrefix) )
800*b1cdbd2cSJim Jagielski 	{
801*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_ZINDEX ) )
802*b1cdbd2cSJim Jagielski 		{
803*b1cdbd2cSJim Jagielski 			mnZOrder = rValue.toInt32();
804*b1cdbd2cSJim Jagielski 		}
805*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_ID ) )
806*b1cdbd2cSJim Jagielski         {
807*b1cdbd2cSJim Jagielski             if (!bHaveXmlId) { maShapeId = rValue; };
808*b1cdbd2cSJim Jagielski         }
809*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_NAME ) )
810*b1cdbd2cSJim Jagielski 		{
811*b1cdbd2cSJim Jagielski 			maShapeName = rValue;
812*b1cdbd2cSJim Jagielski 		}
813*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_STYLE_NAME ) )
814*b1cdbd2cSJim Jagielski 		{
815*b1cdbd2cSJim Jagielski 			maDrawStyleName = rValue;
816*b1cdbd2cSJim Jagielski 		}
817*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_TEXT_STYLE_NAME ) )
818*b1cdbd2cSJim Jagielski 		{
819*b1cdbd2cSJim Jagielski 			maTextStyleName = rValue;
820*b1cdbd2cSJim Jagielski 		}
821*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_LAYER ) )
822*b1cdbd2cSJim Jagielski 		{
823*b1cdbd2cSJim Jagielski 			maLayerName = rValue;
824*b1cdbd2cSJim Jagielski 		}
825*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
826*b1cdbd2cSJim Jagielski 		{
827*b1cdbd2cSJim Jagielski 			mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter());
828*b1cdbd2cSJim Jagielski 		}
829*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_DISPLAY ) )
830*b1cdbd2cSJim Jagielski 		{
831*b1cdbd2cSJim Jagielski 			mbVisible = IsXMLToken( rValue, XML_ALWAYS ) || IsXMLToken( rValue, XML_SCREEN );
832*b1cdbd2cSJim Jagielski 			mbPrintable = IsXMLToken( rValue, XML_ALWAYS ) || IsXMLToken( rValue, XML_PRINTER );
833*b1cdbd2cSJim Jagielski 		}
834*b1cdbd2cSJim Jagielski 	}
835*b1cdbd2cSJim Jagielski 	else if( XML_NAMESPACE_PRESENTATION == nPrefix )
836*b1cdbd2cSJim Jagielski 	{
837*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_USER_TRANSFORMED ) )
838*b1cdbd2cSJim Jagielski 		{
839*b1cdbd2cSJim Jagielski 			mbIsUserTransformed = IsXMLToken( rValue, XML_TRUE );
840*b1cdbd2cSJim Jagielski 		}
841*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_PLACEHOLDER ) )
842*b1cdbd2cSJim Jagielski 		{
843*b1cdbd2cSJim Jagielski 			mbIsPlaceholder = IsXMLToken( rValue, XML_TRUE );
844*b1cdbd2cSJim Jagielski 			if( mbIsPlaceholder )
845*b1cdbd2cSJim Jagielski 				mbClearDefaultAttributes = false;
846*b1cdbd2cSJim Jagielski 		}
847*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_CLASS ) )
848*b1cdbd2cSJim Jagielski 		{
849*b1cdbd2cSJim Jagielski 			maPresentationClass = rValue;
850*b1cdbd2cSJim Jagielski 		}
851*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_STYLE_NAME ) )
852*b1cdbd2cSJim Jagielski 		{
853*b1cdbd2cSJim Jagielski 			maDrawStyleName = rValue;
854*b1cdbd2cSJim Jagielski 			mnStyleFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID;
855*b1cdbd2cSJim Jagielski 		}
856*b1cdbd2cSJim Jagielski 	}
857*b1cdbd2cSJim Jagielski 	else if( XML_NAMESPACE_SVG == nPrefix )
858*b1cdbd2cSJim Jagielski 	{
859*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_X ) )
860*b1cdbd2cSJim Jagielski 		{
861*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maPosition.X, rValue);
862*b1cdbd2cSJim Jagielski 		}
863*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_Y ) )
864*b1cdbd2cSJim Jagielski 		{
865*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maPosition.Y, rValue);
866*b1cdbd2cSJim Jagielski 		}
867*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_WIDTH ) )
868*b1cdbd2cSJim Jagielski 		{
869*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maSize.Width, rValue);
870*b1cdbd2cSJim Jagielski 			if( maSize.Width > 0 )
871*b1cdbd2cSJim Jagielski 				maSize.Width += 1;
872*b1cdbd2cSJim Jagielski 			else if( maSize.Width < 0 )
873*b1cdbd2cSJim Jagielski 				maSize.Width -= 1;
874*b1cdbd2cSJim Jagielski 		}
875*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_HEIGHT ) )
876*b1cdbd2cSJim Jagielski 		{
877*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maSize.Height, rValue);
878*b1cdbd2cSJim Jagielski 			if( maSize.Height > 0 )
879*b1cdbd2cSJim Jagielski 				maSize.Height += 1;
880*b1cdbd2cSJim Jagielski 			else if( maSize.Height < 0 )
881*b1cdbd2cSJim Jagielski 				maSize.Height -= 1;
882*b1cdbd2cSJim Jagielski 		}
883*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
884*b1cdbd2cSJim Jagielski 		{
885*b1cdbd2cSJim Jagielski 			// because of #85127# take svg:transform into account and hanle like
886*b1cdbd2cSJim Jagielski 			// draw:transform for compatibility
887*b1cdbd2cSJim Jagielski 			mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter());
888*b1cdbd2cSJim Jagielski 		}
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski 		// #i68101#
891*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_TITLE ) )
892*b1cdbd2cSJim Jagielski 		{
893*b1cdbd2cSJim Jagielski 			maShapeTitle = rValue;
894*b1cdbd2cSJim Jagielski 		}
895*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_DESC ) )
896*b1cdbd2cSJim Jagielski 		{
897*b1cdbd2cSJim Jagielski 			maShapeDescription = rValue;
898*b1cdbd2cSJim Jagielski 		}
899*b1cdbd2cSJim Jagielski 	}
900*b1cdbd2cSJim Jagielski 	else if( (XML_NAMESPACE_NONE == nPrefix) || (XML_NAMESPACE_XML == nPrefix) )
901*b1cdbd2cSJim Jagielski 	{
902*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_ID ) )
903*b1cdbd2cSJim Jagielski 		{
904*b1cdbd2cSJim Jagielski 			maShapeId = rValue;
905*b1cdbd2cSJim Jagielski             bHaveXmlId = true;
906*b1cdbd2cSJim Jagielski         }
907*b1cdbd2cSJim Jagielski     }
908*b1cdbd2cSJim Jagielski }
909*b1cdbd2cSJim Jagielski 
isPresentationShape() const910*b1cdbd2cSJim Jagielski sal_Bool SdXMLShapeContext::isPresentationShape() const
911*b1cdbd2cSJim Jagielski {
912*b1cdbd2cSJim Jagielski 	if( maPresentationClass.getLength() && (const_cast<SdXMLShapeContext*>(this))->GetImport().GetShapeImport()->IsPresentationShapesSupported() )
913*b1cdbd2cSJim Jagielski 	{
914*b1cdbd2cSJim Jagielski 		if(XML_STYLE_FAMILY_SD_PRESENTATION_ID == mnStyleFamily)
915*b1cdbd2cSJim Jagielski 		{
916*b1cdbd2cSJim Jagielski 			return sal_True;
917*b1cdbd2cSJim Jagielski 		}
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski 		if( IsXMLToken( maPresentationClass, XML_HEADER ) || IsXMLToken( maPresentationClass, XML_FOOTER ) ||
920*b1cdbd2cSJim Jagielski 			IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) || IsXMLToken( maPresentationClass, XML_DATE_TIME ) )
921*b1cdbd2cSJim Jagielski 		{
922*b1cdbd2cSJim Jagielski 			return sal_True;
923*b1cdbd2cSJim Jagielski 		}
924*b1cdbd2cSJim Jagielski 	}
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski 	return sal_False;
927*b1cdbd2cSJim Jagielski }
928*b1cdbd2cSJim Jagielski 
onDemandRescueUsefulDataFromTemporary(const SvXMLImportContext & rCandidate)929*b1cdbd2cSJim Jagielski void SdXMLShapeContext::onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& rCandidate )
930*b1cdbd2cSJim Jagielski {
931*b1cdbd2cSJim Jagielski     const SdXMLShapeContext* pCandidate = dynamic_cast< const SdXMLShapeContext* >(&rCandidate);
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski     if(!mxGluePoints.is() && pCandidate)
934*b1cdbd2cSJim Jagielski     {
935*b1cdbd2cSJim Jagielski         // try to rescue GluePoints from rCandidate to local if we not yet have GluePoints by copying them
936*b1cdbd2cSJim Jagielski         uno::Reference< drawing::XGluePointsSupplier > xSourceSupplier( pCandidate->getShape(), uno::UNO_QUERY );
937*b1cdbd2cSJim Jagielski         if( !xSourceSupplier.is() )
938*b1cdbd2cSJim Jagielski             return;
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski         uno::Reference< container::XIdentifierAccess > xSourceGluePoints( xSourceSupplier->getGluePoints(), uno::UNO_QUERY );
941*b1cdbd2cSJim Jagielski         if( !xSourceGluePoints.is() )
942*b1cdbd2cSJim Jagielski             return;
943*b1cdbd2cSJim Jagielski 
944*b1cdbd2cSJim Jagielski         uno::Sequence< sal_Int32 > aSourceIdSequence( xSourceGluePoints->getIdentifiers() );
945*b1cdbd2cSJim Jagielski         const sal_Int32 nSourceCount(aSourceIdSequence.getLength());
946*b1cdbd2cSJim Jagielski         UniReference< XMLShapeImportHelper > xSourceShapeImportHelper(const_cast< SdXMLShapeContext* >(pCandidate)->GetImport().GetShapeImport());
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski         if(nSourceCount)
949*b1cdbd2cSJim Jagielski         {
950*b1cdbd2cSJim Jagielski             // rCandidate has GluePoints; prepare the GluePoint container for the local shape
951*b1cdbd2cSJim Jagielski             uno::Reference< drawing::XGluePointsSupplier > xSupplier( mxShape, uno::UNO_QUERY );
952*b1cdbd2cSJim Jagielski             if( !xSupplier.is() )
953*b1cdbd2cSJim Jagielski                 return;
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski             mxGluePoints = uno::Reference< container::XIdentifierContainer >::query( xSupplier->getGluePoints() );
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski             if( !mxGluePoints.is() )
958*b1cdbd2cSJim Jagielski                 return;
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski             drawing::GluePoint2 aSourceGluePoint;
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski             for( sal_Int32 nSourceIndex(0); nSourceIndex < nSourceCount; nSourceIndex++ )
963*b1cdbd2cSJim Jagielski             {
964*b1cdbd2cSJim Jagielski                 const sal_Int32 nSourceIdentifier = aSourceIdSequence[nSourceIndex];
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski                 // loop over GluePoints which are UserDefined (avoid the auto mapped ones)
967*b1cdbd2cSJim Jagielski                 if((xSourceGluePoints->getByIdentifier( nSourceIdentifier ) >>= aSourceGluePoint)
968*b1cdbd2cSJim Jagielski                     && aSourceGluePoint.IsUserDefined)
969*b1cdbd2cSJim Jagielski                 {
970*b1cdbd2cSJim Jagielski                     // get original mappingID back, this is the draw:id imported with a draw:glue-point
971*b1cdbd2cSJim Jagielski                     const sal_Int32 nDestinnationId = xSourceShapeImportHelper->findGluePointMapping(
972*b1cdbd2cSJim Jagielski                         pCandidate->getShape(),
973*b1cdbd2cSJim Jagielski                         nSourceIdentifier );
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski                     if(-1 != nSourceIdentifier)
976*b1cdbd2cSJim Jagielski                     {
977*b1cdbd2cSJim Jagielski                         // if we got that we are able to add a copy of that GluePoint to the local
978*b1cdbd2cSJim Jagielski                         // context and xShape since we have all information that the source shape
979*b1cdbd2cSJim Jagielski                         // and context had at import time
980*b1cdbd2cSJim Jagielski                         try
981*b1cdbd2cSJim Jagielski                         {
982*b1cdbd2cSJim Jagielski                             const sal_Int32 nInternalId = mxGluePoints->insert( uno::makeAny( aSourceGluePoint ) );
983*b1cdbd2cSJim Jagielski                             GetImport().GetShapeImport()->addGluePointMapping( mxShape, nDestinnationId, nInternalId );
984*b1cdbd2cSJim Jagielski                         }
985*b1cdbd2cSJim Jagielski                         catch( uno::Exception& )
986*b1cdbd2cSJim Jagielski                         {
987*b1cdbd2cSJim Jagielski                             DBG_ERROR( "exception during setting of glue points!");
988*b1cdbd2cSJim Jagielski                         }
989*b1cdbd2cSJim Jagielski                     }
990*b1cdbd2cSJim Jagielski                 }
991*b1cdbd2cSJim Jagielski             }
992*b1cdbd2cSJim Jagielski         }
993*b1cdbd2cSJim Jagielski     }
994*b1cdbd2cSJim Jagielski }
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
997*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLRectShapeContext, SdXMLShapeContext );
1000*b1cdbd2cSJim Jagielski 
SdXMLRectShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1001*b1cdbd2cSJim Jagielski SdXMLRectShapeContext::SdXMLRectShapeContext(
1002*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
1003*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
1004*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
1005*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1006*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
1007*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
1008*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1009*b1cdbd2cSJim Jagielski 	mnRadius( 0L )
1010*b1cdbd2cSJim Jagielski {
1011*b1cdbd2cSJim Jagielski }
1012*b1cdbd2cSJim Jagielski 
1013*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1014*b1cdbd2cSJim Jagielski 
~SdXMLRectShapeContext()1015*b1cdbd2cSJim Jagielski SdXMLRectShapeContext::~SdXMLRectShapeContext()
1016*b1cdbd2cSJim Jagielski {
1017*b1cdbd2cSJim Jagielski }
1018*b1cdbd2cSJim Jagielski 
1019*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1020*b1cdbd2cSJim Jagielski 
1021*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1022*b1cdbd2cSJim Jagielski void SdXMLRectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1023*b1cdbd2cSJim Jagielski {
1024*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_DRAW == nPrefix )
1025*b1cdbd2cSJim Jagielski 	{
1026*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
1027*b1cdbd2cSJim Jagielski 		{
1028*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
1029*b1cdbd2cSJim Jagielski 			return;
1030*b1cdbd2cSJim Jagielski 		}
1031*b1cdbd2cSJim Jagielski 	}
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1034*b1cdbd2cSJim Jagielski }
1035*b1cdbd2cSJim Jagielski 
1036*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1037*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1038*b1cdbd2cSJim Jagielski void SdXMLRectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1039*b1cdbd2cSJim Jagielski {
1040*b1cdbd2cSJim Jagielski 	// create rectangle shape
1041*b1cdbd2cSJim Jagielski 	AddShape("com.sun.star.drawing.RectangleShape");
1042*b1cdbd2cSJim Jagielski 	if(mxShape.is())
1043*b1cdbd2cSJim Jagielski 	{
1044*b1cdbd2cSJim Jagielski 		// Add, set Style and properties from base shape
1045*b1cdbd2cSJim Jagielski 		SetStyle();
1046*b1cdbd2cSJim Jagielski 		SetLayer();
1047*b1cdbd2cSJim Jagielski 
1048*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
1049*b1cdbd2cSJim Jagielski 		SetTransformation();
1050*b1cdbd2cSJim Jagielski 
1051*b1cdbd2cSJim Jagielski 		if(mnRadius)
1052*b1cdbd2cSJim Jagielski 		{
1053*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1054*b1cdbd2cSJim Jagielski 			if(xPropSet.is())
1055*b1cdbd2cSJim Jagielski 			{
1056*b1cdbd2cSJim Jagielski 				try
1057*b1cdbd2cSJim Jagielski 				{
1058*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
1059*b1cdbd2cSJim Jagielski 				}
1060*b1cdbd2cSJim Jagielski 				catch( uno::Exception& )
1061*b1cdbd2cSJim Jagielski 				{
1062*b1cdbd2cSJim Jagielski 					DBG_ERROR( "exception during setting of corner radius!");
1063*b1cdbd2cSJim Jagielski 				}
1064*b1cdbd2cSJim Jagielski 			}
1065*b1cdbd2cSJim Jagielski 		}
1066*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
1067*b1cdbd2cSJim Jagielski 	}
1068*b1cdbd2cSJim Jagielski }
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1071*b1cdbd2cSJim Jagielski ////////////////////////////////////////3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1072*b1cdbd2cSJim Jagielski 
1073*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLLineShapeContext, SdXMLShapeContext );
1074*b1cdbd2cSJim Jagielski 
SdXMLLineShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1075*b1cdbd2cSJim Jagielski SdXMLLineShapeContext::SdXMLLineShapeContext(
1076*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
1077*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
1078*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
1079*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1080*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
1081*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
1082*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1083*b1cdbd2cSJim Jagielski 	mnX1( 0L ),
1084*b1cdbd2cSJim Jagielski 	mnY1( 0L ),
1085*b1cdbd2cSJim Jagielski 	mnX2( 1L ),
1086*b1cdbd2cSJim Jagielski 	mnY2( 1L )
1087*b1cdbd2cSJim Jagielski {
1088*b1cdbd2cSJim Jagielski }
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1091*b1cdbd2cSJim Jagielski 
~SdXMLLineShapeContext()1092*b1cdbd2cSJim Jagielski SdXMLLineShapeContext::~SdXMLLineShapeContext()
1093*b1cdbd2cSJim Jagielski {
1094*b1cdbd2cSJim Jagielski }
1095*b1cdbd2cSJim Jagielski 
1096*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1097*b1cdbd2cSJim Jagielski 
1098*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1099*b1cdbd2cSJim Jagielski void SdXMLLineShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1100*b1cdbd2cSJim Jagielski {
1101*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_SVG == nPrefix )
1102*b1cdbd2cSJim Jagielski 	{
1103*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_X1 ) )
1104*b1cdbd2cSJim Jagielski 		{
1105*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnX1, rValue);
1106*b1cdbd2cSJim Jagielski 			return;
1107*b1cdbd2cSJim Jagielski 		}
1108*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_Y1 ) )
1109*b1cdbd2cSJim Jagielski 		{
1110*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnY1, rValue);
1111*b1cdbd2cSJim Jagielski 			return;
1112*b1cdbd2cSJim Jagielski 		}
1113*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_X2 ) )
1114*b1cdbd2cSJim Jagielski 		{
1115*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnX2, rValue);
1116*b1cdbd2cSJim Jagielski 			return;
1117*b1cdbd2cSJim Jagielski 		}
1118*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_Y2 ) )
1119*b1cdbd2cSJim Jagielski 		{
1120*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnY2, rValue);
1121*b1cdbd2cSJim Jagielski 			return;
1122*b1cdbd2cSJim Jagielski 		}
1123*b1cdbd2cSJim Jagielski 	}
1124*b1cdbd2cSJim Jagielski 
1125*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1126*b1cdbd2cSJim Jagielski }
1127*b1cdbd2cSJim Jagielski 
1128*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1129*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1130*b1cdbd2cSJim Jagielski void SdXMLLineShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1131*b1cdbd2cSJim Jagielski {
1132*b1cdbd2cSJim Jagielski 	// #85920# use SetTransformation() to handle import of simple lines.
1133*b1cdbd2cSJim Jagielski 	// This is necessary to kake into account all anchor positions and
1134*b1cdbd2cSJim Jagielski 	// other things. All shape imports use the same import schemata now.
1135*b1cdbd2cSJim Jagielski 	// create necessary shape (Line Shape)
1136*b1cdbd2cSJim Jagielski 	AddShape("com.sun.star.drawing.PolyLineShape");
1137*b1cdbd2cSJim Jagielski 
1138*b1cdbd2cSJim Jagielski 	if(mxShape.is())
1139*b1cdbd2cSJim Jagielski 	{
1140*b1cdbd2cSJim Jagielski 		// Add, set Style and properties from base shape
1141*b1cdbd2cSJim Jagielski 		SetStyle();
1142*b1cdbd2cSJim Jagielski 		SetLayer();
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski 		// get sizes and offsets
1145*b1cdbd2cSJim Jagielski 		awt::Point aTopLeft(mnX1, mnY1);
1146*b1cdbd2cSJim Jagielski 		awt::Point aBottomRight(mnX2, mnY2);
1147*b1cdbd2cSJim Jagielski 
1148*b1cdbd2cSJim Jagielski 		if(mnX1 > mnX2)
1149*b1cdbd2cSJim Jagielski 		{
1150*b1cdbd2cSJim Jagielski 			aTopLeft.X = mnX2;
1151*b1cdbd2cSJim Jagielski 			aBottomRight.X = mnX1;
1152*b1cdbd2cSJim Jagielski 		}
1153*b1cdbd2cSJim Jagielski 
1154*b1cdbd2cSJim Jagielski 		if(mnY1 > mnY2)
1155*b1cdbd2cSJim Jagielski 		{
1156*b1cdbd2cSJim Jagielski 			aTopLeft.Y = mnY2;
1157*b1cdbd2cSJim Jagielski 			aBottomRight.Y = mnY1;
1158*b1cdbd2cSJim Jagielski 		}
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski 		// set local parameters on shape
1161*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1162*b1cdbd2cSJim Jagielski 		if(xPropSet.is())
1163*b1cdbd2cSJim Jagielski 		{
1164*b1cdbd2cSJim Jagielski 			drawing::PointSequenceSequence aPolyPoly(1L);
1165*b1cdbd2cSJim Jagielski 			drawing::PointSequence* pOuterSequence = aPolyPoly.getArray();
1166*b1cdbd2cSJim Jagielski 			pOuterSequence->realloc(2L);
1167*b1cdbd2cSJim Jagielski 			awt::Point* pInnerSequence = pOuterSequence->getArray();
1168*b1cdbd2cSJim Jagielski 			uno::Any aAny;
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski 			*pInnerSequence = awt::Point( mnX1 - aTopLeft.X, mnY1 - aTopLeft.Y);
1171*b1cdbd2cSJim Jagielski 			pInnerSequence++;
1172*b1cdbd2cSJim Jagielski 			*pInnerSequence = awt::Point( mnX2 - aTopLeft.X, mnY2 - aTopLeft.Y);
1173*b1cdbd2cSJim Jagielski 
1174*b1cdbd2cSJim Jagielski 			aAny <<= aPolyPoly;
1175*b1cdbd2cSJim Jagielski 			xPropSet->setPropertyValue(
1176*b1cdbd2cSJim Jagielski 				OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1177*b1cdbd2cSJim Jagielski 		}
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski 		// set sizes for transformation
1180*b1cdbd2cSJim Jagielski 		maSize.Width = aBottomRight.X - aTopLeft.X;
1181*b1cdbd2cSJim Jagielski 		maSize.Height = aBottomRight.Y - aTopLeft.Y;
1182*b1cdbd2cSJim Jagielski 		maPosition.X = aTopLeft.X;
1183*b1cdbd2cSJim Jagielski 		maPosition.Y = aTopLeft.Y;
1184*b1cdbd2cSJim Jagielski 
1185*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate and get copy of matrix
1186*b1cdbd2cSJim Jagielski 		SetTransformation();
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
1189*b1cdbd2cSJim Jagielski 	}
1190*b1cdbd2cSJim Jagielski }
1191*b1cdbd2cSJim Jagielski 
1192*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1193*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLEllipseShapeContext, SdXMLShapeContext );
1196*b1cdbd2cSJim Jagielski 
SdXMLEllipseShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1197*b1cdbd2cSJim Jagielski SdXMLEllipseShapeContext::SdXMLEllipseShapeContext(
1198*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
1199*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
1200*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
1201*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1202*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
1203*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
1204*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1205*b1cdbd2cSJim Jagielski 	mnCX( 0L ),
1206*b1cdbd2cSJim Jagielski 	mnCY( 0L ),
1207*b1cdbd2cSJim Jagielski 	mnRX( 1L ),
1208*b1cdbd2cSJim Jagielski 	mnRY( 1L ),
1209*b1cdbd2cSJim Jagielski 	meKind( drawing::CircleKind_FULL ),
1210*b1cdbd2cSJim Jagielski 	mnStartAngle( 0 ),
1211*b1cdbd2cSJim Jagielski 	mnEndAngle( 0 )
1212*b1cdbd2cSJim Jagielski {
1213*b1cdbd2cSJim Jagielski }
1214*b1cdbd2cSJim Jagielski 
1215*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1216*b1cdbd2cSJim Jagielski 
~SdXMLEllipseShapeContext()1217*b1cdbd2cSJim Jagielski SdXMLEllipseShapeContext::~SdXMLEllipseShapeContext()
1218*b1cdbd2cSJim Jagielski {
1219*b1cdbd2cSJim Jagielski }
1220*b1cdbd2cSJim Jagielski 
1221*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1222*b1cdbd2cSJim Jagielski 
1223*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1224*b1cdbd2cSJim Jagielski void SdXMLEllipseShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1225*b1cdbd2cSJim Jagielski {
1226*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_SVG == nPrefix )
1227*b1cdbd2cSJim Jagielski 	{
1228*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_RX ) )
1229*b1cdbd2cSJim Jagielski 		{
1230*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnRX, rValue);
1231*b1cdbd2cSJim Jagielski 			return;
1232*b1cdbd2cSJim Jagielski 		}
1233*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_RY ) )
1234*b1cdbd2cSJim Jagielski 		{
1235*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnRY, rValue);
1236*b1cdbd2cSJim Jagielski 			return;
1237*b1cdbd2cSJim Jagielski 		}
1238*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CX ) )
1239*b1cdbd2cSJim Jagielski 		{
1240*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnCX, rValue);
1241*b1cdbd2cSJim Jagielski 			return;
1242*b1cdbd2cSJim Jagielski 		}
1243*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CY ) )
1244*b1cdbd2cSJim Jagielski 		{
1245*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnCY, rValue);
1246*b1cdbd2cSJim Jagielski 			return;
1247*b1cdbd2cSJim Jagielski 		}
1248*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_R ) )
1249*b1cdbd2cSJim Jagielski 		{
1250*b1cdbd2cSJim Jagielski 			// single radius, it's a circle and both radii are the same
1251*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnRX, rValue);
1252*b1cdbd2cSJim Jagielski 			mnRY = mnRX;
1253*b1cdbd2cSJim Jagielski 			return;
1254*b1cdbd2cSJim Jagielski 		}
1255*b1cdbd2cSJim Jagielski 	}
1256*b1cdbd2cSJim Jagielski 	else if( XML_NAMESPACE_DRAW == nPrefix )
1257*b1cdbd2cSJim Jagielski 	{
1258*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_KIND ) )
1259*b1cdbd2cSJim Jagielski 		{
1260*b1cdbd2cSJim Jagielski 			sal_uInt16 eKind;
1261*b1cdbd2cSJim Jagielski 			if( SvXMLUnitConverter::convertEnum( eKind, rValue, aXML_CircleKind_EnumMap ) )
1262*b1cdbd2cSJim Jagielski 			{
1263*b1cdbd2cSJim Jagielski 				meKind = eKind;
1264*b1cdbd2cSJim Jagielski 			}
1265*b1cdbd2cSJim Jagielski 			return;
1266*b1cdbd2cSJim Jagielski 		}
1267*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_START_ANGLE ) )
1268*b1cdbd2cSJim Jagielski 		{
1269*b1cdbd2cSJim Jagielski 			double dStartAngle;
1270*b1cdbd2cSJim Jagielski 			if( SvXMLUnitConverter::convertDouble( dStartAngle, rValue ) )
1271*b1cdbd2cSJim Jagielski 				mnStartAngle = (sal_Int32)(dStartAngle * 100.0);
1272*b1cdbd2cSJim Jagielski 			return;
1273*b1cdbd2cSJim Jagielski 		}
1274*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_END_ANGLE ) )
1275*b1cdbd2cSJim Jagielski 		{
1276*b1cdbd2cSJim Jagielski 			double dEndAngle;
1277*b1cdbd2cSJim Jagielski 			if( SvXMLUnitConverter::convertDouble( dEndAngle, rValue ) )
1278*b1cdbd2cSJim Jagielski 				mnEndAngle = (sal_Int32)(dEndAngle * 100.0);
1279*b1cdbd2cSJim Jagielski 			return;
1280*b1cdbd2cSJim Jagielski 		}
1281*b1cdbd2cSJim Jagielski 	}
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1284*b1cdbd2cSJim Jagielski }
1285*b1cdbd2cSJim Jagielski 
1286*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1287*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1288*b1cdbd2cSJim Jagielski void SdXMLEllipseShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1289*b1cdbd2cSJim Jagielski {
1290*b1cdbd2cSJim Jagielski 	// create rectangle shape
1291*b1cdbd2cSJim Jagielski 	AddShape("com.sun.star.drawing.EllipseShape");
1292*b1cdbd2cSJim Jagielski 	if(mxShape.is())
1293*b1cdbd2cSJim Jagielski 	{
1294*b1cdbd2cSJim Jagielski 		// Add, set Style and properties from base shape
1295*b1cdbd2cSJim Jagielski 		SetStyle();
1296*b1cdbd2cSJim Jagielski 		SetLayer();
1297*b1cdbd2cSJim Jagielski 
1298*b1cdbd2cSJim Jagielski         if(mnCX != 0 || mnCY != 0 || mnRX != 1 || mnRY != 1)
1299*b1cdbd2cSJim Jagielski         {
1300*b1cdbd2cSJim Jagielski             // #121972# center/radius is used, put to pos and size
1301*b1cdbd2cSJim Jagielski             maSize.Width = 2 * mnRX;
1302*b1cdbd2cSJim Jagielski             maSize.Height = 2 * mnRY;
1303*b1cdbd2cSJim Jagielski             maPosition.X = mnCX - mnRX;
1304*b1cdbd2cSJim Jagielski             maPosition.Y = mnCY - mnRY;
1305*b1cdbd2cSJim Jagielski         }
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
1308*b1cdbd2cSJim Jagielski 		SetTransformation();
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski 		if( meKind != drawing::CircleKind_FULL )
1311*b1cdbd2cSJim Jagielski 		{
1312*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
1313*b1cdbd2cSJim Jagielski 			if( xPropSet.is() )
1314*b1cdbd2cSJim Jagielski 			{
1315*b1cdbd2cSJim Jagielski 				uno::Any aAny;
1316*b1cdbd2cSJim Jagielski 				aAny <<= (drawing::CircleKind)meKind;
1317*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleKind")), aAny );
1318*b1cdbd2cSJim Jagielski 
1319*b1cdbd2cSJim Jagielski 				aAny <<= mnStartAngle;
1320*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleStartAngle")), aAny );
1321*b1cdbd2cSJim Jagielski 
1322*b1cdbd2cSJim Jagielski 				aAny <<= mnEndAngle;
1323*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleEndAngle")), aAny );
1324*b1cdbd2cSJim Jagielski 			}
1325*b1cdbd2cSJim Jagielski 		}
1326*b1cdbd2cSJim Jagielski 
1327*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
1328*b1cdbd2cSJim Jagielski 	}
1329*b1cdbd2cSJim Jagielski }
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1332*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1333*b1cdbd2cSJim Jagielski 
1334*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLPolygonShapeContext, SdXMLShapeContext );
1335*b1cdbd2cSJim Jagielski 
SdXMLPolygonShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bClosed,sal_Bool bTemporaryShape)1336*b1cdbd2cSJim Jagielski SdXMLPolygonShapeContext::SdXMLPolygonShapeContext(
1337*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
1338*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
1339*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
1340*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1341*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes, sal_Bool bClosed, sal_Bool bTemporaryShape)
1342*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1343*b1cdbd2cSJim Jagielski 	mbClosed( bClosed )
1344*b1cdbd2cSJim Jagielski {
1345*b1cdbd2cSJim Jagielski }
1346*b1cdbd2cSJim Jagielski 
1347*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1348*b1cdbd2cSJim Jagielski 
1349*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1350*b1cdbd2cSJim Jagielski void SdXMLPolygonShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1351*b1cdbd2cSJim Jagielski {
1352*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_SVG == nPrefix )
1353*b1cdbd2cSJim Jagielski 	{
1354*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_VIEWBOX ) )
1355*b1cdbd2cSJim Jagielski 		{
1356*b1cdbd2cSJim Jagielski 			maViewBox = rValue;
1357*b1cdbd2cSJim Jagielski 			return;
1358*b1cdbd2cSJim Jagielski 		}
1359*b1cdbd2cSJim Jagielski 	}
1360*b1cdbd2cSJim Jagielski 	else if( XML_NAMESPACE_DRAW == nPrefix )
1361*b1cdbd2cSJim Jagielski 	{
1362*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_POINTS ) )
1363*b1cdbd2cSJim Jagielski 		{
1364*b1cdbd2cSJim Jagielski 			maPoints = rValue;
1365*b1cdbd2cSJim Jagielski 			return;
1366*b1cdbd2cSJim Jagielski 		}
1367*b1cdbd2cSJim Jagielski 	}
1368*b1cdbd2cSJim Jagielski 
1369*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1370*b1cdbd2cSJim Jagielski }
1371*b1cdbd2cSJim Jagielski 
1372*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1373*b1cdbd2cSJim Jagielski 
~SdXMLPolygonShapeContext()1374*b1cdbd2cSJim Jagielski SdXMLPolygonShapeContext::~SdXMLPolygonShapeContext()
1375*b1cdbd2cSJim Jagielski {
1376*b1cdbd2cSJim Jagielski }
1377*b1cdbd2cSJim Jagielski 
1378*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1379*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1380*b1cdbd2cSJim Jagielski void SdXMLPolygonShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1381*b1cdbd2cSJim Jagielski {
1382*b1cdbd2cSJim Jagielski     // Add, set Style and properties from base shape
1383*b1cdbd2cSJim Jagielski     if(mbClosed)
1384*b1cdbd2cSJim Jagielski         AddShape("com.sun.star.drawing.PolyPolygonShape");
1385*b1cdbd2cSJim Jagielski     else
1386*b1cdbd2cSJim Jagielski         AddShape("com.sun.star.drawing.PolyLineShape");
1387*b1cdbd2cSJim Jagielski 
1388*b1cdbd2cSJim Jagielski     if( mxShape.is() )
1389*b1cdbd2cSJim Jagielski     {
1390*b1cdbd2cSJim Jagielski         SetStyle();
1391*b1cdbd2cSJim Jagielski         SetLayer();
1392*b1cdbd2cSJim Jagielski 
1393*b1cdbd2cSJim Jagielski         // set local parameters on shape
1394*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1395*b1cdbd2cSJim Jagielski         if(xPropSet.is())
1396*b1cdbd2cSJim Jagielski         {
1397*b1cdbd2cSJim Jagielski             // set polygon
1398*b1cdbd2cSJim Jagielski             if(maPoints.getLength() && maViewBox.getLength())
1399*b1cdbd2cSJim Jagielski             {
1400*b1cdbd2cSJim Jagielski                 const SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
1401*b1cdbd2cSJim Jagielski                 basegfx::B2DVector aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
1402*b1cdbd2cSJim Jagielski 
1403*b1cdbd2cSJim Jagielski                 // Is this correct? It overrides ViewBox stuff; OTOH it makes no
1404*b1cdbd2cSJim Jagielski                 // sense to have the geometry content size different from object size
1405*b1cdbd2cSJim Jagielski                 if(maSize.Width != 0 && maSize.Height != 0)
1406*b1cdbd2cSJim Jagielski                 {
1407*b1cdbd2cSJim Jagielski                     aSize = basegfx::B2DVector(maSize.Width, maSize.Height);
1408*b1cdbd2cSJim Jagielski                 }
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski                 basegfx::B2DPolygon aPolygon;
1411*b1cdbd2cSJim Jagielski 
1412*b1cdbd2cSJim Jagielski                 if(basegfx::tools::importFromSvgPoints(aPolygon, maPoints))
1413*b1cdbd2cSJim Jagielski                 {
1414*b1cdbd2cSJim Jagielski                     if(aPolygon.count())
1415*b1cdbd2cSJim Jagielski                     {
1416*b1cdbd2cSJim Jagielski                         const basegfx::B2DRange aSourceRange(
1417*b1cdbd2cSJim Jagielski                             aViewBox.GetX(), aViewBox.GetY(),
1418*b1cdbd2cSJim Jagielski                             aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight());
1419*b1cdbd2cSJim Jagielski                         const basegfx::B2DRange aTargetRange(
1420*b1cdbd2cSJim Jagielski                             aViewBox.GetX(), aViewBox.GetY(),
1421*b1cdbd2cSJim Jagielski                             aViewBox.GetX() + aSize.getX(), aViewBox.GetY() + aSize.getY());
1422*b1cdbd2cSJim Jagielski 
1423*b1cdbd2cSJim Jagielski                         if(!aSourceRange.equal(aTargetRange))
1424*b1cdbd2cSJim Jagielski                         {
1425*b1cdbd2cSJim Jagielski                             aPolygon.transform(
1426*b1cdbd2cSJim Jagielski                                 basegfx::tools::createSourceRangeTargetRangeTransform(
1427*b1cdbd2cSJim Jagielski                                     aSourceRange,
1428*b1cdbd2cSJim Jagielski                                     aTargetRange));
1429*b1cdbd2cSJim Jagielski                         }
1430*b1cdbd2cSJim Jagielski 
1431*b1cdbd2cSJim Jagielski                         com::sun::star::drawing::PointSequenceSequence aPointSequenceSequence;
1432*b1cdbd2cSJim Jagielski                         uno::Any aAny;
1433*b1cdbd2cSJim Jagielski 
1434*b1cdbd2cSJim Jagielski                         basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(basegfx::B2DPolyPolygon(aPolygon), aPointSequenceSequence);
1435*b1cdbd2cSJim Jagielski                         aAny <<= aPointSequenceSequence;
1436*b1cdbd2cSJim Jagielski                         xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1437*b1cdbd2cSJim Jagielski                     }
1438*b1cdbd2cSJim Jagielski                 }
1439*b1cdbd2cSJim Jagielski             }
1440*b1cdbd2cSJim Jagielski         }
1441*b1cdbd2cSJim Jagielski 
1442*b1cdbd2cSJim Jagielski         // set pos, size, shear and rotate and get copy of matrix
1443*b1cdbd2cSJim Jagielski         SetTransformation();
1444*b1cdbd2cSJim Jagielski 
1445*b1cdbd2cSJim Jagielski         SdXMLShapeContext::StartElement(xAttrList);
1446*b1cdbd2cSJim Jagielski     }
1447*b1cdbd2cSJim Jagielski }
1448*b1cdbd2cSJim Jagielski 
1449*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1450*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1451*b1cdbd2cSJim Jagielski 
1452*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLPathShapeContext, SdXMLShapeContext );
1453*b1cdbd2cSJim Jagielski 
SdXMLPathShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1454*b1cdbd2cSJim Jagielski SdXMLPathShapeContext::SdXMLPathShapeContext(
1455*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
1456*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
1457*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
1458*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1459*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
1460*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
1461*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1462*b1cdbd2cSJim Jagielski 	mbClosed( sal_True )
1463*b1cdbd2cSJim Jagielski {
1464*b1cdbd2cSJim Jagielski }
1465*b1cdbd2cSJim Jagielski 
1466*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1467*b1cdbd2cSJim Jagielski 
~SdXMLPathShapeContext()1468*b1cdbd2cSJim Jagielski SdXMLPathShapeContext::~SdXMLPathShapeContext()
1469*b1cdbd2cSJim Jagielski {
1470*b1cdbd2cSJim Jagielski }
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1473*b1cdbd2cSJim Jagielski 
1474*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1475*b1cdbd2cSJim Jagielski void SdXMLPathShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1476*b1cdbd2cSJim Jagielski {
1477*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_SVG == nPrefix )
1478*b1cdbd2cSJim Jagielski 	{
1479*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_VIEWBOX ) )
1480*b1cdbd2cSJim Jagielski 		{
1481*b1cdbd2cSJim Jagielski 			maViewBox = rValue;
1482*b1cdbd2cSJim Jagielski 			return;
1483*b1cdbd2cSJim Jagielski 		}
1484*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_D ) )
1485*b1cdbd2cSJim Jagielski 		{
1486*b1cdbd2cSJim Jagielski 			maD = rValue;
1487*b1cdbd2cSJim Jagielski 			return;
1488*b1cdbd2cSJim Jagielski 		}
1489*b1cdbd2cSJim Jagielski 	}
1490*b1cdbd2cSJim Jagielski 
1491*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1492*b1cdbd2cSJim Jagielski }
1493*b1cdbd2cSJim Jagielski 
1494*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1495*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1496*b1cdbd2cSJim Jagielski void SdXMLPathShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1497*b1cdbd2cSJim Jagielski {
1498*b1cdbd2cSJim Jagielski     // create polygon shape
1499*b1cdbd2cSJim Jagielski     if(maD.getLength())
1500*b1cdbd2cSJim Jagielski     {
1501*b1cdbd2cSJim Jagielski         const SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
1502*b1cdbd2cSJim Jagielski         basegfx::B2DVector aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
1503*b1cdbd2cSJim Jagielski 
1504*b1cdbd2cSJim Jagielski         // Is this correct? It overrides ViewBox stuff; OTOH it makes no
1505*b1cdbd2cSJim Jagielski         // sense to have the geometry content size different from object size
1506*b1cdbd2cSJim Jagielski         if(maSize.Width != 0 && maSize.Height != 0)
1507*b1cdbd2cSJim Jagielski         {
1508*b1cdbd2cSJim Jagielski             aSize = basegfx::B2DVector(maSize.Width, maSize.Height);
1509*b1cdbd2cSJim Jagielski         }
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski         basegfx::B2DPolyPolygon aPolyPolygon;
1512*b1cdbd2cSJim Jagielski 
1513*b1cdbd2cSJim Jagielski         if(basegfx::tools::importFromSvgD(aPolyPolygon, maD, true, 0))
1514*b1cdbd2cSJim Jagielski         {
1515*b1cdbd2cSJim Jagielski             if(aPolyPolygon.count())
1516*b1cdbd2cSJim Jagielski             {
1517*b1cdbd2cSJim Jagielski                 const basegfx::B2DRange aSourceRange(
1518*b1cdbd2cSJim Jagielski                     aViewBox.GetX(), aViewBox.GetY(),
1519*b1cdbd2cSJim Jagielski                     aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight());
1520*b1cdbd2cSJim Jagielski                 const basegfx::B2DRange aTargetRange(
1521*b1cdbd2cSJim Jagielski                     aViewBox.GetX(), aViewBox.GetY(),
1522*b1cdbd2cSJim Jagielski                     aViewBox.GetX() + aSize.getX(), aViewBox.GetY() + aSize.getY());
1523*b1cdbd2cSJim Jagielski 
1524*b1cdbd2cSJim Jagielski                 if(!aSourceRange.equal(aTargetRange))
1525*b1cdbd2cSJim Jagielski                 {
1526*b1cdbd2cSJim Jagielski                     aPolyPolygon.transform(
1527*b1cdbd2cSJim Jagielski                         basegfx::tools::createSourceRangeTargetRangeTransform(
1528*b1cdbd2cSJim Jagielski                             aSourceRange,
1529*b1cdbd2cSJim Jagielski                             aTargetRange));
1530*b1cdbd2cSJim Jagielski                 }
1531*b1cdbd2cSJim Jagielski 
1532*b1cdbd2cSJim Jagielski                 // create shape
1533*b1cdbd2cSJim Jagielski                 const char* pService;
1534*b1cdbd2cSJim Jagielski 
1535*b1cdbd2cSJim Jagielski                 if(aPolyPolygon.areControlPointsUsed())
1536*b1cdbd2cSJim Jagielski                 {
1537*b1cdbd2cSJim Jagielski                     if(aPolyPolygon.isClosed())
1538*b1cdbd2cSJim Jagielski                     {
1539*b1cdbd2cSJim Jagielski                         pService = "com.sun.star.drawing.ClosedBezierShape";
1540*b1cdbd2cSJim Jagielski                     }
1541*b1cdbd2cSJim Jagielski                     else
1542*b1cdbd2cSJim Jagielski                     {
1543*b1cdbd2cSJim Jagielski                         pService = "com.sun.star.drawing.OpenBezierShape";
1544*b1cdbd2cSJim Jagielski                     }
1545*b1cdbd2cSJim Jagielski                 }
1546*b1cdbd2cSJim Jagielski                 else
1547*b1cdbd2cSJim Jagielski                 {
1548*b1cdbd2cSJim Jagielski                     if(aPolyPolygon.isClosed())
1549*b1cdbd2cSJim Jagielski                     {
1550*b1cdbd2cSJim Jagielski                         pService = "com.sun.star.drawing.PolyPolygonShape";
1551*b1cdbd2cSJim Jagielski                     }
1552*b1cdbd2cSJim Jagielski                     else
1553*b1cdbd2cSJim Jagielski                     {
1554*b1cdbd2cSJim Jagielski                         pService = "com.sun.star.drawing.PolyLineShape";
1555*b1cdbd2cSJim Jagielski                     }
1556*b1cdbd2cSJim Jagielski                 }
1557*b1cdbd2cSJim Jagielski 
1558*b1cdbd2cSJim Jagielski                 // Add, set Style and properties from base shape
1559*b1cdbd2cSJim Jagielski                 AddShape(pService);
1560*b1cdbd2cSJim Jagielski 
1561*b1cdbd2cSJim Jagielski                 // #89344# test for mxShape.is() and not for mxShapes.is() to support
1562*b1cdbd2cSJim Jagielski                 // shape import helper classes WITHOUT XShapes (member mxShapes). This
1563*b1cdbd2cSJim Jagielski                 // is used by the writer.
1564*b1cdbd2cSJim Jagielski                 if( mxShape.is() )
1565*b1cdbd2cSJim Jagielski                 {
1566*b1cdbd2cSJim Jagielski                     SetStyle();
1567*b1cdbd2cSJim Jagielski                     SetLayer();
1568*b1cdbd2cSJim Jagielski 
1569*b1cdbd2cSJim Jagielski                     // set local parameters on shape
1570*b1cdbd2cSJim Jagielski                     uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1571*b1cdbd2cSJim Jagielski 
1572*b1cdbd2cSJim Jagielski                     if(xPropSet.is())
1573*b1cdbd2cSJim Jagielski                     {
1574*b1cdbd2cSJim Jagielski                         uno::Any aAny;
1575*b1cdbd2cSJim Jagielski 
1576*b1cdbd2cSJim Jagielski                         // set polygon data
1577*b1cdbd2cSJim Jagielski                         if(aPolyPolygon.areControlPointsUsed())
1578*b1cdbd2cSJim Jagielski                         {
1579*b1cdbd2cSJim Jagielski                             drawing::PolyPolygonBezierCoords aSourcePolyPolygon;
1580*b1cdbd2cSJim Jagielski 
1581*b1cdbd2cSJim Jagielski                             basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords(
1582*b1cdbd2cSJim Jagielski                                 aPolyPolygon,
1583*b1cdbd2cSJim Jagielski                                 aSourcePolyPolygon);
1584*b1cdbd2cSJim Jagielski                             aAny <<= aSourcePolyPolygon;
1585*b1cdbd2cSJim Jagielski                         }
1586*b1cdbd2cSJim Jagielski                         else
1587*b1cdbd2cSJim Jagielski                         {
1588*b1cdbd2cSJim Jagielski                             drawing::PointSequenceSequence aSourcePolyPolygon;
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski                             basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(
1591*b1cdbd2cSJim Jagielski                                 aPolyPolygon,
1592*b1cdbd2cSJim Jagielski                                 aSourcePolyPolygon);
1593*b1cdbd2cSJim Jagielski                             aAny <<= aSourcePolyPolygon;
1594*b1cdbd2cSJim Jagielski                         }
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski                         xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1597*b1cdbd2cSJim Jagielski                     }
1598*b1cdbd2cSJim Jagielski 
1599*b1cdbd2cSJim Jagielski                     // set pos, size, shear and rotate
1600*b1cdbd2cSJim Jagielski                     SetTransformation();
1601*b1cdbd2cSJim Jagielski 
1602*b1cdbd2cSJim Jagielski                     SdXMLShapeContext::StartElement(xAttrList);
1603*b1cdbd2cSJim Jagielski                 }
1604*b1cdbd2cSJim Jagielski             }
1605*b1cdbd2cSJim Jagielski         }
1606*b1cdbd2cSJim Jagielski     }
1607*b1cdbd2cSJim Jagielski }
1608*b1cdbd2cSJim Jagielski 
1609*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1610*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1611*b1cdbd2cSJim Jagielski 
1612*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLTextBoxShapeContext, SdXMLShapeContext );
1613*b1cdbd2cSJim Jagielski 
SdXMLTextBoxShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1614*b1cdbd2cSJim Jagielski SdXMLTextBoxShapeContext::SdXMLTextBoxShapeContext(
1615*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
1616*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
1617*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
1618*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1619*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
1620*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
1621*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1622*b1cdbd2cSJim Jagielski 	mnRadius(0)
1623*b1cdbd2cSJim Jagielski {
1624*b1cdbd2cSJim Jagielski }
1625*b1cdbd2cSJim Jagielski 
1626*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1627*b1cdbd2cSJim Jagielski 
~SdXMLTextBoxShapeContext()1628*b1cdbd2cSJim Jagielski SdXMLTextBoxShapeContext::~SdXMLTextBoxShapeContext()
1629*b1cdbd2cSJim Jagielski {
1630*b1cdbd2cSJim Jagielski }
1631*b1cdbd2cSJim Jagielski 
1632*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1633*b1cdbd2cSJim Jagielski 
1634*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1635*b1cdbd2cSJim Jagielski void SdXMLTextBoxShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1636*b1cdbd2cSJim Jagielski {
1637*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_DRAW == nPrefix )
1638*b1cdbd2cSJim Jagielski 	{
1639*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
1640*b1cdbd2cSJim Jagielski 		{
1641*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
1642*b1cdbd2cSJim Jagielski 			return;
1643*b1cdbd2cSJim Jagielski 		}
1644*b1cdbd2cSJim Jagielski 	}
1645*b1cdbd2cSJim Jagielski 
1646*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1647*b1cdbd2cSJim Jagielski }
1648*b1cdbd2cSJim Jagielski 
1649*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1650*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> &)1651*b1cdbd2cSJim Jagielski void SdXMLTextBoxShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
1652*b1cdbd2cSJim Jagielski {
1653*b1cdbd2cSJim Jagielski 	// create textbox shape
1654*b1cdbd2cSJim Jagielski 	sal_Bool bIsPresShape = sal_False;
1655*b1cdbd2cSJim Jagielski 	bool bClearText = false;
1656*b1cdbd2cSJim Jagielski 
1657*b1cdbd2cSJim Jagielski 	const char *pService = NULL;
1658*b1cdbd2cSJim Jagielski 
1659*b1cdbd2cSJim Jagielski 	if( isPresentationShape() )
1660*b1cdbd2cSJim Jagielski 	{
1661*b1cdbd2cSJim Jagielski 		// check if the current document supports presentation shapes
1662*b1cdbd2cSJim Jagielski 		if( GetImport().GetShapeImport()->IsPresentationShapesSupported() )
1663*b1cdbd2cSJim Jagielski 		{
1664*b1cdbd2cSJim Jagielski 			if( IsXMLToken( maPresentationClass, XML_PRESENTATION_SUBTITLE ))
1665*b1cdbd2cSJim Jagielski 			{
1666*b1cdbd2cSJim Jagielski 				// XmlShapeTypePresSubtitleShape
1667*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.SubtitleShape";
1668*b1cdbd2cSJim Jagielski 			}
1669*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OUTLINE ) )
1670*b1cdbd2cSJim Jagielski 			{
1671*b1cdbd2cSJim Jagielski 				// XmlShapeTypePresOutlinerShape
1672*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.OutlinerShape";
1673*b1cdbd2cSJim Jagielski 			}
1674*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_NOTES ) )
1675*b1cdbd2cSJim Jagielski 			{
1676*b1cdbd2cSJim Jagielski 				// XmlShapeTypePresNotesShape
1677*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.NotesShape";
1678*b1cdbd2cSJim Jagielski 			}
1679*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( maPresentationClass, XML_HEADER ) )
1680*b1cdbd2cSJim Jagielski 			{
1681*b1cdbd2cSJim Jagielski 				// XmlShapeTypePresHeaderShape
1682*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.HeaderShape";
1683*b1cdbd2cSJim Jagielski 				bClearText = true;
1684*b1cdbd2cSJim Jagielski 			}
1685*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( maPresentationClass, XML_FOOTER ) )
1686*b1cdbd2cSJim Jagielski 			{
1687*b1cdbd2cSJim Jagielski 				// XmlShapeTypePresFooterShape
1688*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.FooterShape";
1689*b1cdbd2cSJim Jagielski 				bClearText = true;
1690*b1cdbd2cSJim Jagielski 			}
1691*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) )
1692*b1cdbd2cSJim Jagielski 			{
1693*b1cdbd2cSJim Jagielski 				// XmlShapeTypePresSlideNumberShape
1694*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.SlideNumberShape";
1695*b1cdbd2cSJim Jagielski 				bClearText = true;
1696*b1cdbd2cSJim Jagielski 			}
1697*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( maPresentationClass, XML_DATE_TIME ) )
1698*b1cdbd2cSJim Jagielski 			{
1699*b1cdbd2cSJim Jagielski 				// XmlShapeTypePresDateTimeShape
1700*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.DateTimeShape";
1701*b1cdbd2cSJim Jagielski 				bClearText = true;
1702*b1cdbd2cSJim Jagielski 			}
1703*b1cdbd2cSJim Jagielski 			else //  IsXMLToken( maPresentationClass, XML_PRESENTATION_TITLE ) )
1704*b1cdbd2cSJim Jagielski 			{
1705*b1cdbd2cSJim Jagielski 				// XmlShapeTypePresTitleTextShape
1706*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.TitleTextShape";
1707*b1cdbd2cSJim Jagielski 			}
1708*b1cdbd2cSJim Jagielski 			bIsPresShape = sal_True;
1709*b1cdbd2cSJim Jagielski 		}
1710*b1cdbd2cSJim Jagielski 	}
1711*b1cdbd2cSJim Jagielski 
1712*b1cdbd2cSJim Jagielski 	if( NULL == pService )
1713*b1cdbd2cSJim Jagielski 	{
1714*b1cdbd2cSJim Jagielski 		// normal text shape
1715*b1cdbd2cSJim Jagielski 		pService = "com.sun.star.drawing.TextShape";
1716*b1cdbd2cSJim Jagielski 	}
1717*b1cdbd2cSJim Jagielski 
1718*b1cdbd2cSJim Jagielski 	// Add, set Style and properties from base shape
1719*b1cdbd2cSJim Jagielski 	AddShape(pService);
1720*b1cdbd2cSJim Jagielski 
1721*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
1722*b1cdbd2cSJim Jagielski 	{
1723*b1cdbd2cSJim Jagielski 		SetStyle();
1724*b1cdbd2cSJim Jagielski 		SetLayer();
1725*b1cdbd2cSJim Jagielski 
1726*b1cdbd2cSJim Jagielski 		if(bIsPresShape)
1727*b1cdbd2cSJim Jagielski 		{
1728*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
1729*b1cdbd2cSJim Jagielski 			if(xProps.is())
1730*b1cdbd2cSJim Jagielski 			{
1731*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
1732*b1cdbd2cSJim Jagielski 				if( xPropsInfo.is() )
1733*b1cdbd2cSJim Jagielski 				{
1734*b1cdbd2cSJim Jagielski 					if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
1735*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
1736*b1cdbd2cSJim Jagielski 
1737*b1cdbd2cSJim Jagielski 					if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
1738*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
1739*b1cdbd2cSJim Jagielski 				}
1740*b1cdbd2cSJim Jagielski 			}
1741*b1cdbd2cSJim Jagielski 		}
1742*b1cdbd2cSJim Jagielski 
1743*b1cdbd2cSJim Jagielski 		if( bClearText )
1744*b1cdbd2cSJim Jagielski 		{
1745*b1cdbd2cSJim Jagielski 			uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
1746*b1cdbd2cSJim Jagielski 			OUString aEmpty;
1747*b1cdbd2cSJim Jagielski 			xText->setString( aEmpty );
1748*b1cdbd2cSJim Jagielski 		}
1749*b1cdbd2cSJim Jagielski 
1750*b1cdbd2cSJim Jagielski 		// set parameters on shape
1751*b1cdbd2cSJim Jagielski //A AW->CL: Eventually You need to strip scale and translate from the transformation
1752*b1cdbd2cSJim Jagielski //A to reach the same goal again.
1753*b1cdbd2cSJim Jagielski //A		if(!bIsPresShape || mbIsUserTransformed)
1754*b1cdbd2cSJim Jagielski //A		{
1755*b1cdbd2cSJim Jagielski //A			// set pos and size on shape, this should remove binding
1756*b1cdbd2cSJim Jagielski //A			// to pres object on masterpage
1757*b1cdbd2cSJim Jagielski //A			SetSizeAndPosition();
1758*b1cdbd2cSJim Jagielski //A		}
1759*b1cdbd2cSJim Jagielski 
1760*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
1761*b1cdbd2cSJim Jagielski 		SetTransformation();
1762*b1cdbd2cSJim Jagielski 
1763*b1cdbd2cSJim Jagielski 		if(mnRadius)
1764*b1cdbd2cSJim Jagielski 		{
1765*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1766*b1cdbd2cSJim Jagielski 			if(xPropSet.is())
1767*b1cdbd2cSJim Jagielski 			{
1768*b1cdbd2cSJim Jagielski 				try
1769*b1cdbd2cSJim Jagielski 				{
1770*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
1771*b1cdbd2cSJim Jagielski 				}
1772*b1cdbd2cSJim Jagielski 				catch( uno::Exception& )
1773*b1cdbd2cSJim Jagielski 				{
1774*b1cdbd2cSJim Jagielski 					DBG_ERROR( "exception during setting of corner radius!");
1775*b1cdbd2cSJim Jagielski 				}
1776*b1cdbd2cSJim Jagielski 			}
1777*b1cdbd2cSJim Jagielski 		}
1778*b1cdbd2cSJim Jagielski 
1779*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(mxAttrList);
1780*b1cdbd2cSJim Jagielski 	}
1781*b1cdbd2cSJim Jagielski }
1782*b1cdbd2cSJim Jagielski 
1783*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1784*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1785*b1cdbd2cSJim Jagielski 
1786*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLControlShapeContext, SdXMLShapeContext );
1787*b1cdbd2cSJim Jagielski 
SdXMLControlShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1788*b1cdbd2cSJim Jagielski SdXMLControlShapeContext::SdXMLControlShapeContext(
1789*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
1790*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
1791*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
1792*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1793*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
1794*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
1795*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
1796*b1cdbd2cSJim Jagielski {
1797*b1cdbd2cSJim Jagielski }
1798*b1cdbd2cSJim Jagielski 
1799*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1800*b1cdbd2cSJim Jagielski 
~SdXMLControlShapeContext()1801*b1cdbd2cSJim Jagielski SdXMLControlShapeContext::~SdXMLControlShapeContext()
1802*b1cdbd2cSJim Jagielski {
1803*b1cdbd2cSJim Jagielski }
1804*b1cdbd2cSJim Jagielski 
1805*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1808*b1cdbd2cSJim Jagielski void SdXMLControlShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1809*b1cdbd2cSJim Jagielski {
1810*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_DRAW == nPrefix )
1811*b1cdbd2cSJim Jagielski 	{
1812*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CONTROL ) )
1813*b1cdbd2cSJim Jagielski 		{
1814*b1cdbd2cSJim Jagielski 			maFormId = rValue;
1815*b1cdbd2cSJim Jagielski 			return;
1816*b1cdbd2cSJim Jagielski 		}
1817*b1cdbd2cSJim Jagielski 	}
1818*b1cdbd2cSJim Jagielski 
1819*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1820*b1cdbd2cSJim Jagielski }
1821*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1822*b1cdbd2cSJim Jagielski void SdXMLControlShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1823*b1cdbd2cSJim Jagielski {
1824*b1cdbd2cSJim Jagielski 	// create Control shape
1825*b1cdbd2cSJim Jagielski 	// add, set style and properties from base shape
1826*b1cdbd2cSJim Jagielski 	AddShape("com.sun.star.drawing.ControlShape");
1827*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
1828*b1cdbd2cSJim Jagielski 	{
1829*b1cdbd2cSJim Jagielski 		DBG_ASSERT( maFormId.getLength(), "draw:control without a form:id attribute!" );
1830*b1cdbd2cSJim Jagielski 		if( maFormId.getLength() )
1831*b1cdbd2cSJim Jagielski 		{
1832*b1cdbd2cSJim Jagielski #ifndef SVX_LIGHT
1833*b1cdbd2cSJim Jagielski 			if( GetImport().IsFormsSupported() )
1834*b1cdbd2cSJim Jagielski 			{
1835*b1cdbd2cSJim Jagielski 				uno::Reference< awt::XControlModel > xControlModel( GetImport().GetFormImport()->lookupControl( maFormId ), uno::UNO_QUERY );
1836*b1cdbd2cSJim Jagielski 				if( xControlModel.is() )
1837*b1cdbd2cSJim Jagielski 				{
1838*b1cdbd2cSJim Jagielski 					uno::Reference< drawing::XControlShape > xControl( mxShape, uno::UNO_QUERY );
1839*b1cdbd2cSJim Jagielski 					if( xControl.is() )
1840*b1cdbd2cSJim Jagielski 						xControl->setControl(  xControlModel );
1841*b1cdbd2cSJim Jagielski 
1842*b1cdbd2cSJim Jagielski 				}
1843*b1cdbd2cSJim Jagielski 			}
1844*b1cdbd2cSJim Jagielski #endif // #ifndef SVX_LIGHT
1845*b1cdbd2cSJim Jagielski 		}
1846*b1cdbd2cSJim Jagielski 
1847*b1cdbd2cSJim Jagielski 		SetStyle();
1848*b1cdbd2cSJim Jagielski 		SetLayer();
1849*b1cdbd2cSJim Jagielski 
1850*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
1851*b1cdbd2cSJim Jagielski 		SetTransformation();
1852*b1cdbd2cSJim Jagielski 
1853*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
1854*b1cdbd2cSJim Jagielski 	}
1855*b1cdbd2cSJim Jagielski }
1856*b1cdbd2cSJim Jagielski 
1857*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1858*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1859*b1cdbd2cSJim Jagielski 
1860*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLConnectorShapeContext, SdXMLShapeContext );
1861*b1cdbd2cSJim Jagielski 
SdXMLConnectorShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1862*b1cdbd2cSJim Jagielski SdXMLConnectorShapeContext::SdXMLConnectorShapeContext(
1863*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
1864*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
1865*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
1866*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1867*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
1868*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
1869*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1870*b1cdbd2cSJim Jagielski 	maStart(0,0),
1871*b1cdbd2cSJim Jagielski 	maEnd(1,1),
1872*b1cdbd2cSJim Jagielski 	mnType( (sal_uInt16)drawing::ConnectorType_STANDARD ),
1873*b1cdbd2cSJim Jagielski 	mnStartGlueId(-1),
1874*b1cdbd2cSJim Jagielski 	mnEndGlueId(-1),
1875*b1cdbd2cSJim Jagielski 	mnDelta1(0),
1876*b1cdbd2cSJim Jagielski 	mnDelta2(0),
1877*b1cdbd2cSJim Jagielski 	mnDelta3(0)
1878*b1cdbd2cSJim Jagielski {
1879*b1cdbd2cSJim Jagielski }
1880*b1cdbd2cSJim Jagielski 
1881*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1882*b1cdbd2cSJim Jagielski 
~SdXMLConnectorShapeContext()1883*b1cdbd2cSJim Jagielski SdXMLConnectorShapeContext::~SdXMLConnectorShapeContext()
1884*b1cdbd2cSJim Jagielski {
1885*b1cdbd2cSJim Jagielski }
1886*b1cdbd2cSJim Jagielski 
1887*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1888*b1cdbd2cSJim Jagielski 
1889*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1890*b1cdbd2cSJim Jagielski void SdXMLConnectorShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1891*b1cdbd2cSJim Jagielski {
1892*b1cdbd2cSJim Jagielski 	switch( nPrefix )
1893*b1cdbd2cSJim Jagielski 	{
1894*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_DRAW:
1895*b1cdbd2cSJim Jagielski 	{
1896*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_START_SHAPE ) )
1897*b1cdbd2cSJim Jagielski 		{
1898*b1cdbd2cSJim Jagielski 			maStartShapeId = rValue;
1899*b1cdbd2cSJim Jagielski 			return;
1900*b1cdbd2cSJim Jagielski 		}
1901*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_START_GLUE_POINT ) )
1902*b1cdbd2cSJim Jagielski 		{
1903*b1cdbd2cSJim Jagielski 			mnStartGlueId = rValue.toInt32();
1904*b1cdbd2cSJim Jagielski 			return;
1905*b1cdbd2cSJim Jagielski 		}
1906*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_END_SHAPE ) )
1907*b1cdbd2cSJim Jagielski 		{
1908*b1cdbd2cSJim Jagielski 			maEndShapeId = rValue;
1909*b1cdbd2cSJim Jagielski 			return;
1910*b1cdbd2cSJim Jagielski 		}
1911*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_END_GLUE_POINT ) )
1912*b1cdbd2cSJim Jagielski 		{
1913*b1cdbd2cSJim Jagielski 			mnEndGlueId = rValue.toInt32();
1914*b1cdbd2cSJim Jagielski 			return;
1915*b1cdbd2cSJim Jagielski 		}
1916*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_LINE_SKEW ) )
1917*b1cdbd2cSJim Jagielski 		{
1918*b1cdbd2cSJim Jagielski 			SvXMLTokenEnumerator aTokenEnum( rValue );
1919*b1cdbd2cSJim Jagielski 			OUString aToken;
1920*b1cdbd2cSJim Jagielski 			if( aTokenEnum.getNextToken( aToken ) )
1921*b1cdbd2cSJim Jagielski 			{
1922*b1cdbd2cSJim Jagielski 				GetImport().GetMM100UnitConverter().convertMeasure(mnDelta1, aToken);
1923*b1cdbd2cSJim Jagielski 				if( aTokenEnum.getNextToken( aToken ) )
1924*b1cdbd2cSJim Jagielski 				{
1925*b1cdbd2cSJim Jagielski 					GetImport().GetMM100UnitConverter().convertMeasure(mnDelta2, aToken);
1926*b1cdbd2cSJim Jagielski 					if( aTokenEnum.getNextToken( aToken ) )
1927*b1cdbd2cSJim Jagielski 					{
1928*b1cdbd2cSJim Jagielski 						GetImport().GetMM100UnitConverter().convertMeasure(mnDelta3, aToken);
1929*b1cdbd2cSJim Jagielski 					}
1930*b1cdbd2cSJim Jagielski 				}
1931*b1cdbd2cSJim Jagielski 			}
1932*b1cdbd2cSJim Jagielski 			return;
1933*b1cdbd2cSJim Jagielski 		}
1934*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_TYPE ) )
1935*b1cdbd2cSJim Jagielski 		{
1936*b1cdbd2cSJim Jagielski 			SvXMLUnitConverter::convertEnum( mnType, rValue, aXML_ConnectionKind_EnumMap );
1937*b1cdbd2cSJim Jagielski 			return;
1938*b1cdbd2cSJim Jagielski 		}
1939*b1cdbd2cSJim Jagielski         // #121965# draw:transform may be used in ODF1.2, e.g. exports from MS seem to use these
1940*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
1941*b1cdbd2cSJim Jagielski 		{
1942*b1cdbd2cSJim Jagielski 			mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter());
1943*b1cdbd2cSJim Jagielski 		}
1944*b1cdbd2cSJim Jagielski 	}
1945*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_SVG:
1946*b1cdbd2cSJim Jagielski 	{
1947*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_X1 ) )
1948*b1cdbd2cSJim Jagielski 		{
1949*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maStart.X, rValue);
1950*b1cdbd2cSJim Jagielski 			return;
1951*b1cdbd2cSJim Jagielski 		}
1952*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_Y1 ) )
1953*b1cdbd2cSJim Jagielski 		{
1954*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maStart.Y, rValue);
1955*b1cdbd2cSJim Jagielski 			return;
1956*b1cdbd2cSJim Jagielski 		}
1957*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_X2 ) )
1958*b1cdbd2cSJim Jagielski 		{
1959*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.X, rValue);
1960*b1cdbd2cSJim Jagielski 			return;
1961*b1cdbd2cSJim Jagielski 		}
1962*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_Y2 ) )
1963*b1cdbd2cSJim Jagielski 		{
1964*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue);
1965*b1cdbd2cSJim Jagielski 			return;
1966*b1cdbd2cSJim Jagielski 		}
1967*b1cdbd2cSJim Jagielski         if( IsXMLToken( rLocalName, XML_D ) )
1968*b1cdbd2cSJim Jagielski         {
1969*b1cdbd2cSJim Jagielski             basegfx::B2DPolyPolygon aPolyPolygon;
1970*b1cdbd2cSJim Jagielski 
1971*b1cdbd2cSJim Jagielski             if(basegfx::tools::importFromSvgD(aPolyPolygon, rValue, true, 0))
1972*b1cdbd2cSJim Jagielski             {
1973*b1cdbd2cSJim Jagielski                 if(aPolyPolygon.count())
1974*b1cdbd2cSJim Jagielski                 {
1975*b1cdbd2cSJim Jagielski                     // set polygon data
1976*b1cdbd2cSJim Jagielski                     if(aPolyPolygon.areControlPointsUsed())
1977*b1cdbd2cSJim Jagielski                     {
1978*b1cdbd2cSJim Jagielski                         drawing::PolyPolygonBezierCoords aSourcePolyPolygon;
1979*b1cdbd2cSJim Jagielski 
1980*b1cdbd2cSJim Jagielski                         basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords(
1981*b1cdbd2cSJim Jagielski                             aPolyPolygon,
1982*b1cdbd2cSJim Jagielski                             aSourcePolyPolygon);
1983*b1cdbd2cSJim Jagielski                         maPath <<= aSourcePolyPolygon;
1984*b1cdbd2cSJim Jagielski                     }
1985*b1cdbd2cSJim Jagielski                     else
1986*b1cdbd2cSJim Jagielski                     {
1987*b1cdbd2cSJim Jagielski                         drawing::PointSequenceSequence aSourcePolyPolygon;
1988*b1cdbd2cSJim Jagielski 
1989*b1cdbd2cSJim Jagielski                         basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(
1990*b1cdbd2cSJim Jagielski                             aPolyPolygon,
1991*b1cdbd2cSJim Jagielski                             aSourcePolyPolygon);
1992*b1cdbd2cSJim Jagielski                         maPath <<= aSourcePolyPolygon;
1993*b1cdbd2cSJim Jagielski                     }
1994*b1cdbd2cSJim Jagielski                 }
1995*b1cdbd2cSJim Jagielski             }
1996*b1cdbd2cSJim Jagielski         }
1997*b1cdbd2cSJim Jagielski 	}
1998*b1cdbd2cSJim Jagielski 	}
1999*b1cdbd2cSJim Jagielski 
2000*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2001*b1cdbd2cSJim Jagielski }
2002*b1cdbd2cSJim Jagielski 
2003*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2004*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2005*b1cdbd2cSJim Jagielski void SdXMLConnectorShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2006*b1cdbd2cSJim Jagielski {
2007*b1cdbd2cSJim Jagielski 	// #107928#
2008*b1cdbd2cSJim Jagielski 	// For security reasons, do not add empty connectors. There may have been an error in EA2
2009*b1cdbd2cSJim Jagielski 	// that created empty, far set off connectors (e.g. 63 meters below top of document). This
2010*b1cdbd2cSJim Jagielski 	// is not guaranteed, but it's definitely safe to not add empty connectors.
2011*b1cdbd2cSJim Jagielski 	sal_Bool bDoAdd(sal_True);
2012*b1cdbd2cSJim Jagielski 
2013*b1cdbd2cSJim Jagielski 	if(    0 == maStartShapeId.getLength()
2014*b1cdbd2cSJim Jagielski 		&& 0 == maEndShapeId.getLength()
2015*b1cdbd2cSJim Jagielski 		&& maStart.X == maEnd.X
2016*b1cdbd2cSJim Jagielski 		&& maStart.Y == maEnd.Y
2017*b1cdbd2cSJim Jagielski 		&& 0 == mnDelta1
2018*b1cdbd2cSJim Jagielski 		&& 0 == mnDelta2
2019*b1cdbd2cSJim Jagielski 		&& 0 == mnDelta3
2020*b1cdbd2cSJim Jagielski 		)
2021*b1cdbd2cSJim Jagielski 	{
2022*b1cdbd2cSJim Jagielski 		bDoAdd = sal_False;
2023*b1cdbd2cSJim Jagielski 	}
2024*b1cdbd2cSJim Jagielski 
2025*b1cdbd2cSJim Jagielski 	if(bDoAdd)
2026*b1cdbd2cSJim Jagielski 	{
2027*b1cdbd2cSJim Jagielski 		// create Connector shape
2028*b1cdbd2cSJim Jagielski 		// add, set style and properties from base shape
2029*b1cdbd2cSJim Jagielski 		AddShape("com.sun.star.drawing.ConnectorShape");
2030*b1cdbd2cSJim Jagielski 		if(mxShape.is())
2031*b1cdbd2cSJim Jagielski 		{
2032*b1cdbd2cSJim Jagielski             // #121965# if draw:transform is used, apply directly to the start
2033*b1cdbd2cSJim Jagielski             // and end positions before using these
2034*b1cdbd2cSJim Jagielski             if(mnTransform.NeedsAction())
2035*b1cdbd2cSJim Jagielski             {
2036*b1cdbd2cSJim Jagielski                 // transformation is used, apply to object.
2037*b1cdbd2cSJim Jagielski                 ::basegfx::B2DHomMatrix aMat;
2038*b1cdbd2cSJim Jagielski                 mnTransform.GetFullTransform(aMat);
2039*b1cdbd2cSJim Jagielski 
2040*b1cdbd2cSJim Jagielski                 if(!aMat.isIdentity())
2041*b1cdbd2cSJim Jagielski                 {
2042*b1cdbd2cSJim Jagielski                     basegfx::B2DPoint aStart(maStart.X, maStart.Y);
2043*b1cdbd2cSJim Jagielski                     basegfx::B2DPoint aEnd(maEnd.X, maEnd.Y);
2044*b1cdbd2cSJim Jagielski 
2045*b1cdbd2cSJim Jagielski                     aStart = aMat * aStart;
2046*b1cdbd2cSJim Jagielski                     aEnd = aMat * aEnd;
2047*b1cdbd2cSJim Jagielski 
2048*b1cdbd2cSJim Jagielski                     maStart.X = basegfx::fround(aStart.getX());
2049*b1cdbd2cSJim Jagielski                     maStart.Y = basegfx::fround(aStart.getY());
2050*b1cdbd2cSJim Jagielski                     maEnd.X = basegfx::fround(aEnd.getX());
2051*b1cdbd2cSJim Jagielski                     maEnd.Y = basegfx::fround(aEnd.getY());
2052*b1cdbd2cSJim Jagielski                 }
2053*b1cdbd2cSJim Jagielski             }
2054*b1cdbd2cSJim Jagielski 
2055*b1cdbd2cSJim Jagielski             // add connection ids
2056*b1cdbd2cSJim Jagielski 			if( maStartShapeId.getLength() )
2057*b1cdbd2cSJim Jagielski 				GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_True, maStartShapeId, mnStartGlueId );
2058*b1cdbd2cSJim Jagielski 			if( maEndShapeId.getLength() )
2059*b1cdbd2cSJim Jagielski 				GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_False, maEndShapeId, mnEndGlueId );
2060*b1cdbd2cSJim Jagielski 
2061*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2062*b1cdbd2cSJim Jagielski 			if( xProps.is() )
2063*b1cdbd2cSJim Jagielski 			{
2064*b1cdbd2cSJim Jagielski 				uno::Any aAny;
2065*b1cdbd2cSJim Jagielski 				aAny <<= maStart;
2066*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")), aAny);
2067*b1cdbd2cSJim Jagielski 
2068*b1cdbd2cSJim Jagielski 				aAny <<= maEnd;
2069*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")), aAny );
2070*b1cdbd2cSJim Jagielski 
2071*b1cdbd2cSJim Jagielski 				aAny <<= (drawing::ConnectorType)mnType;
2072*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeKind")), aAny );
2073*b1cdbd2cSJim Jagielski 
2074*b1cdbd2cSJim Jagielski 				aAny <<= mnDelta1;
2075*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine1Delta")), aAny );
2076*b1cdbd2cSJim Jagielski 
2077*b1cdbd2cSJim Jagielski 				aAny <<= mnDelta2;
2078*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine2Delta")), aAny );
2079*b1cdbd2cSJim Jagielski 
2080*b1cdbd2cSJim Jagielski 				aAny <<= mnDelta3;
2081*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine3Delta")), aAny );
2082*b1cdbd2cSJim Jagielski 			}
2083*b1cdbd2cSJim Jagielski 			SetStyle();
2084*b1cdbd2cSJim Jagielski 			SetLayer();
2085*b1cdbd2cSJim Jagielski 
2086*b1cdbd2cSJim Jagielski 			if ( maPath.hasValue() )
2087*b1cdbd2cSJim Jagielski             {
2088*b1cdbd2cSJim Jagielski                 // --> OD #i115492#
2089*b1cdbd2cSJim Jagielski                 // Ignore svg:d attribute for text documents created by OpenOffice.org
2090*b1cdbd2cSJim Jagielski                 // versions before OOo 3.3, because these OOo versions are storing
2091*b1cdbd2cSJim Jagielski                 // svg:d values not using the correct unit.
2092*b1cdbd2cSJim Jagielski                 bool bApplySVGD( true );
2093*b1cdbd2cSJim Jagielski                 if ( uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() )
2094*b1cdbd2cSJim Jagielski                 {
2095*b1cdbd2cSJim Jagielski                     sal_Int32 nUPD( 0 );
2096*b1cdbd2cSJim Jagielski                     sal_Int32 nBuild( 0 );
2097*b1cdbd2cSJim Jagielski                     const bool bBuildIdFound = GetImport().getBuildIds( nUPD, nBuild );
2098*b1cdbd2cSJim Jagielski                     if ( GetImport().IsTextDocInOOoFileFormat() ||
2099*b1cdbd2cSJim Jagielski                          ( bBuildIdFound &&
2100*b1cdbd2cSJim Jagielski                            ( ( nUPD == 641 ) || ( nUPD == 645 ) ||  // prior OOo 2.0
2101*b1cdbd2cSJim Jagielski                              ( nUPD == 680 ) ||                     // OOo 2.x
2102*b1cdbd2cSJim Jagielski                              ( nUPD == 300 ) ||                     // OOo 3.0 - OOo 3.0.1
2103*b1cdbd2cSJim Jagielski                              ( nUPD == 310 ) ||                     // OOo 3.1 - OOo 3.1.1
2104*b1cdbd2cSJim Jagielski                              ( nUPD == 320 ) ) ) )                  // OOo 3.2 - OOo 3.2.1
2105*b1cdbd2cSJim Jagielski                     {
2106*b1cdbd2cSJim Jagielski                         bApplySVGD = false;
2107*b1cdbd2cSJim Jagielski                     }
2108*b1cdbd2cSJim Jagielski                 }
2109*b1cdbd2cSJim Jagielski 
2110*b1cdbd2cSJim Jagielski                 if ( bApplySVGD )
2111*b1cdbd2cSJim Jagielski                 {
2112*b1cdbd2cSJim Jagielski                     xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("PolyPolygonBezier") ), maPath );
2113*b1cdbd2cSJim Jagielski                 }
2114*b1cdbd2cSJim Jagielski                 // <--
2115*b1cdbd2cSJim Jagielski             }
2116*b1cdbd2cSJim Jagielski 
2117*b1cdbd2cSJim Jagielski 			SdXMLShapeContext::StartElement(xAttrList);
2118*b1cdbd2cSJim Jagielski 		}
2119*b1cdbd2cSJim Jagielski 	}
2120*b1cdbd2cSJim Jagielski }
2121*b1cdbd2cSJim Jagielski 
2122*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2123*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2124*b1cdbd2cSJim Jagielski 
2125*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLMeasureShapeContext, SdXMLShapeContext );
2126*b1cdbd2cSJim Jagielski 
SdXMLMeasureShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2127*b1cdbd2cSJim Jagielski SdXMLMeasureShapeContext::SdXMLMeasureShapeContext(
2128*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
2129*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
2130*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
2131*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2132*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
2133*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
2134*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2135*b1cdbd2cSJim Jagielski 	maStart(0,0),
2136*b1cdbd2cSJim Jagielski 	maEnd(1,1)
2137*b1cdbd2cSJim Jagielski {
2138*b1cdbd2cSJim Jagielski }
2139*b1cdbd2cSJim Jagielski 
2140*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2141*b1cdbd2cSJim Jagielski 
~SdXMLMeasureShapeContext()2142*b1cdbd2cSJim Jagielski SdXMLMeasureShapeContext::~SdXMLMeasureShapeContext()
2143*b1cdbd2cSJim Jagielski {
2144*b1cdbd2cSJim Jagielski }
2145*b1cdbd2cSJim Jagielski 
2146*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2147*b1cdbd2cSJim Jagielski void SdXMLMeasureShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2148*b1cdbd2cSJim Jagielski {
2149*b1cdbd2cSJim Jagielski 	switch( nPrefix )
2150*b1cdbd2cSJim Jagielski 	{
2151*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_SVG:
2152*b1cdbd2cSJim Jagielski 	{
2153*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_X1 ) )
2154*b1cdbd2cSJim Jagielski 		{
2155*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maStart.X, rValue);
2156*b1cdbd2cSJim Jagielski 			return;
2157*b1cdbd2cSJim Jagielski 		}
2158*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_Y1 ) )
2159*b1cdbd2cSJim Jagielski 		{
2160*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maStart.Y, rValue);
2161*b1cdbd2cSJim Jagielski 			return;
2162*b1cdbd2cSJim Jagielski 		}
2163*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_X2 ) )
2164*b1cdbd2cSJim Jagielski 		{
2165*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.X, rValue);
2166*b1cdbd2cSJim Jagielski 			return;
2167*b1cdbd2cSJim Jagielski 		}
2168*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_Y2 ) )
2169*b1cdbd2cSJim Jagielski 		{
2170*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue);
2171*b1cdbd2cSJim Jagielski 			return;
2172*b1cdbd2cSJim Jagielski 		}
2173*b1cdbd2cSJim Jagielski 	}
2174*b1cdbd2cSJim Jagielski 	}
2175*b1cdbd2cSJim Jagielski 
2176*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2177*b1cdbd2cSJim Jagielski }
2178*b1cdbd2cSJim Jagielski 
2179*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2180*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2181*b1cdbd2cSJim Jagielski void SdXMLMeasureShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2182*b1cdbd2cSJim Jagielski {
2183*b1cdbd2cSJim Jagielski 	// create Measure shape
2184*b1cdbd2cSJim Jagielski 	// add, set style and properties from base shape
2185*b1cdbd2cSJim Jagielski 	AddShape("com.sun.star.drawing.MeasureShape");
2186*b1cdbd2cSJim Jagielski 	if(mxShape.is())
2187*b1cdbd2cSJim Jagielski 	{
2188*b1cdbd2cSJim Jagielski 		SetStyle();
2189*b1cdbd2cSJim Jagielski 		SetLayer();
2190*b1cdbd2cSJim Jagielski 
2191*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2192*b1cdbd2cSJim Jagielski 		if( xProps.is() )
2193*b1cdbd2cSJim Jagielski 		{
2194*b1cdbd2cSJim Jagielski 			uno::Any aAny;
2195*b1cdbd2cSJim Jagielski 			aAny <<= maStart;
2196*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")), aAny);
2197*b1cdbd2cSJim Jagielski 
2198*b1cdbd2cSJim Jagielski 			aAny <<= maEnd;
2199*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")), aAny );
2200*b1cdbd2cSJim Jagielski 		}
2201*b1cdbd2cSJim Jagielski 
2202*b1cdbd2cSJim Jagielski 		// delete pre created fields
2203*b1cdbd2cSJim Jagielski 		uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
2204*b1cdbd2cSJim Jagielski 		if( xText.is() )
2205*b1cdbd2cSJim Jagielski 		{
2206*b1cdbd2cSJim Jagielski 			const OUString aEmpty( RTL_CONSTASCII_USTRINGPARAM( " " ) );
2207*b1cdbd2cSJim Jagielski 			xText->setString( aEmpty );
2208*b1cdbd2cSJim Jagielski 		}
2209*b1cdbd2cSJim Jagielski 
2210*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
2211*b1cdbd2cSJim Jagielski 	}
2212*b1cdbd2cSJim Jagielski }
2213*b1cdbd2cSJim Jagielski 
EndElement()2214*b1cdbd2cSJim Jagielski void SdXMLMeasureShapeContext::EndElement()
2215*b1cdbd2cSJim Jagielski {
2216*b1cdbd2cSJim Jagielski 	do
2217*b1cdbd2cSJim Jagielski 	{
2218*b1cdbd2cSJim Jagielski 		// delete pre created fields
2219*b1cdbd2cSJim Jagielski 		uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
2220*b1cdbd2cSJim Jagielski 		if( !xText.is() )
2221*b1cdbd2cSJim Jagielski 			break;
2222*b1cdbd2cSJim Jagielski 
2223*b1cdbd2cSJim Jagielski 		uno::Reference< text::XTextCursor > xCursor( xText->createTextCursor() );
2224*b1cdbd2cSJim Jagielski 		if( !xCursor.is() )
2225*b1cdbd2cSJim Jagielski 			break;
2226*b1cdbd2cSJim Jagielski 
2227*b1cdbd2cSJim Jagielski 		const OUString aEmpty;
2228*b1cdbd2cSJim Jagielski 		xCursor->collapseToStart();
2229*b1cdbd2cSJim Jagielski 		xCursor->goRight( 1, sal_True );
2230*b1cdbd2cSJim Jagielski 		xCursor->setString( aEmpty );
2231*b1cdbd2cSJim Jagielski 	}
2232*b1cdbd2cSJim Jagielski 	while(0);
2233*b1cdbd2cSJim Jagielski 
2234*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
2235*b1cdbd2cSJim Jagielski }
2236*b1cdbd2cSJim Jagielski 
2237*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2238*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2239*b1cdbd2cSJim Jagielski 
2240*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLPageShapeContext, SdXMLShapeContext );
2241*b1cdbd2cSJim Jagielski 
SdXMLPageShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2242*b1cdbd2cSJim Jagielski SdXMLPageShapeContext::SdXMLPageShapeContext(
2243*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
2244*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
2245*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
2246*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2247*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
2248*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
2249*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), mnPageNumber(0)
2250*b1cdbd2cSJim Jagielski {
2251*b1cdbd2cSJim Jagielski 	mbClearDefaultAttributes = false;
2252*b1cdbd2cSJim Jagielski }
2253*b1cdbd2cSJim Jagielski 
2254*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2255*b1cdbd2cSJim Jagielski 
~SdXMLPageShapeContext()2256*b1cdbd2cSJim Jagielski SdXMLPageShapeContext::~SdXMLPageShapeContext()
2257*b1cdbd2cSJim Jagielski {
2258*b1cdbd2cSJim Jagielski }
2259*b1cdbd2cSJim Jagielski 
2260*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2261*b1cdbd2cSJim Jagielski 
2262*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2263*b1cdbd2cSJim Jagielski void SdXMLPageShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2264*b1cdbd2cSJim Jagielski {
2265*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_DRAW == nPrefix )
2266*b1cdbd2cSJim Jagielski 	{
2267*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_PAGE_NUMBER ) )
2268*b1cdbd2cSJim Jagielski 		{
2269*b1cdbd2cSJim Jagielski 			mnPageNumber = rValue.toInt32();
2270*b1cdbd2cSJim Jagielski 			return;
2271*b1cdbd2cSJim Jagielski 		}
2272*b1cdbd2cSJim Jagielski 	}
2273*b1cdbd2cSJim Jagielski 
2274*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2275*b1cdbd2cSJim Jagielski }
2276*b1cdbd2cSJim Jagielski 
2277*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2278*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2279*b1cdbd2cSJim Jagielski void SdXMLPageShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2280*b1cdbd2cSJim Jagielski {
2281*b1cdbd2cSJim Jagielski 	// create Page shape
2282*b1cdbd2cSJim Jagielski 	// add, set style and properties from base shape
2283*b1cdbd2cSJim Jagielski 
2284*b1cdbd2cSJim Jagielski 	// #86163# take into account which type of PageShape needs to
2285*b1cdbd2cSJim Jagielski 	// be constructed. It's an pres shape if presentation:XML_CLASS == XML_PRESENTATION_PAGE.
2286*b1cdbd2cSJim Jagielski 	sal_Bool bIsPresentation = maPresentationClass.getLength() &&
2287*b1cdbd2cSJim Jagielski 		   GetImport().GetShapeImport()->IsPresentationShapesSupported();
2288*b1cdbd2cSJim Jagielski 
2289*b1cdbd2cSJim Jagielski 	uno::Reference< lang::XServiceInfo > xInfo( mxShapes, uno::UNO_QUERY );
2290*b1cdbd2cSJim Jagielski 	const sal_Bool bIsOnHandoutPage = xInfo.is() && xInfo->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.HandoutMasterPage")) );
2291*b1cdbd2cSJim Jagielski 
2292*b1cdbd2cSJim Jagielski 	if( bIsOnHandoutPage )
2293*b1cdbd2cSJim Jagielski 	{
2294*b1cdbd2cSJim Jagielski 		AddShape("com.sun.star.presentation.HandoutShape");
2295*b1cdbd2cSJim Jagielski 	}
2296*b1cdbd2cSJim Jagielski 	else
2297*b1cdbd2cSJim Jagielski 	{
2298*b1cdbd2cSJim Jagielski 		if(bIsPresentation && !IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) )
2299*b1cdbd2cSJim Jagielski 		{
2300*b1cdbd2cSJim Jagielski 			bIsPresentation = sal_False;
2301*b1cdbd2cSJim Jagielski 		}
2302*b1cdbd2cSJim Jagielski 
2303*b1cdbd2cSJim Jagielski 		if(bIsPresentation)
2304*b1cdbd2cSJim Jagielski 		{
2305*b1cdbd2cSJim Jagielski 			AddShape("com.sun.star.presentation.PageShape");
2306*b1cdbd2cSJim Jagielski 		}
2307*b1cdbd2cSJim Jagielski 		else
2308*b1cdbd2cSJim Jagielski 		{
2309*b1cdbd2cSJim Jagielski 			AddShape("com.sun.star.drawing.PageShape");
2310*b1cdbd2cSJim Jagielski 		}
2311*b1cdbd2cSJim Jagielski 	}
2312*b1cdbd2cSJim Jagielski 
2313*b1cdbd2cSJim Jagielski 	if(mxShape.is())
2314*b1cdbd2cSJim Jagielski 	{
2315*b1cdbd2cSJim Jagielski 		SetStyle();
2316*b1cdbd2cSJim Jagielski 		SetLayer();
2317*b1cdbd2cSJim Jagielski 
2318*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
2319*b1cdbd2cSJim Jagielski 		SetTransformation();
2320*b1cdbd2cSJim Jagielski 
2321*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2322*b1cdbd2cSJim Jagielski 		if(xPropSet.is())
2323*b1cdbd2cSJim Jagielski 		{
2324*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
2325*b1cdbd2cSJim Jagielski 			const OUString aPageNumberStr(RTL_CONSTASCII_USTRINGPARAM("PageNumber"));
2326*b1cdbd2cSJim Jagielski 			if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(aPageNumberStr))
2327*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue(aPageNumberStr, uno::makeAny( mnPageNumber ));
2328*b1cdbd2cSJim Jagielski 		}
2329*b1cdbd2cSJim Jagielski 
2330*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
2331*b1cdbd2cSJim Jagielski 	}
2332*b1cdbd2cSJim Jagielski }
2333*b1cdbd2cSJim Jagielski 
2334*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2335*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2336*b1cdbd2cSJim Jagielski 
2337*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLCaptionShapeContext, SdXMLShapeContext );
2338*b1cdbd2cSJim Jagielski 
SdXMLCaptionShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2339*b1cdbd2cSJim Jagielski SdXMLCaptionShapeContext::SdXMLCaptionShapeContext(
2340*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
2341*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
2342*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
2343*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2344*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
2345*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
2346*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2347*b1cdbd2cSJim Jagielski 	// #86616# for correct edge rounding import mnRadius needs to be initialized
2348*b1cdbd2cSJim Jagielski 	mnRadius( 0L )
2349*b1cdbd2cSJim Jagielski {
2350*b1cdbd2cSJim Jagielski }
2351*b1cdbd2cSJim Jagielski 
2352*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2353*b1cdbd2cSJim Jagielski 
~SdXMLCaptionShapeContext()2354*b1cdbd2cSJim Jagielski SdXMLCaptionShapeContext::~SdXMLCaptionShapeContext()
2355*b1cdbd2cSJim Jagielski {
2356*b1cdbd2cSJim Jagielski }
2357*b1cdbd2cSJim Jagielski 
2358*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2359*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2360*b1cdbd2cSJim Jagielski void SdXMLCaptionShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2361*b1cdbd2cSJim Jagielski {
2362*b1cdbd2cSJim Jagielski 	// create Caption shape
2363*b1cdbd2cSJim Jagielski 	// add, set style and properties from base shape
2364*b1cdbd2cSJim Jagielski 	AddShape("com.sun.star.drawing.CaptionShape");
2365*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
2366*b1cdbd2cSJim Jagielski 	{
2367*b1cdbd2cSJim Jagielski 		SetStyle();
2368*b1cdbd2cSJim Jagielski 		SetLayer();
2369*b1cdbd2cSJim Jagielski 
2370*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2371*b1cdbd2cSJim Jagielski 
2372*b1cdbd2cSJim Jagielski 		// SJ: If AutoGrowWidthItem is set, SetTransformation will lead to the wrong SnapRect
2373*b1cdbd2cSJim Jagielski 		// because NbcAdjustTextFrameWidthAndHeight() is called (text is set later and center alignment
2374*b1cdbd2cSJim Jagielski 		// is the default setting, so the top left reference point that is used by the caption point is
2375*b1cdbd2cSJim Jagielski 		// no longer correct) There are two ways to solve this problem, temporarily disabling the
2376*b1cdbd2cSJim Jagielski 		// autogrowwith as we are doing here or to apply the CaptionPoint after setting text
2377*b1cdbd2cSJim Jagielski 		sal_Bool bIsAutoGrowWidth = sal_False;
2378*b1cdbd2cSJim Jagielski 		if ( xProps.is() )
2379*b1cdbd2cSJim Jagielski 		{
2380*b1cdbd2cSJim Jagielski 			uno::Any aAny( xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth") ) ) );
2381*b1cdbd2cSJim Jagielski 			aAny >>= bIsAutoGrowWidth;
2382*b1cdbd2cSJim Jagielski 
2383*b1cdbd2cSJim Jagielski 			if ( bIsAutoGrowWidth )
2384*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth")), uno::makeAny( sal_False ) );
2385*b1cdbd2cSJim Jagielski 		}
2386*b1cdbd2cSJim Jagielski 
2387*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
2388*b1cdbd2cSJim Jagielski 		SetTransformation();
2389*b1cdbd2cSJim Jagielski 		if( xProps.is() )
2390*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CaptionPoint")), uno::makeAny( maCaptionPoint ) );
2391*b1cdbd2cSJim Jagielski 
2392*b1cdbd2cSJim Jagielski 		if ( bIsAutoGrowWidth )
2393*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth")), uno::makeAny( sal_True ) );
2394*b1cdbd2cSJim Jagielski 
2395*b1cdbd2cSJim Jagielski 		if(mnRadius)
2396*b1cdbd2cSJim Jagielski 		{
2397*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2398*b1cdbd2cSJim Jagielski 			if(xPropSet.is())
2399*b1cdbd2cSJim Jagielski 			{
2400*b1cdbd2cSJim Jagielski 				try
2401*b1cdbd2cSJim Jagielski 				{
2402*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
2403*b1cdbd2cSJim Jagielski 				}
2404*b1cdbd2cSJim Jagielski 				catch( uno::Exception& )
2405*b1cdbd2cSJim Jagielski 				{
2406*b1cdbd2cSJim Jagielski 					DBG_ERROR( "exception during setting of corner radius!");
2407*b1cdbd2cSJim Jagielski 				}
2408*b1cdbd2cSJim Jagielski 			}
2409*b1cdbd2cSJim Jagielski 		}
2410*b1cdbd2cSJim Jagielski 
2411*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
2412*b1cdbd2cSJim Jagielski 	}
2413*b1cdbd2cSJim Jagielski }
2414*b1cdbd2cSJim Jagielski 
2415*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2416*b1cdbd2cSJim Jagielski void SdXMLCaptionShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2417*b1cdbd2cSJim Jagielski {
2418*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_DRAW == nPrefix )
2419*b1cdbd2cSJim Jagielski 	{
2420*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CAPTION_POINT_X ) )
2421*b1cdbd2cSJim Jagielski 		{
2422*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maCaptionPoint.X, rValue);
2423*b1cdbd2cSJim Jagielski 			return;
2424*b1cdbd2cSJim Jagielski 		}
2425*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CAPTION_POINT_Y ) )
2426*b1cdbd2cSJim Jagielski 		{
2427*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(maCaptionPoint.Y, rValue);
2428*b1cdbd2cSJim Jagielski 			return;
2429*b1cdbd2cSJim Jagielski 		}
2430*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
2431*b1cdbd2cSJim Jagielski 		{
2432*b1cdbd2cSJim Jagielski 			GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
2433*b1cdbd2cSJim Jagielski 			return;
2434*b1cdbd2cSJim Jagielski 		}
2435*b1cdbd2cSJim Jagielski 	}
2436*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2437*b1cdbd2cSJim Jagielski }
2438*b1cdbd2cSJim Jagielski 
2439*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2440*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2441*b1cdbd2cSJim Jagielski 
2442*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLGraphicObjectShapeContext, SdXMLShapeContext );
2443*b1cdbd2cSJim Jagielski 
SdXMLGraphicObjectShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2444*b1cdbd2cSJim Jagielski SdXMLGraphicObjectShapeContext::SdXMLGraphicObjectShapeContext(
2445*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
2446*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
2447*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
2448*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2449*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
2450*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
2451*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2452*b1cdbd2cSJim Jagielski 	maURL(),
2453*b1cdbd2cSJim Jagielski     mbLateAddToIdentifierMapper(false)
2454*b1cdbd2cSJim Jagielski {
2455*b1cdbd2cSJim Jagielski }
2456*b1cdbd2cSJim Jagielski 
2457*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2458*b1cdbd2cSJim Jagielski 
2459*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2460*b1cdbd2cSJim Jagielski void SdXMLGraphicObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2461*b1cdbd2cSJim Jagielski {
2462*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_XLINK == nPrefix )
2463*b1cdbd2cSJim Jagielski 	{
2464*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_HREF ) )
2465*b1cdbd2cSJim Jagielski 		{
2466*b1cdbd2cSJim Jagielski 			maURL = rValue;
2467*b1cdbd2cSJim Jagielski 			return;
2468*b1cdbd2cSJim Jagielski 		}
2469*b1cdbd2cSJim Jagielski 	}
2470*b1cdbd2cSJim Jagielski 
2471*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2472*b1cdbd2cSJim Jagielski }
2473*b1cdbd2cSJim Jagielski 
2474*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2475*b1cdbd2cSJim Jagielski 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)2476*b1cdbd2cSJim Jagielski void SdXMLGraphicObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2477*b1cdbd2cSJim Jagielski {
2478*b1cdbd2cSJim Jagielski 	// create graphic object shape
2479*b1cdbd2cSJim Jagielski 	const char *pService;
2480*b1cdbd2cSJim Jagielski 
2481*b1cdbd2cSJim Jagielski 	if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) && GetImport().GetShapeImport()->IsPresentationShapesSupported() )
2482*b1cdbd2cSJim Jagielski 	{
2483*b1cdbd2cSJim Jagielski 		pService = "com.sun.star.presentation.GraphicObjectShape";
2484*b1cdbd2cSJim Jagielski 	}
2485*b1cdbd2cSJim Jagielski 	else
2486*b1cdbd2cSJim Jagielski 	{
2487*b1cdbd2cSJim Jagielski 		pService = "com.sun.star.drawing.GraphicObjectShape";
2488*b1cdbd2cSJim Jagielski 	}
2489*b1cdbd2cSJim Jagielski 
2490*b1cdbd2cSJim Jagielski 	AddShape( pService );
2491*b1cdbd2cSJim Jagielski 
2492*b1cdbd2cSJim Jagielski 	if(mxShape.is())
2493*b1cdbd2cSJim Jagielski 	{
2494*b1cdbd2cSJim Jagielski 		SetStyle();
2495*b1cdbd2cSJim Jagielski 		SetLayer();
2496*b1cdbd2cSJim Jagielski 
2497*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xPropset(mxShape, uno::UNO_QUERY);
2498*b1cdbd2cSJim Jagielski 		if(xPropset.is())
2499*b1cdbd2cSJim Jagielski 		{
2500*b1cdbd2cSJim Jagielski 			// since OOo 1.x had no line or fill style for graphics, but may create
2501*b1cdbd2cSJim Jagielski 			// documents with them, we have to override them here
2502*b1cdbd2cSJim Jagielski 			sal_Int32 nUPD, nBuildId;
2503*b1cdbd2cSJim Jagielski 			if( GetImport().getBuildIds( nUPD, nBuildId ) && (nUPD == 645) ) try
2504*b1cdbd2cSJim Jagielski 			{
2505*b1cdbd2cSJim Jagielski 				xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), Any( FillStyle_NONE ) );
2506*b1cdbd2cSJim Jagielski 				xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("LineStyle")), Any( LineStyle_NONE ) );
2507*b1cdbd2cSJim Jagielski 			}
2508*b1cdbd2cSJim Jagielski 			catch( Exception& )
2509*b1cdbd2cSJim Jagielski 			{
2510*b1cdbd2cSJim Jagielski 			}
2511*b1cdbd2cSJim Jagielski 
2512*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySetInfo > xPropsInfo( xPropset->getPropertySetInfo() );
2513*b1cdbd2cSJim Jagielski 			if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2514*b1cdbd2cSJim Jagielski 				xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( mbIsPlaceholder ) );
2515*b1cdbd2cSJim Jagielski 
2516*b1cdbd2cSJim Jagielski 			if( !mbIsPlaceholder )
2517*b1cdbd2cSJim Jagielski 			{
2518*b1cdbd2cSJim Jagielski 				if( maURL.getLength() )
2519*b1cdbd2cSJim Jagielski 				{
2520*b1cdbd2cSJim Jagielski 					uno::Any aAny;
2521*b1cdbd2cSJim Jagielski 					aAny <<= GetImport().ResolveGraphicObjectURL( maURL, GetImport().isGraphicLoadOnDemandSupported() );
2522*b1cdbd2cSJim Jagielski 					try
2523*b1cdbd2cSJim Jagielski 					{
2524*b1cdbd2cSJim Jagielski 						xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL") ), aAny );
2525*b1cdbd2cSJim Jagielski 						xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL") ), aAny );
2526*b1cdbd2cSJim Jagielski 					}
2527*b1cdbd2cSJim Jagielski 					catch (lang::IllegalArgumentException const &)
2528*b1cdbd2cSJim Jagielski 					{
2529*b1cdbd2cSJim Jagielski 					}
2530*b1cdbd2cSJim Jagielski 				}
2531*b1cdbd2cSJim Jagielski 			}
2532*b1cdbd2cSJim Jagielski 		}
2533*b1cdbd2cSJim Jagielski 
2534*b1cdbd2cSJim Jagielski 		if(mbIsUserTransformed)
2535*b1cdbd2cSJim Jagielski 		{
2536*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2537*b1cdbd2cSJim Jagielski 			if(xProps.is())
2538*b1cdbd2cSJim Jagielski 			{
2539*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2540*b1cdbd2cSJim Jagielski 				if( xPropsInfo.is() )
2541*b1cdbd2cSJim Jagielski 				{
2542*b1cdbd2cSJim Jagielski 					if( xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2543*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2544*b1cdbd2cSJim Jagielski 				}
2545*b1cdbd2cSJim Jagielski 			}
2546*b1cdbd2cSJim Jagielski 		}
2547*b1cdbd2cSJim Jagielski 
2548*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
2549*b1cdbd2cSJim Jagielski 		SetTransformation();
2550*b1cdbd2cSJim Jagielski 
2551*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(mxAttrList);
2552*b1cdbd2cSJim Jagielski 	}
2553*b1cdbd2cSJim Jagielski }
2554*b1cdbd2cSJim Jagielski 
EndElement()2555*b1cdbd2cSJim Jagielski void SdXMLGraphicObjectShapeContext::EndElement()
2556*b1cdbd2cSJim Jagielski {
2557*b1cdbd2cSJim Jagielski 	if( mxBase64Stream.is() )
2558*b1cdbd2cSJim Jagielski 	{
2559*b1cdbd2cSJim Jagielski 		OUString sURL( GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream ) );
2560*b1cdbd2cSJim Jagielski 		if( sURL.getLength() )
2561*b1cdbd2cSJim Jagielski 		{
2562*b1cdbd2cSJim Jagielski 			try
2563*b1cdbd2cSJim Jagielski 			{
2564*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2565*b1cdbd2cSJim Jagielski 				if(xProps.is())
2566*b1cdbd2cSJim Jagielski 				{
2567*b1cdbd2cSJim Jagielski 					const uno::Any aAny( uno::makeAny( sURL ) );
2568*b1cdbd2cSJim Jagielski 					xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL") ), aAny );
2569*b1cdbd2cSJim Jagielski 					xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL") ), aAny );
2570*b1cdbd2cSJim Jagielski 				}
2571*b1cdbd2cSJim Jagielski 			}
2572*b1cdbd2cSJim Jagielski 			catch (lang::IllegalArgumentException const &)
2573*b1cdbd2cSJim Jagielski 			{
2574*b1cdbd2cSJim Jagielski 			}
2575*b1cdbd2cSJim Jagielski 		}
2576*b1cdbd2cSJim Jagielski 	}
2577*b1cdbd2cSJim Jagielski 
2578*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
2579*b1cdbd2cSJim Jagielski }
2580*b1cdbd2cSJim Jagielski 
2581*b1cdbd2cSJim Jagielski 
2582*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2583*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)2584*b1cdbd2cSJim Jagielski SvXMLImportContext* SdXMLGraphicObjectShapeContext::CreateChildContext(
2585*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2586*b1cdbd2cSJim Jagielski 	const uno::Reference<xml::sax::XAttributeList>& xAttrList )
2587*b1cdbd2cSJim Jagielski {
2588*b1cdbd2cSJim Jagielski 	SvXMLImportContext* pContext = NULL;
2589*b1cdbd2cSJim Jagielski 
2590*b1cdbd2cSJim Jagielski 	if( (XML_NAMESPACE_OFFICE == nPrefix) &&
2591*b1cdbd2cSJim Jagielski 			 xmloff::token::IsXMLToken( rLocalName, xmloff::token::XML_BINARY_DATA ) )
2592*b1cdbd2cSJim Jagielski 	{
2593*b1cdbd2cSJim Jagielski 		if( !maURL.getLength() && !mxBase64Stream.is() )
2594*b1cdbd2cSJim Jagielski 		{
2595*b1cdbd2cSJim Jagielski 			mxBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
2596*b1cdbd2cSJim Jagielski 			if( mxBase64Stream.is() )
2597*b1cdbd2cSJim Jagielski 				pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
2598*b1cdbd2cSJim Jagielski 													rLocalName, xAttrList,
2599*b1cdbd2cSJim Jagielski 													mxBase64Stream );
2600*b1cdbd2cSJim Jagielski 		}
2601*b1cdbd2cSJim Jagielski 	}
2602*b1cdbd2cSJim Jagielski 
2603*b1cdbd2cSJim Jagielski 	// delegate to parent class if no context could be created
2604*b1cdbd2cSJim Jagielski 	if ( NULL == pContext )
2605*b1cdbd2cSJim Jagielski 		pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName,
2606*b1cdbd2cSJim Jagielski 														 xAttrList);
2607*b1cdbd2cSJim Jagielski 
2608*b1cdbd2cSJim Jagielski 	return pContext;
2609*b1cdbd2cSJim Jagielski }
2610*b1cdbd2cSJim Jagielski 
2611*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2612*b1cdbd2cSJim Jagielski 
~SdXMLGraphicObjectShapeContext()2613*b1cdbd2cSJim Jagielski SdXMLGraphicObjectShapeContext::~SdXMLGraphicObjectShapeContext()
2614*b1cdbd2cSJim Jagielski {
2615*b1cdbd2cSJim Jagielski 
2616*b1cdbd2cSJim Jagielski }
2617*b1cdbd2cSJim Jagielski 
2618*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2619*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2620*b1cdbd2cSJim Jagielski 
2621*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLChartShapeContext, SdXMLShapeContext );
2622*b1cdbd2cSJim Jagielski 
SdXMLChartShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2623*b1cdbd2cSJim Jagielski SdXMLChartShapeContext::SdXMLChartShapeContext(
2624*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
2625*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
2626*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
2627*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2628*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
2629*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
2630*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2631*b1cdbd2cSJim Jagielski 	mpChartContext( NULL )
2632*b1cdbd2cSJim Jagielski {
2633*b1cdbd2cSJim Jagielski }
2634*b1cdbd2cSJim Jagielski 
2635*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2636*b1cdbd2cSJim Jagielski 
~SdXMLChartShapeContext()2637*b1cdbd2cSJim Jagielski SdXMLChartShapeContext::~SdXMLChartShapeContext()
2638*b1cdbd2cSJim Jagielski {
2639*b1cdbd2cSJim Jagielski 	if( mpChartContext )
2640*b1cdbd2cSJim Jagielski 		delete mpChartContext;
2641*b1cdbd2cSJim Jagielski }
2642*b1cdbd2cSJim Jagielski 
2643*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2644*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2645*b1cdbd2cSJim Jagielski void SdXMLChartShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2646*b1cdbd2cSJim Jagielski {
2647*b1cdbd2cSJim Jagielski 	const sal_Bool bIsPresentation = isPresentationShape();
2648*b1cdbd2cSJim Jagielski 
2649*b1cdbd2cSJim Jagielski 	AddShape( bIsPresentation ? "com.sun.star.presentation.ChartShape" : "com.sun.star.drawing.OLE2Shape" );
2650*b1cdbd2cSJim Jagielski 
2651*b1cdbd2cSJim Jagielski 	if(mxShape.is())
2652*b1cdbd2cSJim Jagielski 	{
2653*b1cdbd2cSJim Jagielski 		SetStyle();
2654*b1cdbd2cSJim Jagielski 		SetLayer();
2655*b1cdbd2cSJim Jagielski 
2656*b1cdbd2cSJim Jagielski 		if( !mbIsPlaceholder )
2657*b1cdbd2cSJim Jagielski 		{
2658*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2659*b1cdbd2cSJim Jagielski 			if(xProps.is())
2660*b1cdbd2cSJim Jagielski 			{
2661*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2662*b1cdbd2cSJim Jagielski 				if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2663*b1cdbd2cSJim Jagielski 					xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
2664*b1cdbd2cSJim Jagielski 
2665*b1cdbd2cSJim Jagielski 				uno::Any aAny;
2666*b1cdbd2cSJim Jagielski 
2667*b1cdbd2cSJim Jagielski 				const OUString aCLSID( RTL_CONSTASCII_USTRINGPARAM("12DCAE26-281F-416F-a234-c3086127382e"));
2668*b1cdbd2cSJim Jagielski 
2669*b1cdbd2cSJim Jagielski 				aAny <<= aCLSID;
2670*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID") ), aAny );
2671*b1cdbd2cSJim Jagielski 
2672*b1cdbd2cSJim Jagielski #ifndef SVX_LIGHT
2673*b1cdbd2cSJim Jagielski 				aAny = xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) );
2674*b1cdbd2cSJim Jagielski 				uno::Reference< frame::XModel > xChartModel;
2675*b1cdbd2cSJim Jagielski 				if( aAny >>= xChartModel )
2676*b1cdbd2cSJim Jagielski 				{
2677*b1cdbd2cSJim Jagielski 					mpChartContext = GetImport().GetChartImport()->CreateChartContext( GetImport(), XML_NAMESPACE_SVG, GetXMLToken(XML_CHART), xChartModel, xAttrList );
2678*b1cdbd2cSJim Jagielski 				}
2679*b1cdbd2cSJim Jagielski #endif
2680*b1cdbd2cSJim Jagielski 			}
2681*b1cdbd2cSJim Jagielski 		}
2682*b1cdbd2cSJim Jagielski 
2683*b1cdbd2cSJim Jagielski 		if(mbIsUserTransformed)
2684*b1cdbd2cSJim Jagielski 		{
2685*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2686*b1cdbd2cSJim Jagielski 			if(xProps.is())
2687*b1cdbd2cSJim Jagielski 			{
2688*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2689*b1cdbd2cSJim Jagielski 				if( xPropsInfo.is() )
2690*b1cdbd2cSJim Jagielski 				{
2691*b1cdbd2cSJim Jagielski 					if( xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2692*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2693*b1cdbd2cSJim Jagielski 				}
2694*b1cdbd2cSJim Jagielski 			}
2695*b1cdbd2cSJim Jagielski 		}
2696*b1cdbd2cSJim Jagielski 
2697*b1cdbd2cSJim Jagielski 
2698*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
2699*b1cdbd2cSJim Jagielski 		SetTransformation();
2700*b1cdbd2cSJim Jagielski 
2701*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
2702*b1cdbd2cSJim Jagielski 
2703*b1cdbd2cSJim Jagielski 		if( mpChartContext )
2704*b1cdbd2cSJim Jagielski 			mpChartContext->StartElement( xAttrList );
2705*b1cdbd2cSJim Jagielski 	}
2706*b1cdbd2cSJim Jagielski }
2707*b1cdbd2cSJim Jagielski 
EndElement()2708*b1cdbd2cSJim Jagielski void SdXMLChartShapeContext::EndElement()
2709*b1cdbd2cSJim Jagielski {
2710*b1cdbd2cSJim Jagielski 	if( mpChartContext )
2711*b1cdbd2cSJim Jagielski 		mpChartContext->EndElement();
2712*b1cdbd2cSJim Jagielski 
2713*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
2714*b1cdbd2cSJim Jagielski }
2715*b1cdbd2cSJim Jagielski 
Characters(const::rtl::OUString & rChars)2716*b1cdbd2cSJim Jagielski void SdXMLChartShapeContext::Characters( const ::rtl::OUString& rChars )
2717*b1cdbd2cSJim Jagielski {
2718*b1cdbd2cSJim Jagielski 	if( mpChartContext )
2719*b1cdbd2cSJim Jagielski 		mpChartContext->Characters( rChars );
2720*b1cdbd2cSJim Jagielski }
2721*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList)2722*b1cdbd2cSJim Jagielski SvXMLImportContext * SdXMLChartShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2723*b1cdbd2cSJim Jagielski 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
2724*b1cdbd2cSJim Jagielski {
2725*b1cdbd2cSJim Jagielski 	if( mpChartContext )
2726*b1cdbd2cSJim Jagielski 		return mpChartContext->CreateChildContext( nPrefix, rLocalName, xAttrList );
2727*b1cdbd2cSJim Jagielski 
2728*b1cdbd2cSJim Jagielski 	return NULL;
2729*b1cdbd2cSJim Jagielski }
2730*b1cdbd2cSJim Jagielski 
2731*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2732*b1cdbd2cSJim Jagielski 
2733*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLObjectShapeContext, SdXMLShapeContext );
2734*b1cdbd2cSJim Jagielski 
SdXMLObjectShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2735*b1cdbd2cSJim Jagielski SdXMLObjectShapeContext::SdXMLObjectShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2736*b1cdbd2cSJim Jagielski 		const rtl::OUString& rLocalName,
2737*b1cdbd2cSJim Jagielski 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2738*b1cdbd2cSJim Jagielski 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2739*b1cdbd2cSJim Jagielski         sal_Bool bTemporaryShape)
2740*b1cdbd2cSJim Jagielski : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
2741*b1cdbd2cSJim Jagielski {
2742*b1cdbd2cSJim Jagielski }
2743*b1cdbd2cSJim Jagielski 
~SdXMLObjectShapeContext()2744*b1cdbd2cSJim Jagielski SdXMLObjectShapeContext::~SdXMLObjectShapeContext()
2745*b1cdbd2cSJim Jagielski {
2746*b1cdbd2cSJim Jagielski }
2747*b1cdbd2cSJim Jagielski 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)2748*b1cdbd2cSJim Jagielski void SdXMLObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2749*b1cdbd2cSJim Jagielski {
2750*b1cdbd2cSJim Jagielski 	// #96717# in theorie, if we don't have a url we shouldn't even
2751*b1cdbd2cSJim Jagielski 	// export this ole shape. But practical its to risky right now
2752*b1cdbd2cSJim Jagielski 	// to change this so we better dispose this on load
2753*b1cdbd2cSJim Jagielski 	//if( !mbIsPlaceholder && ImpIsEmptyURL(maHref) )
2754*b1cdbd2cSJim Jagielski 	//	return;
2755*b1cdbd2cSJim Jagielski 
2756*b1cdbd2cSJim Jagielski 	// #100592# this BugFix prevents that a shape is created. CL
2757*b1cdbd2cSJim Jagielski 	// is thinking about an alternative.
2758*b1cdbd2cSJim Jagielski     // #i13140# Check for more than empty string in maHref, there are
2759*b1cdbd2cSJim Jagielski     // other possibilities that maHref results in empty container
2760*b1cdbd2cSJim Jagielski     // storage names
2761*b1cdbd2cSJim Jagielski 	if( !(GetImport().getImportFlags() & IMPORT_EMBEDDED) && !mbIsPlaceholder && ImpIsEmptyURL(maHref) )
2762*b1cdbd2cSJim Jagielski 		return;
2763*b1cdbd2cSJim Jagielski 
2764*b1cdbd2cSJim Jagielski 	const char* pService = "com.sun.star.drawing.OLE2Shape";
2765*b1cdbd2cSJim Jagielski 
2766*b1cdbd2cSJim Jagielski 	sal_Bool bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
2767*b1cdbd2cSJim Jagielski 
2768*b1cdbd2cSJim Jagielski 	if( bIsPresShape )
2769*b1cdbd2cSJim Jagielski 	{
2770*b1cdbd2cSJim Jagielski 		if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) )
2771*b1cdbd2cSJim Jagielski 		{
2772*b1cdbd2cSJim Jagielski 			pService = "com.sun.star.presentation.ChartShape";
2773*b1cdbd2cSJim Jagielski 		}
2774*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) )
2775*b1cdbd2cSJim Jagielski 		{
2776*b1cdbd2cSJim Jagielski 			pService = "com.sun.star.presentation.CalcShape";
2777*b1cdbd2cSJim Jagielski 		}
2778*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
2779*b1cdbd2cSJim Jagielski 		{
2780*b1cdbd2cSJim Jagielski 			pService = "com.sun.star.presentation.OLE2Shape";
2781*b1cdbd2cSJim Jagielski 		}
2782*b1cdbd2cSJim Jagielski 	}
2783*b1cdbd2cSJim Jagielski 
2784*b1cdbd2cSJim Jagielski 	AddShape( pService );
2785*b1cdbd2cSJim Jagielski 
2786*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
2787*b1cdbd2cSJim Jagielski 	{
2788*b1cdbd2cSJim Jagielski 		SetLayer();
2789*b1cdbd2cSJim Jagielski 
2790*b1cdbd2cSJim Jagielski 		if(bIsPresShape)
2791*b1cdbd2cSJim Jagielski 		{
2792*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2793*b1cdbd2cSJim Jagielski 			if(xProps.is())
2794*b1cdbd2cSJim Jagielski 			{
2795*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2796*b1cdbd2cSJim Jagielski 				if( xPropsInfo.is() )
2797*b1cdbd2cSJim Jagielski 				{
2798*b1cdbd2cSJim Jagielski 					if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2799*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
2800*b1cdbd2cSJim Jagielski 
2801*b1cdbd2cSJim Jagielski 					if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2802*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2803*b1cdbd2cSJim Jagielski 				}
2804*b1cdbd2cSJim Jagielski 			}
2805*b1cdbd2cSJim Jagielski 		}
2806*b1cdbd2cSJim Jagielski 
2807*b1cdbd2cSJim Jagielski 		if( !mbIsPlaceholder && maHref.getLength() )
2808*b1cdbd2cSJim Jagielski 		{
2809*b1cdbd2cSJim Jagielski         	uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2810*b1cdbd2cSJim Jagielski 
2811*b1cdbd2cSJim Jagielski             if( xProps.is() )
2812*b1cdbd2cSJim Jagielski         	{
2813*b1cdbd2cSJim Jagielski 				OUString aPersistName = GetImport().ResolveEmbeddedObjectURL( maHref, maCLSID );
2814*b1cdbd2cSJim Jagielski 
2815*b1cdbd2cSJim Jagielski 				if ( GetImport().IsPackageURL( maHref ) )
2816*b1cdbd2cSJim Jagielski 				{
2817*b1cdbd2cSJim Jagielski 					const OUString  sURL(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ));
2818*b1cdbd2cSJim Jagielski 
2819*b1cdbd2cSJim Jagielski 					if ( aPersistName.compareTo( sURL, sURL.getLength() ) == 0 )
2820*b1cdbd2cSJim Jagielski 						aPersistName = aPersistName.copy( sURL.getLength() );
2821*b1cdbd2cSJim Jagielski 
2822*b1cdbd2cSJim Jagielski         			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ),
2823*b1cdbd2cSJim Jagielski 											  uno::makeAny( aPersistName ) );
2824*b1cdbd2cSJim Jagielski 				}
2825*b1cdbd2cSJim Jagielski 				else
2826*b1cdbd2cSJim Jagielski 				{
2827*b1cdbd2cSJim Jagielski 					// this is OOo link object
2828*b1cdbd2cSJim Jagielski 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "LinkURL" ) ),
2829*b1cdbd2cSJim Jagielski 											  uno::makeAny( aPersistName ) );
2830*b1cdbd2cSJim Jagielski 				}
2831*b1cdbd2cSJim Jagielski 			}
2832*b1cdbd2cSJim Jagielski 		}
2833*b1cdbd2cSJim Jagielski 
2834*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
2835*b1cdbd2cSJim Jagielski 		SetTransformation();
2836*b1cdbd2cSJim Jagielski 
2837*b1cdbd2cSJim Jagielski 		SetStyle();
2838*b1cdbd2cSJim Jagielski 
2839*b1cdbd2cSJim Jagielski 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
2840*b1cdbd2cSJim Jagielski 	}
2841*b1cdbd2cSJim Jagielski }
2842*b1cdbd2cSJim Jagielski 
EndElement()2843*b1cdbd2cSJim Jagielski void SdXMLObjectShapeContext::EndElement()
2844*b1cdbd2cSJim Jagielski {
2845*b1cdbd2cSJim Jagielski     // #i67705#
2846*b1cdbd2cSJim Jagielski     const sal_uInt16 nGeneratorVersion(GetImport().getGeneratorVersion());
2847*b1cdbd2cSJim Jagielski 
2848*b1cdbd2cSJim Jagielski     if(nGeneratorVersion < SvXMLImport::OOo_34x)
2849*b1cdbd2cSJim Jagielski     {
2850*b1cdbd2cSJim Jagielski         // #i118485#
2851*b1cdbd2cSJim Jagielski         // If it's an old file from us written before OOo3.4, we need to correct
2852*b1cdbd2cSJim Jagielski         // FillStyle and LineStyle for OLE2 objects. The error was that the old paint
2853*b1cdbd2cSJim Jagielski         // implementations just ignored added fill/linestyles completely, thus
2854*b1cdbd2cSJim Jagielski         // those objects need to be corrected to not show blue and hairline which
2855*b1cdbd2cSJim Jagielski         // always was the default, but would be shown now
2856*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2857*b1cdbd2cSJim Jagielski 
2858*b1cdbd2cSJim Jagielski         if( xProps.is() )
2859*b1cdbd2cSJim Jagielski         {
2860*b1cdbd2cSJim Jagielski             xProps->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), uno::makeAny(drawing::FillStyle_NONE));
2861*b1cdbd2cSJim Jagielski             xProps->setPropertyValue(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineStyle")), uno::makeAny(drawing::LineStyle_NONE));
2862*b1cdbd2cSJim Jagielski         }
2863*b1cdbd2cSJim Jagielski     }
2864*b1cdbd2cSJim Jagielski 
2865*b1cdbd2cSJim Jagielski     // #100592#
2866*b1cdbd2cSJim Jagielski 	if( mxBase64Stream.is() )
2867*b1cdbd2cSJim Jagielski 	{
2868*b1cdbd2cSJim Jagielski 		OUString aPersistName( GetImport().ResolveEmbeddedObjectURLFromBase64() );
2869*b1cdbd2cSJim Jagielski 		const OUString  sURL(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ));
2870*b1cdbd2cSJim Jagielski 
2871*b1cdbd2cSJim Jagielski         aPersistName = aPersistName.copy( sURL.getLength() );
2872*b1cdbd2cSJim Jagielski 
2873*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2874*b1cdbd2cSJim Jagielski 		if( xProps.is() )
2875*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ), uno::makeAny( aPersistName ) );
2876*b1cdbd2cSJim Jagielski 	}
2877*b1cdbd2cSJim Jagielski 
2878*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
2879*b1cdbd2cSJim Jagielski }
2880*b1cdbd2cSJim Jagielski 
2881*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2882*b1cdbd2cSJim Jagielski void SdXMLObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2883*b1cdbd2cSJim Jagielski {
2884*b1cdbd2cSJim Jagielski 	switch( nPrefix )
2885*b1cdbd2cSJim Jagielski 	{
2886*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_DRAW:
2887*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CLASS_ID ) )
2888*b1cdbd2cSJim Jagielski 		{
2889*b1cdbd2cSJim Jagielski 			maCLSID = rValue;
2890*b1cdbd2cSJim Jagielski 			return;
2891*b1cdbd2cSJim Jagielski 		}
2892*b1cdbd2cSJim Jagielski 		break;
2893*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_XLINK:
2894*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_HREF ) )
2895*b1cdbd2cSJim Jagielski 		{
2896*b1cdbd2cSJim Jagielski 			maHref = rValue;
2897*b1cdbd2cSJim Jagielski 			return;
2898*b1cdbd2cSJim Jagielski 		}
2899*b1cdbd2cSJim Jagielski 		break;
2900*b1cdbd2cSJim Jagielski 	}
2901*b1cdbd2cSJim Jagielski 
2902*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2903*b1cdbd2cSJim Jagielski }
2904*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)2905*b1cdbd2cSJim Jagielski SvXMLImportContext* SdXMLObjectShapeContext::CreateChildContext(
2906*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2907*b1cdbd2cSJim Jagielski 	const uno::Reference<xml::sax::XAttributeList>& xAttrList )
2908*b1cdbd2cSJim Jagielski {
2909*b1cdbd2cSJim Jagielski 	// #100592#
2910*b1cdbd2cSJim Jagielski 	SvXMLImportContext* pContext = NULL;
2911*b1cdbd2cSJim Jagielski 
2912*b1cdbd2cSJim Jagielski 	if((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_BINARY_DATA))
2913*b1cdbd2cSJim Jagielski 	{
2914*b1cdbd2cSJim Jagielski 		mxBase64Stream = GetImport().GetStreamForEmbeddedObjectURLFromBase64();
2915*b1cdbd2cSJim Jagielski 		if( mxBase64Stream.is() )
2916*b1cdbd2cSJim Jagielski 			pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
2917*b1cdbd2cSJim Jagielski 												rLocalName, xAttrList,
2918*b1cdbd2cSJim Jagielski 												mxBase64Stream );
2919*b1cdbd2cSJim Jagielski 	}
2920*b1cdbd2cSJim Jagielski 	else if( ((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_DOCUMENT)) ||
2921*b1cdbd2cSJim Jagielski 				((XML_NAMESPACE_MATH == nPrefix) && IsXMLToken(rLocalName, XML_MATH)) )
2922*b1cdbd2cSJim Jagielski 	{
2923*b1cdbd2cSJim Jagielski 		XMLEmbeddedObjectImportContext *pEContext =
2924*b1cdbd2cSJim Jagielski 			new XMLEmbeddedObjectImportContext( GetImport(), nPrefix,
2925*b1cdbd2cSJim Jagielski 												rLocalName, xAttrList );
2926*b1cdbd2cSJim Jagielski 		maCLSID = pEContext->GetFilterCLSID();
2927*b1cdbd2cSJim Jagielski 		if( maCLSID.getLength() != 0 )
2928*b1cdbd2cSJim Jagielski 		{
2929*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2930*b1cdbd2cSJim Jagielski 			if( xPropSet.is() )
2931*b1cdbd2cSJim Jagielski 			{
2932*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID") ), uno::makeAny( maCLSID ) );
2933*b1cdbd2cSJim Jagielski 
2934*b1cdbd2cSJim Jagielski 				uno::Reference< lang::XComponent > xComp;
2935*b1cdbd2cSJim Jagielski 				xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ) >>= xComp;
2936*b1cdbd2cSJim Jagielski 				DBG_ASSERT( xComp.is(), "no xModel for own OLE format" );
2937*b1cdbd2cSJim Jagielski 				pEContext->SetComponent( xComp );
2938*b1cdbd2cSJim Jagielski 			}
2939*b1cdbd2cSJim Jagielski 		}
2940*b1cdbd2cSJim Jagielski 		pContext = pEContext;
2941*b1cdbd2cSJim Jagielski 	}
2942*b1cdbd2cSJim Jagielski 
2943*b1cdbd2cSJim Jagielski 	// delegate to parent class if no context could be created
2944*b1cdbd2cSJim Jagielski 	if(!pContext)
2945*b1cdbd2cSJim Jagielski 		pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
2946*b1cdbd2cSJim Jagielski 
2947*b1cdbd2cSJim Jagielski 	return pContext;
2948*b1cdbd2cSJim Jagielski }
2949*b1cdbd2cSJim Jagielski 
2950*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
2951*b1cdbd2cSJim Jagielski 
2952*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLAppletShapeContext, SdXMLShapeContext );
2953*b1cdbd2cSJim Jagielski 
SdXMLAppletShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2954*b1cdbd2cSJim Jagielski SdXMLAppletShapeContext::SdXMLAppletShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2955*b1cdbd2cSJim Jagielski 		const rtl::OUString& rLocalName,
2956*b1cdbd2cSJim Jagielski 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2957*b1cdbd2cSJim Jagielski 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2958*b1cdbd2cSJim Jagielski         sal_Bool bTemporaryShape)
2959*b1cdbd2cSJim Jagielski : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2960*b1cdbd2cSJim Jagielski   mbIsScript( sal_False )
2961*b1cdbd2cSJim Jagielski {
2962*b1cdbd2cSJim Jagielski }
2963*b1cdbd2cSJim Jagielski 
~SdXMLAppletShapeContext()2964*b1cdbd2cSJim Jagielski SdXMLAppletShapeContext::~SdXMLAppletShapeContext()
2965*b1cdbd2cSJim Jagielski {
2966*b1cdbd2cSJim Jagielski }
2967*b1cdbd2cSJim Jagielski 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)2968*b1cdbd2cSJim Jagielski void SdXMLAppletShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2969*b1cdbd2cSJim Jagielski {
2970*b1cdbd2cSJim Jagielski 	const char* pService = "com.sun.star.drawing.AppletShape";
2971*b1cdbd2cSJim Jagielski 	AddShape( pService );
2972*b1cdbd2cSJim Jagielski 
2973*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
2974*b1cdbd2cSJim Jagielski 	{
2975*b1cdbd2cSJim Jagielski 		SetLayer();
2976*b1cdbd2cSJim Jagielski 
2977*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
2978*b1cdbd2cSJim Jagielski 		SetTransformation();
2979*b1cdbd2cSJim Jagielski 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
2980*b1cdbd2cSJim Jagielski 	}
2981*b1cdbd2cSJim Jagielski }
2982*b1cdbd2cSJim Jagielski 
2983*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2984*b1cdbd2cSJim Jagielski void SdXMLAppletShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2985*b1cdbd2cSJim Jagielski {
2986*b1cdbd2cSJim Jagielski 	switch( nPrefix )
2987*b1cdbd2cSJim Jagielski 	{
2988*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_DRAW:
2989*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_APPLET_NAME ) )
2990*b1cdbd2cSJim Jagielski 		{
2991*b1cdbd2cSJim Jagielski 			maAppletName = rValue;
2992*b1cdbd2cSJim Jagielski 			return;
2993*b1cdbd2cSJim Jagielski 		}
2994*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_CODE ) )
2995*b1cdbd2cSJim Jagielski 		{
2996*b1cdbd2cSJim Jagielski 			maAppletCode = rValue;
2997*b1cdbd2cSJim Jagielski 			return;
2998*b1cdbd2cSJim Jagielski 		}
2999*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_MAY_SCRIPT ) )
3000*b1cdbd2cSJim Jagielski 		{
3001*b1cdbd2cSJim Jagielski 			mbIsScript = IsXMLToken( rValue, XML_TRUE );
3002*b1cdbd2cSJim Jagielski 			return;
3003*b1cdbd2cSJim Jagielski 		}
3004*b1cdbd2cSJim Jagielski 		break;
3005*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_XLINK:
3006*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_HREF ) )
3007*b1cdbd2cSJim Jagielski 		{
3008*b1cdbd2cSJim Jagielski 			maHref = GetImport().GetAbsoluteReference(rValue);
3009*b1cdbd2cSJim Jagielski 			return;
3010*b1cdbd2cSJim Jagielski 		}
3011*b1cdbd2cSJim Jagielski 		break;
3012*b1cdbd2cSJim Jagielski 	}
3013*b1cdbd2cSJim Jagielski 
3014*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3015*b1cdbd2cSJim Jagielski }
3016*b1cdbd2cSJim Jagielski 
EndElement()3017*b1cdbd2cSJim Jagielski void SdXMLAppletShapeContext::EndElement()
3018*b1cdbd2cSJim Jagielski {
3019*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3020*b1cdbd2cSJim Jagielski 	if( xProps.is() )
3021*b1cdbd2cSJim Jagielski 	{
3022*b1cdbd2cSJim Jagielski 		uno::Any aAny;
3023*b1cdbd2cSJim Jagielski 
3024*b1cdbd2cSJim Jagielski 		if ( maSize.Width && maSize.Height )
3025*b1cdbd2cSJim Jagielski 		{
3026*b1cdbd2cSJim Jagielski 			// the visual area for applet must be set on loading
3027*b1cdbd2cSJim Jagielski 			awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3028*b1cdbd2cSJim Jagielski 			aAny <<= aRect;
3029*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ), aAny );
3030*b1cdbd2cSJim Jagielski 		}
3031*b1cdbd2cSJim Jagielski 
3032*b1cdbd2cSJim Jagielski 		if( maParams.getLength() )
3033*b1cdbd2cSJim Jagielski 		{
3034*b1cdbd2cSJim Jagielski 			aAny <<= maParams;
3035*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCommands" ) ), aAny );
3036*b1cdbd2cSJim Jagielski 		}
3037*b1cdbd2cSJim Jagielski 
3038*b1cdbd2cSJim Jagielski 		if( maHref.getLength() )
3039*b1cdbd2cSJim Jagielski 		{
3040*b1cdbd2cSJim Jagielski 			aAny <<= maHref;
3041*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCodeBase" ) ), aAny );
3042*b1cdbd2cSJim Jagielski 		}
3043*b1cdbd2cSJim Jagielski 
3044*b1cdbd2cSJim Jagielski 		if( maAppletName.getLength() )
3045*b1cdbd2cSJim Jagielski 		{
3046*b1cdbd2cSJim Jagielski 			aAny <<= maAppletName;
3047*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletName" ) ), aAny );
3048*b1cdbd2cSJim Jagielski 		}
3049*b1cdbd2cSJim Jagielski 
3050*b1cdbd2cSJim Jagielski 		if( mbIsScript )
3051*b1cdbd2cSJim Jagielski 		{
3052*b1cdbd2cSJim Jagielski 			aAny <<= mbIsScript;
3053*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletIsScript" ) ), aAny );
3054*b1cdbd2cSJim Jagielski 
3055*b1cdbd2cSJim Jagielski 		}
3056*b1cdbd2cSJim Jagielski 
3057*b1cdbd2cSJim Jagielski 		if( maAppletCode.getLength() )
3058*b1cdbd2cSJim Jagielski 		{
3059*b1cdbd2cSJim Jagielski 			aAny <<= maAppletCode;
3060*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCode" ) ), aAny );
3061*b1cdbd2cSJim Jagielski 		}
3062*b1cdbd2cSJim Jagielski 
3063*b1cdbd2cSJim Jagielski         aAny <<= ::rtl::OUString( GetImport().GetDocumentBase() );
3064*b1cdbd2cSJim Jagielski         xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletDocBase" ) ), aAny );
3065*b1cdbd2cSJim Jagielski 
3066*b1cdbd2cSJim Jagielski 		SetThumbnail();
3067*b1cdbd2cSJim Jagielski 	}
3068*b1cdbd2cSJim Jagielski 
3069*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
3070*b1cdbd2cSJim Jagielski }
3071*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 p_nPrefix,const::rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList)3072*b1cdbd2cSJim Jagielski SvXMLImportContext * SdXMLAppletShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
3073*b1cdbd2cSJim Jagielski {
3074*b1cdbd2cSJim Jagielski 	if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) )
3075*b1cdbd2cSJim Jagielski 	{
3076*b1cdbd2cSJim Jagielski 		OUString aParamName, aParamValue;
3077*b1cdbd2cSJim Jagielski 		const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
3078*b1cdbd2cSJim Jagielski 		// now parse the attribute list and look for draw:name and draw:value
3079*b1cdbd2cSJim Jagielski 		for(sal_Int16 a(0); a < nAttrCount; a++)
3080*b1cdbd2cSJim Jagielski 		{
3081*b1cdbd2cSJim Jagielski 			const OUString& rAttrName = xAttrList->getNameByIndex(a);
3082*b1cdbd2cSJim Jagielski 			OUString aLocalName;
3083*b1cdbd2cSJim Jagielski 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
3084*b1cdbd2cSJim Jagielski 			const OUString aValue( xAttrList->getValueByIndex(a) );
3085*b1cdbd2cSJim Jagielski 
3086*b1cdbd2cSJim Jagielski 			if( nPrefix == XML_NAMESPACE_DRAW )
3087*b1cdbd2cSJim Jagielski 			{
3088*b1cdbd2cSJim Jagielski 				if( IsXMLToken( aLocalName, XML_NAME ) )
3089*b1cdbd2cSJim Jagielski 				{
3090*b1cdbd2cSJim Jagielski 					aParamName = aValue;
3091*b1cdbd2cSJim Jagielski 				}
3092*b1cdbd2cSJim Jagielski 				else if( IsXMLToken( aLocalName, XML_VALUE ) )
3093*b1cdbd2cSJim Jagielski 				{
3094*b1cdbd2cSJim Jagielski 					aParamValue = aValue;
3095*b1cdbd2cSJim Jagielski 				}
3096*b1cdbd2cSJim Jagielski 			}
3097*b1cdbd2cSJim Jagielski 		}
3098*b1cdbd2cSJim Jagielski 
3099*b1cdbd2cSJim Jagielski 		if( aParamName.getLength() )
3100*b1cdbd2cSJim Jagielski 		{
3101*b1cdbd2cSJim Jagielski 			sal_Int32 nIndex = maParams.getLength();
3102*b1cdbd2cSJim Jagielski 			maParams.realloc( nIndex + 1 );
3103*b1cdbd2cSJim Jagielski 			maParams[nIndex].Name = aParamName;
3104*b1cdbd2cSJim Jagielski 			maParams[nIndex].Handle = -1;
3105*b1cdbd2cSJim Jagielski 			maParams[nIndex].Value <<= aParamValue;
3106*b1cdbd2cSJim Jagielski 			maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE;
3107*b1cdbd2cSJim Jagielski 		}
3108*b1cdbd2cSJim Jagielski 
3109*b1cdbd2cSJim Jagielski 		return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
3110*b1cdbd2cSJim Jagielski 	}
3111*b1cdbd2cSJim Jagielski 
3112*b1cdbd2cSJim Jagielski 	return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
3113*b1cdbd2cSJim Jagielski }
3114*b1cdbd2cSJim Jagielski 
3115*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
3116*b1cdbd2cSJim Jagielski 
3117*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLPluginShapeContext, SdXMLShapeContext );
3118*b1cdbd2cSJim Jagielski 
SdXMLPluginShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)3119*b1cdbd2cSJim Jagielski SdXMLPluginShapeContext::SdXMLPluginShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3120*b1cdbd2cSJim Jagielski 		const rtl::OUString& rLocalName,
3121*b1cdbd2cSJim Jagielski 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3122*b1cdbd2cSJim Jagielski 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3123*b1cdbd2cSJim Jagielski         sal_Bool bTemporaryShape) :
3124*b1cdbd2cSJim Jagielski SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
3125*b1cdbd2cSJim Jagielski mbMedia( false )
3126*b1cdbd2cSJim Jagielski {
3127*b1cdbd2cSJim Jagielski }
3128*b1cdbd2cSJim Jagielski 
~SdXMLPluginShapeContext()3129*b1cdbd2cSJim Jagielski SdXMLPluginShapeContext::~SdXMLPluginShapeContext()
3130*b1cdbd2cSJim Jagielski {
3131*b1cdbd2cSJim Jagielski }
3132*b1cdbd2cSJim Jagielski 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)3133*b1cdbd2cSJim Jagielski void SdXMLPluginShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList)
3134*b1cdbd2cSJim Jagielski {
3135*b1cdbd2cSJim Jagielski 	// watch for MimeType attribute to see if we have a media object
3136*b1cdbd2cSJim Jagielski 	for( sal_Int16 n = 0, nAttrCount = ( xAttrList.is() ? xAttrList->getLength() : 0 ); n < nAttrCount; ++n )
3137*b1cdbd2cSJim Jagielski 	{
3138*b1cdbd2cSJim Jagielski 		OUString 	aLocalName;
3139*b1cdbd2cSJim Jagielski 		sal_uInt16 	nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( n ), &aLocalName );
3140*b1cdbd2cSJim Jagielski 
3141*b1cdbd2cSJim Jagielski 		if( nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( aLocalName, XML_MIME_TYPE ) )
3142*b1cdbd2cSJim Jagielski 		{
3143*b1cdbd2cSJim Jagielski 			if( 0 == xAttrList->getValueByIndex( n ).compareToAscii( "application/vnd.sun.star.media" ) )
3144*b1cdbd2cSJim Jagielski 				mbMedia = true;
3145*b1cdbd2cSJim Jagielski 
3146*b1cdbd2cSJim Jagielski 			// leave this loop
3147*b1cdbd2cSJim Jagielski 			n = nAttrCount - 1;
3148*b1cdbd2cSJim Jagielski 		}
3149*b1cdbd2cSJim Jagielski 	}
3150*b1cdbd2cSJim Jagielski 
3151*b1cdbd2cSJim Jagielski 	const char* pService;
3152*b1cdbd2cSJim Jagielski 
3153*b1cdbd2cSJim Jagielski 	sal_Bool bIsPresShape = sal_False;
3154*b1cdbd2cSJim Jagielski 
3155*b1cdbd2cSJim Jagielski 	if( mbMedia )
3156*b1cdbd2cSJim Jagielski 	{
3157*b1cdbd2cSJim Jagielski 		pService = "com.sun.star.drawing.MediaShape";
3158*b1cdbd2cSJim Jagielski 
3159*b1cdbd2cSJim Jagielski 		bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
3160*b1cdbd2cSJim Jagielski 		if( bIsPresShape )
3161*b1cdbd2cSJim Jagielski 		{
3162*b1cdbd2cSJim Jagielski 			if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
3163*b1cdbd2cSJim Jagielski 			{
3164*b1cdbd2cSJim Jagielski 				pService = "com.sun.star.presentation.MediaShape";
3165*b1cdbd2cSJim Jagielski 			}
3166*b1cdbd2cSJim Jagielski 		}
3167*b1cdbd2cSJim Jagielski 	}
3168*b1cdbd2cSJim Jagielski 	else
3169*b1cdbd2cSJim Jagielski 		pService = "com.sun.star.drawing.PluginShape";
3170*b1cdbd2cSJim Jagielski 
3171*b1cdbd2cSJim Jagielski 	AddShape( pService );
3172*b1cdbd2cSJim Jagielski 
3173*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
3174*b1cdbd2cSJim Jagielski 	{
3175*b1cdbd2cSJim Jagielski 		SetLayer();
3176*b1cdbd2cSJim Jagielski 
3177*b1cdbd2cSJim Jagielski 		if(bIsPresShape)
3178*b1cdbd2cSJim Jagielski 		{
3179*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3180*b1cdbd2cSJim Jagielski 			if(xProps.is())
3181*b1cdbd2cSJim Jagielski 			{
3182*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
3183*b1cdbd2cSJim Jagielski 				if( xPropsInfo.is() )
3184*b1cdbd2cSJim Jagielski 				{
3185*b1cdbd2cSJim Jagielski 					if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
3186*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
3187*b1cdbd2cSJim Jagielski 
3188*b1cdbd2cSJim Jagielski 					if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
3189*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
3190*b1cdbd2cSJim Jagielski 				}
3191*b1cdbd2cSJim Jagielski 			}
3192*b1cdbd2cSJim Jagielski 		}
3193*b1cdbd2cSJim Jagielski 
3194*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
3195*b1cdbd2cSJim Jagielski 		SetTransformation();
3196*b1cdbd2cSJim Jagielski 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3197*b1cdbd2cSJim Jagielski 	}
3198*b1cdbd2cSJim Jagielski }
3199*b1cdbd2cSJim Jagielski 
3200*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)3201*b1cdbd2cSJim Jagielski void SdXMLPluginShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3202*b1cdbd2cSJim Jagielski {
3203*b1cdbd2cSJim Jagielski 	switch( nPrefix )
3204*b1cdbd2cSJim Jagielski 	{
3205*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_DRAW:
3206*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_MIME_TYPE ) )
3207*b1cdbd2cSJim Jagielski 		{
3208*b1cdbd2cSJim Jagielski 			maMimeType = rValue;
3209*b1cdbd2cSJim Jagielski 			return;
3210*b1cdbd2cSJim Jagielski 		}
3211*b1cdbd2cSJim Jagielski 		break;
3212*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_XLINK:
3213*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_HREF ) )
3214*b1cdbd2cSJim Jagielski 		{
3215*b1cdbd2cSJim Jagielski 			maHref = GetImport().GetAbsoluteReference(rValue);
3216*b1cdbd2cSJim Jagielski 			return;
3217*b1cdbd2cSJim Jagielski 		}
3218*b1cdbd2cSJim Jagielski 		break;
3219*b1cdbd2cSJim Jagielski 	}
3220*b1cdbd2cSJim Jagielski 
3221*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3222*b1cdbd2cSJim Jagielski }
3223*b1cdbd2cSJim Jagielski 
EndElement()3224*b1cdbd2cSJim Jagielski void SdXMLPluginShapeContext::EndElement()
3225*b1cdbd2cSJim Jagielski {
3226*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3227*b1cdbd2cSJim Jagielski 
3228*b1cdbd2cSJim Jagielski 	if( xProps.is() )
3229*b1cdbd2cSJim Jagielski 	{
3230*b1cdbd2cSJim Jagielski 		uno::Any aAny;
3231*b1cdbd2cSJim Jagielski 
3232*b1cdbd2cSJim Jagielski 		if ( maSize.Width && maSize.Height )
3233*b1cdbd2cSJim Jagielski 		{
3234*b1cdbd2cSJim Jagielski 			const rtl::OUString sVisibleArea( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) );
3235*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySetInfo > aXPropSetInfo( xProps->getPropertySetInfo() );
3236*b1cdbd2cSJim Jagielski             if ( !aXPropSetInfo.is() || aXPropSetInfo->hasPropertyByName( sVisibleArea ) )
3237*b1cdbd2cSJim Jagielski 			{
3238*b1cdbd2cSJim Jagielski 				// the visual area for a plugin must be set on loading
3239*b1cdbd2cSJim Jagielski 				awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3240*b1cdbd2cSJim Jagielski 				aAny <<= aRect;
3241*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( sVisibleArea, aAny );
3242*b1cdbd2cSJim Jagielski 			}
3243*b1cdbd2cSJim Jagielski 		}
3244*b1cdbd2cSJim Jagielski 
3245*b1cdbd2cSJim Jagielski 		if( !mbMedia )
3246*b1cdbd2cSJim Jagielski 		{
3247*b1cdbd2cSJim Jagielski 			// in case we have a plugin object
3248*b1cdbd2cSJim Jagielski 			if( maParams.getLength() )
3249*b1cdbd2cSJim Jagielski 			{
3250*b1cdbd2cSJim Jagielski 				aAny <<= maParams;
3251*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginCommands" ) ), aAny );
3252*b1cdbd2cSJim Jagielski 			}
3253*b1cdbd2cSJim Jagielski 
3254*b1cdbd2cSJim Jagielski 			if( maMimeType.getLength() )
3255*b1cdbd2cSJim Jagielski 			{
3256*b1cdbd2cSJim Jagielski 				aAny <<= maMimeType;
3257*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginMimeType" ) ), aAny );
3258*b1cdbd2cSJim Jagielski 			}
3259*b1cdbd2cSJim Jagielski 
3260*b1cdbd2cSJim Jagielski 			if( maHref.getLength() )
3261*b1cdbd2cSJim Jagielski 			{
3262*b1cdbd2cSJim Jagielski 				aAny <<= maHref;
3263*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginURL" ) ), aAny );
3264*b1cdbd2cSJim Jagielski 			}
3265*b1cdbd2cSJim Jagielski 		}
3266*b1cdbd2cSJim Jagielski 		else
3267*b1cdbd2cSJim Jagielski 		{
3268*b1cdbd2cSJim Jagielski 			// in case we have a media object
3269*b1cdbd2cSJim Jagielski 
3270*b1cdbd2cSJim Jagielski 			OUString sTempRef;
3271*b1cdbd2cSJim Jagielski 
3272*b1cdbd2cSJim Jagielski 			// check for package URL
3273*b1cdbd2cSJim Jagielski 			if( GetImport().IsPackageURL( maHref ) )
3274*b1cdbd2cSJim Jagielski 			{
3275*b1cdbd2cSJim Jagielski 			    sTempRef = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package:" ) );
3276*b1cdbd2cSJim Jagielski 			}
3277*b1cdbd2cSJim Jagielski 
3278*b1cdbd2cSJim Jagielski 			sTempRef += maHref;
3279*b1cdbd2cSJim Jagielski 
3280*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ), uno::makeAny( sTempRef ) );
3281*b1cdbd2cSJim Jagielski 
3282*b1cdbd2cSJim Jagielski 			for( sal_Int32 nParam = 0; nParam < maParams.getLength(); ++nParam )
3283*b1cdbd2cSJim Jagielski 			{
3284*b1cdbd2cSJim Jagielski 				const OUString& rName = maParams[ nParam ].Name;
3285*b1cdbd2cSJim Jagielski 
3286*b1cdbd2cSJim Jagielski 				if( 0 == rName.compareToAscii( "Loop" ) )
3287*b1cdbd2cSJim Jagielski 				{
3288*b1cdbd2cSJim Jagielski 					OUString aValueStr;
3289*b1cdbd2cSJim Jagielski 					maParams[ nParam ].Value >>= aValueStr;
3290*b1cdbd2cSJim Jagielski 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Loop" ) ),
3291*b1cdbd2cSJim Jagielski 						uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) );
3292*b1cdbd2cSJim Jagielski 				}
3293*b1cdbd2cSJim Jagielski 				else if( 0 == rName.compareToAscii( "Mute" ) )
3294*b1cdbd2cSJim Jagielski 				{
3295*b1cdbd2cSJim Jagielski 					OUString aValueStr;
3296*b1cdbd2cSJim Jagielski 					maParams[ nParam ].Value >>= aValueStr;
3297*b1cdbd2cSJim Jagielski 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Mute" ) ),
3298*b1cdbd2cSJim Jagielski 						uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) );
3299*b1cdbd2cSJim Jagielski 				}
3300*b1cdbd2cSJim Jagielski 				else if( 0 == rName.compareToAscii( "VolumeDB" ) )
3301*b1cdbd2cSJim Jagielski 				{
3302*b1cdbd2cSJim Jagielski 					OUString aValueStr;
3303*b1cdbd2cSJim Jagielski 					maParams[ nParam ].Value >>= aValueStr;
3304*b1cdbd2cSJim Jagielski 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ) ),
3305*b1cdbd2cSJim Jagielski 					                            uno::makeAny( static_cast< sal_Int16 >( aValueStr.toInt32() ) ) );
3306*b1cdbd2cSJim Jagielski 				}
3307*b1cdbd2cSJim Jagielski 				else if( 0 == rName.compareToAscii( "Zoom" ) )
3308*b1cdbd2cSJim Jagielski 				{
3309*b1cdbd2cSJim Jagielski 					OUString 			aZoomStr;
3310*b1cdbd2cSJim Jagielski 					media::ZoomLevel	eZoomLevel;
3311*b1cdbd2cSJim Jagielski 
3312*b1cdbd2cSJim Jagielski 					maParams[ nParam ].Value >>= aZoomStr;
3313*b1cdbd2cSJim Jagielski 
3314*b1cdbd2cSJim Jagielski 					if( 0 == aZoomStr.compareToAscii( "25%" ) )
3315*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_ZOOM_1_TO_4;
3316*b1cdbd2cSJim Jagielski 					else if( 0 == aZoomStr.compareToAscii( "50%" ) )
3317*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_ZOOM_1_TO_2;
3318*b1cdbd2cSJim Jagielski 					else if( 0 == aZoomStr.compareToAscii( "100%" ) )
3319*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_ORIGINAL;
3320*b1cdbd2cSJim Jagielski 					else if( 0 == aZoomStr.compareToAscii( "200%" ) )
3321*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_ZOOM_2_TO_1;
3322*b1cdbd2cSJim Jagielski 					else if( 0 == aZoomStr.compareToAscii( "400%" ) )
3323*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_ZOOM_4_TO_1;
3324*b1cdbd2cSJim Jagielski 					else if( 0 == aZoomStr.compareToAscii( "fit" ) )
3325*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW;
3326*b1cdbd2cSJim Jagielski 					else if( 0 == aZoomStr.compareToAscii( "fixedfit" ) )
3327*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT;
3328*b1cdbd2cSJim Jagielski 					else if( 0 == aZoomStr.compareToAscii( "fullscreen" ) )
3329*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_FULLSCREEN;
3330*b1cdbd2cSJim Jagielski 					else
3331*b1cdbd2cSJim Jagielski 						eZoomLevel = media::ZoomLevel_NOT_AVAILABLE;
3332*b1cdbd2cSJim Jagielski 
3333*b1cdbd2cSJim Jagielski 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ) ), uno::makeAny( eZoomLevel ) );
3334*b1cdbd2cSJim Jagielski 				}
3335*b1cdbd2cSJim Jagielski 			}
3336*b1cdbd2cSJim Jagielski 		}
3337*b1cdbd2cSJim Jagielski 
3338*b1cdbd2cSJim Jagielski 		SetThumbnail();
3339*b1cdbd2cSJim Jagielski 	}
3340*b1cdbd2cSJim Jagielski 
3341*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
3342*b1cdbd2cSJim Jagielski }
3343*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 p_nPrefix,const::rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList)3344*b1cdbd2cSJim Jagielski SvXMLImportContext * SdXMLPluginShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
3345*b1cdbd2cSJim Jagielski {
3346*b1cdbd2cSJim Jagielski 	if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) )
3347*b1cdbd2cSJim Jagielski 	{
3348*b1cdbd2cSJim Jagielski 		OUString aParamName, aParamValue;
3349*b1cdbd2cSJim Jagielski 		const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
3350*b1cdbd2cSJim Jagielski 		// now parse the attribute list and look for draw:name and draw:value
3351*b1cdbd2cSJim Jagielski 		for(sal_Int16 a(0); a < nAttrCount; a++)
3352*b1cdbd2cSJim Jagielski 		{
3353*b1cdbd2cSJim Jagielski 			const OUString& rAttrName = xAttrList->getNameByIndex(a);
3354*b1cdbd2cSJim Jagielski 			OUString aLocalName;
3355*b1cdbd2cSJim Jagielski 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
3356*b1cdbd2cSJim Jagielski 			const OUString aValue( xAttrList->getValueByIndex(a) );
3357*b1cdbd2cSJim Jagielski 
3358*b1cdbd2cSJim Jagielski 			if( nPrefix == XML_NAMESPACE_DRAW )
3359*b1cdbd2cSJim Jagielski 			{
3360*b1cdbd2cSJim Jagielski 				if( IsXMLToken( aLocalName, XML_NAME ) )
3361*b1cdbd2cSJim Jagielski 				{
3362*b1cdbd2cSJim Jagielski 					aParamName = aValue;
3363*b1cdbd2cSJim Jagielski 				}
3364*b1cdbd2cSJim Jagielski 				else if( IsXMLToken( aLocalName, XML_VALUE ) )
3365*b1cdbd2cSJim Jagielski 				{
3366*b1cdbd2cSJim Jagielski 					aParamValue = aValue;
3367*b1cdbd2cSJim Jagielski 				}
3368*b1cdbd2cSJim Jagielski 			}
3369*b1cdbd2cSJim Jagielski 
3370*b1cdbd2cSJim Jagielski 			if( aParamName.getLength() )
3371*b1cdbd2cSJim Jagielski 			{
3372*b1cdbd2cSJim Jagielski 				sal_Int32 nIndex = maParams.getLength();
3373*b1cdbd2cSJim Jagielski 				maParams.realloc( nIndex + 1 );
3374*b1cdbd2cSJim Jagielski 				maParams[nIndex].Name = aParamName;
3375*b1cdbd2cSJim Jagielski 				maParams[nIndex].Handle = -1;
3376*b1cdbd2cSJim Jagielski 				maParams[nIndex].Value <<= aParamValue;
3377*b1cdbd2cSJim Jagielski 				maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE;
3378*b1cdbd2cSJim Jagielski 			}
3379*b1cdbd2cSJim Jagielski 		}
3380*b1cdbd2cSJim Jagielski 
3381*b1cdbd2cSJim Jagielski 		return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
3382*b1cdbd2cSJim Jagielski 	}
3383*b1cdbd2cSJim Jagielski 
3384*b1cdbd2cSJim Jagielski 	return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
3385*b1cdbd2cSJim Jagielski }
3386*b1cdbd2cSJim Jagielski 
3387*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
3388*b1cdbd2cSJim Jagielski 
3389*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLFloatingFrameShapeContext, SdXMLShapeContext );
3390*b1cdbd2cSJim Jagielski 
SdXMLFloatingFrameShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)3391*b1cdbd2cSJim Jagielski SdXMLFloatingFrameShapeContext::SdXMLFloatingFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3392*b1cdbd2cSJim Jagielski 		const rtl::OUString& rLocalName,
3393*b1cdbd2cSJim Jagielski 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3394*b1cdbd2cSJim Jagielski 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3395*b1cdbd2cSJim Jagielski         sal_Bool bTemporaryShape)
3396*b1cdbd2cSJim Jagielski : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
3397*b1cdbd2cSJim Jagielski {
3398*b1cdbd2cSJim Jagielski }
3399*b1cdbd2cSJim Jagielski 
~SdXMLFloatingFrameShapeContext()3400*b1cdbd2cSJim Jagielski SdXMLFloatingFrameShapeContext::~SdXMLFloatingFrameShapeContext()
3401*b1cdbd2cSJim Jagielski {
3402*b1cdbd2cSJim Jagielski }
3403*b1cdbd2cSJim Jagielski 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)3404*b1cdbd2cSJim Jagielski void SdXMLFloatingFrameShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
3405*b1cdbd2cSJim Jagielski {
3406*b1cdbd2cSJim Jagielski 	const char* pService = "com.sun.star.drawing.FrameShape";
3407*b1cdbd2cSJim Jagielski 	AddShape( pService );
3408*b1cdbd2cSJim Jagielski 
3409*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
3410*b1cdbd2cSJim Jagielski 	{
3411*b1cdbd2cSJim Jagielski 		SetLayer();
3412*b1cdbd2cSJim Jagielski 
3413*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
3414*b1cdbd2cSJim Jagielski 		SetTransformation();
3415*b1cdbd2cSJim Jagielski 
3416*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3417*b1cdbd2cSJim Jagielski 		if( xProps.is() )
3418*b1cdbd2cSJim Jagielski 		{
3419*b1cdbd2cSJim Jagielski 			uno::Any aAny;
3420*b1cdbd2cSJim Jagielski 
3421*b1cdbd2cSJim Jagielski 			if( maFrameName.getLength() )
3422*b1cdbd2cSJim Jagielski 			{
3423*b1cdbd2cSJim Jagielski 				aAny <<= maFrameName;
3424*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameName" ) ), aAny );
3425*b1cdbd2cSJim Jagielski 			}
3426*b1cdbd2cSJim Jagielski 
3427*b1cdbd2cSJim Jagielski 			if( maHref.getLength() )
3428*b1cdbd2cSJim Jagielski 			{
3429*b1cdbd2cSJim Jagielski 				aAny <<= maHref;
3430*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameURL" ) ), aAny );
3431*b1cdbd2cSJim Jagielski 			}
3432*b1cdbd2cSJim Jagielski 		}
3433*b1cdbd2cSJim Jagielski 
3434*b1cdbd2cSJim Jagielski 		SetStyle();
3435*b1cdbd2cSJim Jagielski 
3436*b1cdbd2cSJim Jagielski 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3437*b1cdbd2cSJim Jagielski 	}
3438*b1cdbd2cSJim Jagielski }
3439*b1cdbd2cSJim Jagielski 
3440*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)3441*b1cdbd2cSJim Jagielski void SdXMLFloatingFrameShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3442*b1cdbd2cSJim Jagielski {
3443*b1cdbd2cSJim Jagielski 	switch( nPrefix )
3444*b1cdbd2cSJim Jagielski 	{
3445*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_DRAW:
3446*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_FRAME_NAME ) )
3447*b1cdbd2cSJim Jagielski 		{
3448*b1cdbd2cSJim Jagielski 			maFrameName = rValue;
3449*b1cdbd2cSJim Jagielski 			return;
3450*b1cdbd2cSJim Jagielski 		}
3451*b1cdbd2cSJim Jagielski 		break;
3452*b1cdbd2cSJim Jagielski 	case XML_NAMESPACE_XLINK:
3453*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_HREF ) )
3454*b1cdbd2cSJim Jagielski 		{
3455*b1cdbd2cSJim Jagielski 			maHref = GetImport().GetAbsoluteReference(rValue);
3456*b1cdbd2cSJim Jagielski 			return;
3457*b1cdbd2cSJim Jagielski 		}
3458*b1cdbd2cSJim Jagielski 		break;
3459*b1cdbd2cSJim Jagielski 	}
3460*b1cdbd2cSJim Jagielski 
3461*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3462*b1cdbd2cSJim Jagielski }
3463*b1cdbd2cSJim Jagielski 
EndElement()3464*b1cdbd2cSJim Jagielski void SdXMLFloatingFrameShapeContext::EndElement()
3465*b1cdbd2cSJim Jagielski {
3466*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3467*b1cdbd2cSJim Jagielski 
3468*b1cdbd2cSJim Jagielski 	if( xProps.is() )
3469*b1cdbd2cSJim Jagielski 	{
3470*b1cdbd2cSJim Jagielski 		if ( maSize.Width && maSize.Height )
3471*b1cdbd2cSJim Jagielski 		{
3472*b1cdbd2cSJim Jagielski 			// the visual area for a floating frame must be set on loading
3473*b1cdbd2cSJim Jagielski 			awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3474*b1cdbd2cSJim Jagielski 			uno::Any aAny;
3475*b1cdbd2cSJim Jagielski 			aAny <<= aRect;
3476*b1cdbd2cSJim Jagielski 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ), aAny );
3477*b1cdbd2cSJim Jagielski 		}
3478*b1cdbd2cSJim Jagielski 	}
3479*b1cdbd2cSJim Jagielski 
3480*b1cdbd2cSJim Jagielski 	SetThumbnail();
3481*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
3482*b1cdbd2cSJim Jagielski }
3483*b1cdbd2cSJim Jagielski 
3484*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
3485*b1cdbd2cSJim Jagielski 
3486*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLFrameShapeContext, SdXMLShapeContext );
3487*b1cdbd2cSJim Jagielski 
SdXMLFrameShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)3488*b1cdbd2cSJim Jagielski SdXMLFrameShapeContext::SdXMLFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3489*b1cdbd2cSJim Jagielski 		const rtl::OUString& rLocalName,
3490*b1cdbd2cSJim Jagielski 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3491*b1cdbd2cSJim Jagielski 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3492*b1cdbd2cSJim Jagielski         sal_Bool bTemporaryShape)
3493*b1cdbd2cSJim Jagielski : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
3494*b1cdbd2cSJim Jagielski     multiImageImportHelper(),
3495*b1cdbd2cSJim Jagielski 	mbSupportsReplacement( sal_False ),
3496*b1cdbd2cSJim Jagielski     mxImplContext(),
3497*b1cdbd2cSJim Jagielski     mxReplImplContext()
3498*b1cdbd2cSJim Jagielski {
3499*b1cdbd2cSJim Jagielski 	uno::Reference < util::XCloneable > xClone( xAttrList, uno::UNO_QUERY );
3500*b1cdbd2cSJim Jagielski 	if( xClone.is() )
3501*b1cdbd2cSJim Jagielski 		mxAttrList.set( xClone->createClone(), uno::UNO_QUERY );
3502*b1cdbd2cSJim Jagielski 	else
3503*b1cdbd2cSJim Jagielski 		mxAttrList = new SvXMLAttributeList( xAttrList );
3504*b1cdbd2cSJim Jagielski 
3505*b1cdbd2cSJim Jagielski }
3506*b1cdbd2cSJim Jagielski 
~SdXMLFrameShapeContext()3507*b1cdbd2cSJim Jagielski SdXMLFrameShapeContext::~SdXMLFrameShapeContext()
3508*b1cdbd2cSJim Jagielski {
3509*b1cdbd2cSJim Jagielski }
3510*b1cdbd2cSJim Jagielski 
removeGraphicFromImportContext(const SvXMLImportContext & rContext) const3511*b1cdbd2cSJim Jagielski void SdXMLFrameShapeContext::removeGraphicFromImportContext(const SvXMLImportContext& rContext) const
3512*b1cdbd2cSJim Jagielski {
3513*b1cdbd2cSJim Jagielski     const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(&rContext);
3514*b1cdbd2cSJim Jagielski 
3515*b1cdbd2cSJim Jagielski     if(pSdXMLGraphicObjectShapeContext)
3516*b1cdbd2cSJim Jagielski     {
3517*b1cdbd2cSJim Jagielski         try
3518*b1cdbd2cSJim Jagielski         {
3519*b1cdbd2cSJim Jagielski             uno::Reference< container::XChild > xChild(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY_THROW);
3520*b1cdbd2cSJim Jagielski 
3521*b1cdbd2cSJim Jagielski             if(xChild.is())
3522*b1cdbd2cSJim Jagielski             {
3523*b1cdbd2cSJim Jagielski                 uno::Reference< drawing::XShapes > xParent(xChild->getParent(), uno::UNO_QUERY_THROW);
3524*b1cdbd2cSJim Jagielski 
3525*b1cdbd2cSJim Jagielski                 if(xParent.is())
3526*b1cdbd2cSJim Jagielski                 {
3527*b1cdbd2cSJim Jagielski                     // remove from parent
3528*b1cdbd2cSJim Jagielski                     xParent->remove(pSdXMLGraphicObjectShapeContext->getShape());
3529*b1cdbd2cSJim Jagielski 
3530*b1cdbd2cSJim Jagielski                     // dispose
3531*b1cdbd2cSJim Jagielski                     uno::Reference< lang::XComponent > xComp(pSdXMLGraphicObjectShapeContext->getShape(), UNO_QUERY);
3532*b1cdbd2cSJim Jagielski 
3533*b1cdbd2cSJim Jagielski                     if(xComp.is())
3534*b1cdbd2cSJim Jagielski                     {
3535*b1cdbd2cSJim Jagielski                         xComp->dispose();
3536*b1cdbd2cSJim Jagielski                     }
3537*b1cdbd2cSJim Jagielski                 }
3538*b1cdbd2cSJim Jagielski             }
3539*b1cdbd2cSJim Jagielski         }
3540*b1cdbd2cSJim Jagielski         catch( uno::Exception& )
3541*b1cdbd2cSJim Jagielski         {
3542*b1cdbd2cSJim Jagielski             DBG_ERROR( "Error in cleanup of multiple graphic object import (!)" );
3543*b1cdbd2cSJim Jagielski         }
3544*b1cdbd2cSJim Jagielski     }
3545*b1cdbd2cSJim Jagielski }
3546*b1cdbd2cSJim Jagielski 
getGraphicURLFromImportContext(const SvXMLImportContext & rContext) const3547*b1cdbd2cSJim Jagielski rtl::OUString SdXMLFrameShapeContext::getGraphicURLFromImportContext(const SvXMLImportContext& rContext) const
3548*b1cdbd2cSJim Jagielski {
3549*b1cdbd2cSJim Jagielski     rtl::OUString aRetval;
3550*b1cdbd2cSJim Jagielski     const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(&rContext);
3551*b1cdbd2cSJim Jagielski 
3552*b1cdbd2cSJim Jagielski     if(pSdXMLGraphicObjectShapeContext)
3553*b1cdbd2cSJim Jagielski     {
3554*b1cdbd2cSJim Jagielski         try
3555*b1cdbd2cSJim Jagielski         {
3556*b1cdbd2cSJim Jagielski             const uno::Reference< beans::XPropertySet > xPropSet(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY_THROW);
3557*b1cdbd2cSJim Jagielski 
3558*b1cdbd2cSJim Jagielski             if(xPropSet.is())
3559*b1cdbd2cSJim Jagielski             {
3560*b1cdbd2cSJim Jagielski                 xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL"))) >>= aRetval;
3561*b1cdbd2cSJim Jagielski 
3562*b1cdbd2cSJim Jagielski                 if(!aRetval.getLength())
3563*b1cdbd2cSJim Jagielski                 {
3564*b1cdbd2cSJim Jagielski                     // it maybe a link, try GraphicURL
3565*b1cdbd2cSJim Jagielski                     xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL"))) >>= aRetval;
3566*b1cdbd2cSJim Jagielski                 }
3567*b1cdbd2cSJim Jagielski             }
3568*b1cdbd2cSJim Jagielski         }
3569*b1cdbd2cSJim Jagielski         catch( uno::Exception& )
3570*b1cdbd2cSJim Jagielski         {
3571*b1cdbd2cSJim Jagielski             DBG_ERROR( "Error in cleanup of multiple graphic object import (!)" );
3572*b1cdbd2cSJim Jagielski         }
3573*b1cdbd2cSJim Jagielski     }
3574*b1cdbd2cSJim Jagielski 
3575*b1cdbd2cSJim Jagielski     return aRetval;
3576*b1cdbd2cSJim Jagielski }
3577*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)3578*b1cdbd2cSJim Jagielski SvXMLImportContext *SdXMLFrameShapeContext::CreateChildContext( sal_uInt16 nPrefix,
3579*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
3580*b1cdbd2cSJim Jagielski 	const uno::Reference< xml::sax::XAttributeList>& xAttrList )
3581*b1cdbd2cSJim Jagielski {
3582*b1cdbd2cSJim Jagielski 	SvXMLImportContext * pContext = 0;
3583*b1cdbd2cSJim Jagielski 
3584*b1cdbd2cSJim Jagielski 	if( !mxImplContext.Is() )
3585*b1cdbd2cSJim Jagielski 	{
3586*b1cdbd2cSJim Jagielski         pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3587*b1cdbd2cSJim Jagielski             GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList);
3588*b1cdbd2cSJim Jagielski 
3589*b1cdbd2cSJim Jagielski         mxImplContext = pContext;
3590*b1cdbd2cSJim Jagielski         mbSupportsReplacement = IsXMLToken(rLocalName, XML_OBJECT ) || IsXMLToken(rLocalName, XML_OBJECT_OLE);
3591*b1cdbd2cSJim Jagielski         setSupportsMultipleContents(IsXMLToken(rLocalName, XML_IMAGE));
3592*b1cdbd2cSJim Jagielski 
3593*b1cdbd2cSJim Jagielski         if(getSupportsMultipleContents())
3594*b1cdbd2cSJim Jagielski         {
3595*b1cdbd2cSJim Jagielski             SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext);
3596*b1cdbd2cSJim Jagielski 
3597*b1cdbd2cSJim Jagielski             if(pGSC)
3598*b1cdbd2cSJim Jagielski             {
3599*b1cdbd2cSJim Jagielski                 // mark context as LateAdd to avoid conflicts with multiple objects registering with the same ID
3600*b1cdbd2cSJim Jagielski                 pGSC->setLateAddToIdentifierMapper(true);
3601*b1cdbd2cSJim Jagielski                 addContent(*mxImplContext);
3602*b1cdbd2cSJim Jagielski             }
3603*b1cdbd2cSJim Jagielski         }
3604*b1cdbd2cSJim Jagielski     }
3605*b1cdbd2cSJim Jagielski     else if(getSupportsMultipleContents() && XML_NAMESPACE_DRAW == nPrefix && IsXMLToken(rLocalName, XML_IMAGE))
3606*b1cdbd2cSJim Jagielski     {
3607*b1cdbd2cSJim Jagielski         // read another image
3608*b1cdbd2cSJim Jagielski         pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3609*b1cdbd2cSJim Jagielski             GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList);
3610*b1cdbd2cSJim Jagielski         mxImplContext = pContext;
3611*b1cdbd2cSJim Jagielski 
3612*b1cdbd2cSJim Jagielski         SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext);
3613*b1cdbd2cSJim Jagielski 
3614*b1cdbd2cSJim Jagielski         if(pGSC)
3615*b1cdbd2cSJim Jagielski         {
3616*b1cdbd2cSJim Jagielski             // mark context as LateAdd to avoid conflicts with multiple objects registering with the same ID
3617*b1cdbd2cSJim Jagielski             pGSC->setLateAddToIdentifierMapper(true);
3618*b1cdbd2cSJim Jagielski             addContent(*mxImplContext);
3619*b1cdbd2cSJim Jagielski         }
3620*b1cdbd2cSJim Jagielski     }
3621*b1cdbd2cSJim Jagielski 	else if( mbSupportsReplacement && !mxReplImplContext &&
3622*b1cdbd2cSJim Jagielski 			 XML_NAMESPACE_DRAW == nPrefix &&
3623*b1cdbd2cSJim Jagielski 			 IsXMLToken( rLocalName, XML_IMAGE ) )
3624*b1cdbd2cSJim Jagielski 	{
3625*b1cdbd2cSJim Jagielski 		// read replacement image
3626*b1cdbd2cSJim Jagielski 		SvXMLImportContext *pImplContext = &mxImplContext;
3627*b1cdbd2cSJim Jagielski 		SdXMLShapeContext *pSContext =
3628*b1cdbd2cSJim Jagielski 			PTR_CAST( SdXMLShapeContext, pImplContext );
3629*b1cdbd2cSJim Jagielski 		if( pSContext )
3630*b1cdbd2cSJim Jagielski 		{
3631*b1cdbd2cSJim Jagielski 			uno::Reference < beans::XPropertySet > xPropSet(
3632*b1cdbd2cSJim Jagielski 					pSContext->getShape(), uno::UNO_QUERY );
3633*b1cdbd2cSJim Jagielski 			if( xPropSet.is() )
3634*b1cdbd2cSJim Jagielski 			{
3635*b1cdbd2cSJim Jagielski 				pContext = new XMLReplacementImageContext( GetImport(),
3636*b1cdbd2cSJim Jagielski 									nPrefix, rLocalName, xAttrList, xPropSet );
3637*b1cdbd2cSJim Jagielski 				mxReplImplContext = pContext;
3638*b1cdbd2cSJim Jagielski 			}
3639*b1cdbd2cSJim Jagielski 		}
3640*b1cdbd2cSJim Jagielski 	}
3641*b1cdbd2cSJim Jagielski 	else if(
3642*b1cdbd2cSJim Jagielski 			( nPrefix == XML_NAMESPACE_SVG &&	// #i68101#
3643*b1cdbd2cSJim Jagielski 				(IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) ) ||
3644*b1cdbd2cSJim Jagielski 			 (nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) ) ||
3645*b1cdbd2cSJim Jagielski 			 (nPrefix == XML_NAMESPACE_DRAW && (IsXMLToken( rLocalName, XML_GLUE_POINT ) ||
3646*b1cdbd2cSJim Jagielski 												IsXMLToken( rLocalName, XML_THUMBNAIL ) ) ) )
3647*b1cdbd2cSJim Jagielski 	{
3648*b1cdbd2cSJim Jagielski 		SvXMLImportContext *pImplContext = &mxImplContext;
3649*b1cdbd2cSJim Jagielski 		pContext = PTR_CAST( SdXMLShapeContext, pImplContext )->CreateChildContext( nPrefix,
3650*b1cdbd2cSJim Jagielski 																		rLocalName, xAttrList );
3651*b1cdbd2cSJim Jagielski 	}
3652*b1cdbd2cSJim Jagielski 	else if ( (XML_NAMESPACE_DRAW == nPrefix) && IsXMLToken( rLocalName, XML_IMAGE_MAP ) )
3653*b1cdbd2cSJim Jagielski 	{
3654*b1cdbd2cSJim Jagielski 		SdXMLShapeContext *pSContext = dynamic_cast< SdXMLShapeContext* >( &mxImplContext );
3655*b1cdbd2cSJim Jagielski 		if( pSContext )
3656*b1cdbd2cSJim Jagielski 		{
3657*b1cdbd2cSJim Jagielski 			uno::Reference < beans::XPropertySet > xPropSet( pSContext->getShape(), uno::UNO_QUERY );
3658*b1cdbd2cSJim Jagielski 			if (xPropSet.is())
3659*b1cdbd2cSJim Jagielski 			{
3660*b1cdbd2cSJim Jagielski 				pContext = new XMLImageMapContext(GetImport(), nPrefix, rLocalName, xPropSet);
3661*b1cdbd2cSJim Jagielski 			}
3662*b1cdbd2cSJim Jagielski 		}
3663*b1cdbd2cSJim Jagielski 	}
3664*b1cdbd2cSJim Jagielski 
3665*b1cdbd2cSJim Jagielski 	// call parent for content
3666*b1cdbd2cSJim Jagielski 	if(!pContext)
3667*b1cdbd2cSJim Jagielski 		pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
3668*b1cdbd2cSJim Jagielski 
3669*b1cdbd2cSJim Jagielski 	return pContext;
3670*b1cdbd2cSJim Jagielski }
3671*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> &)3672*b1cdbd2cSJim Jagielski void SdXMLFrameShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
3673*b1cdbd2cSJim Jagielski {
3674*b1cdbd2cSJim Jagielski 	// ignore
3675*b1cdbd2cSJim Jagielski }
3676*b1cdbd2cSJim Jagielski 
EndElement()3677*b1cdbd2cSJim Jagielski void SdXMLFrameShapeContext::EndElement()
3678*b1cdbd2cSJim Jagielski {
3679*b1cdbd2cSJim Jagielski     /// solve if multiple image child contexts were imported
3680*b1cdbd2cSJim Jagielski     const SvXMLImportContext* pWinner = solveMultipleImages();
3681*b1cdbd2cSJim Jagielski     const SdXMLGraphicObjectShapeContext* pGSCWinner = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(pWinner);
3682*b1cdbd2cSJim Jagielski 
3683*b1cdbd2cSJim Jagielski     /// if we have a winner and it's on LateAdd, add it now
3684*b1cdbd2cSJim Jagielski     if(pGSCWinner && pGSCWinner->getLateAddToIdentifierMapper() && pGSCWinner->getShapeId().getLength())
3685*b1cdbd2cSJim Jagielski     {
3686*b1cdbd2cSJim Jagielski         uno::Reference< uno::XInterface > xRef( pGSCWinner->getShape(), uno::UNO_QUERY );
3687*b1cdbd2cSJim Jagielski         GetImport().getInterfaceToIdentifierMapper().registerReference( pGSCWinner->getShapeId(), xRef );
3688*b1cdbd2cSJim Jagielski     }
3689*b1cdbd2cSJim Jagielski 
3690*b1cdbd2cSJim Jagielski 	if( !mxImplContext.Is() )
3691*b1cdbd2cSJim Jagielski 	{
3692*b1cdbd2cSJim Jagielski 		// now check if this is an empty presentation object
3693*b1cdbd2cSJim Jagielski 		sal_Int16 nAttrCount = mxAttrList.is() ? mxAttrList->getLength() : 0;
3694*b1cdbd2cSJim Jagielski 		for(sal_Int16 a(0); a < nAttrCount; a++)
3695*b1cdbd2cSJim Jagielski 		{
3696*b1cdbd2cSJim Jagielski 			OUString aLocalName;
3697*b1cdbd2cSJim Jagielski 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(mxAttrList->getNameByIndex(a), &aLocalName);
3698*b1cdbd2cSJim Jagielski 
3699*b1cdbd2cSJim Jagielski 			if( nPrefix == XML_NAMESPACE_PRESENTATION )
3700*b1cdbd2cSJim Jagielski 			{
3701*b1cdbd2cSJim Jagielski 				if( IsXMLToken( aLocalName, XML_PLACEHOLDER ) )
3702*b1cdbd2cSJim Jagielski 				{
3703*b1cdbd2cSJim Jagielski 					mbIsPlaceholder = IsXMLToken( mxAttrList->getValueByIndex(a), XML_TRUE );
3704*b1cdbd2cSJim Jagielski 				}
3705*b1cdbd2cSJim Jagielski 				else if( IsXMLToken( aLocalName, XML_CLASS ) )
3706*b1cdbd2cSJim Jagielski 				{
3707*b1cdbd2cSJim Jagielski 					maPresentationClass = mxAttrList->getValueByIndex(a);
3708*b1cdbd2cSJim Jagielski 				}
3709*b1cdbd2cSJim Jagielski 			}
3710*b1cdbd2cSJim Jagielski 		}
3711*b1cdbd2cSJim Jagielski 
3712*b1cdbd2cSJim Jagielski 		if( (maPresentationClass.getLength() != 0) && mbIsPlaceholder )
3713*b1cdbd2cSJim Jagielski 		{
3714*b1cdbd2cSJim Jagielski 			uno::Reference< xml::sax::XAttributeList> xEmpty;
3715*b1cdbd2cSJim Jagielski 
3716*b1cdbd2cSJim Jagielski 			enum XMLTokenEnum eToken = XML_TEXT_BOX;
3717*b1cdbd2cSJim Jagielski 
3718*b1cdbd2cSJim Jagielski 			if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) )
3719*b1cdbd2cSJim Jagielski 			{
3720*b1cdbd2cSJim Jagielski 				eToken = XML_IMAGE;
3721*b1cdbd2cSJim Jagielski 
3722*b1cdbd2cSJim Jagielski 			}
3723*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) )
3724*b1cdbd2cSJim Jagielski 			{
3725*b1cdbd2cSJim Jagielski 				eToken = XML_PAGE_THUMBNAIL;
3726*b1cdbd2cSJim Jagielski 			}
3727*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) ||
3728*b1cdbd2cSJim Jagielski 					 IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) ||
3729*b1cdbd2cSJim Jagielski 					 IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
3730*b1cdbd2cSJim Jagielski 			{
3731*b1cdbd2cSJim Jagielski 				eToken = XML_OBJECT;
3732*b1cdbd2cSJim Jagielski 			}
3733*b1cdbd2cSJim Jagielski 
3734*b1cdbd2cSJim Jagielski 			mxImplContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3735*b1cdbd2cSJim Jagielski 					GetImport(), XML_NAMESPACE_DRAW, GetXMLToken( eToken ), mxAttrList, mxShapes, xEmpty );
3736*b1cdbd2cSJim Jagielski 
3737*b1cdbd2cSJim Jagielski 			if( mxImplContext.Is() )
3738*b1cdbd2cSJim Jagielski 			{
3739*b1cdbd2cSJim Jagielski 				mxImplContext->StartElement( mxAttrList );
3740*b1cdbd2cSJim Jagielski 				mxImplContext->EndElement();
3741*b1cdbd2cSJim Jagielski 			}
3742*b1cdbd2cSJim Jagielski 		}
3743*b1cdbd2cSJim Jagielski 	}
3744*b1cdbd2cSJim Jagielski 
3745*b1cdbd2cSJim Jagielski 	mxImplContext = 0;
3746*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
3747*b1cdbd2cSJim Jagielski }
3748*b1cdbd2cSJim Jagielski 
processAttribute(sal_uInt16,const::rtl::OUString &,const::rtl::OUString &)3749*b1cdbd2cSJim Jagielski void SdXMLFrameShapeContext::processAttribute( sal_uInt16,
3750*b1cdbd2cSJim Jagielski 		const ::rtl::OUString&, const ::rtl::OUString& )
3751*b1cdbd2cSJim Jagielski {
3752*b1cdbd2cSJim Jagielski 	// ignore
3753*b1cdbd2cSJim Jagielski }
3754*b1cdbd2cSJim Jagielski 
3755*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLCustomShapeContext, SdXMLShapeContext );
3756*b1cdbd2cSJim Jagielski 
SdXMLCustomShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)3757*b1cdbd2cSJim Jagielski SdXMLCustomShapeContext::SdXMLCustomShapeContext(
3758*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
3759*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrfx,
3760*b1cdbd2cSJim Jagielski 	const OUString& rLocalName,
3761*b1cdbd2cSJim Jagielski 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3762*b1cdbd2cSJim Jagielski 	uno::Reference< drawing::XShapes >& rShapes,
3763*b1cdbd2cSJim Jagielski     sal_Bool bTemporaryShape)
3764*b1cdbd2cSJim Jagielski :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
3765*b1cdbd2cSJim Jagielski {
3766*b1cdbd2cSJim Jagielski }
3767*b1cdbd2cSJim Jagielski 
3768*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
3769*b1cdbd2cSJim Jagielski 
~SdXMLCustomShapeContext()3770*b1cdbd2cSJim Jagielski SdXMLCustomShapeContext::~SdXMLCustomShapeContext()
3771*b1cdbd2cSJim Jagielski {
3772*b1cdbd2cSJim Jagielski }
3773*b1cdbd2cSJim Jagielski 
3774*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
3775*b1cdbd2cSJim Jagielski 
3776*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)3777*b1cdbd2cSJim Jagielski void SdXMLCustomShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3778*b1cdbd2cSJim Jagielski {
3779*b1cdbd2cSJim Jagielski 	if( XML_NAMESPACE_DRAW == nPrefix )
3780*b1cdbd2cSJim Jagielski 	{
3781*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_ENGINE ) )
3782*b1cdbd2cSJim Jagielski 		{
3783*b1cdbd2cSJim Jagielski 			maCustomShapeEngine = rValue;
3784*b1cdbd2cSJim Jagielski 			return;
3785*b1cdbd2cSJim Jagielski 		}
3786*b1cdbd2cSJim Jagielski 		if ( IsXMLToken( rLocalName, XML_DATA ) )
3787*b1cdbd2cSJim Jagielski 		{
3788*b1cdbd2cSJim Jagielski 			maCustomShapeData = rValue;
3789*b1cdbd2cSJim Jagielski 			return;
3790*b1cdbd2cSJim Jagielski 		}
3791*b1cdbd2cSJim Jagielski 	}
3792*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3793*b1cdbd2cSJim Jagielski }
3794*b1cdbd2cSJim Jagielski 
3795*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
3796*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)3797*b1cdbd2cSJim Jagielski void SdXMLCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
3798*b1cdbd2cSJim Jagielski {
3799*b1cdbd2cSJim Jagielski 	// create rectangle shape
3800*b1cdbd2cSJim Jagielski 	AddShape("com.sun.star.drawing.CustomShape");
3801*b1cdbd2cSJim Jagielski 	if ( mxShape.is() )
3802*b1cdbd2cSJim Jagielski 	{
3803*b1cdbd2cSJim Jagielski 		// Add, set Style and properties from base shape
3804*b1cdbd2cSJim Jagielski 		SetStyle();
3805*b1cdbd2cSJim Jagielski 		SetLayer();
3806*b1cdbd2cSJim Jagielski 
3807*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
3808*b1cdbd2cSJim Jagielski 		SetTransformation();
3809*b1cdbd2cSJim Jagielski 
3810*b1cdbd2cSJim Jagielski 		try
3811*b1cdbd2cSJim Jagielski 		{
3812*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
3813*b1cdbd2cSJim Jagielski 			if( xPropSet.is() )
3814*b1cdbd2cSJim Jagielski 			{
3815*b1cdbd2cSJim Jagielski 				if ( maCustomShapeEngine.getLength() )
3816*b1cdbd2cSJim Jagielski 				{
3817*b1cdbd2cSJim Jagielski 					uno::Any aAny;
3818*b1cdbd2cSJim Jagielski 					aAny <<= maCustomShapeEngine;
3819*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue( EASGet( EAS_CustomShapeEngine ), aAny );
3820*b1cdbd2cSJim Jagielski 				}
3821*b1cdbd2cSJim Jagielski 				if ( maCustomShapeData.getLength() )
3822*b1cdbd2cSJim Jagielski 				{
3823*b1cdbd2cSJim Jagielski 					uno::Any aAny;
3824*b1cdbd2cSJim Jagielski 					aAny <<= maCustomShapeData;
3825*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue( EASGet( EAS_CustomShapeData ), aAny );
3826*b1cdbd2cSJim Jagielski 				}
3827*b1cdbd2cSJim Jagielski 			}
3828*b1cdbd2cSJim Jagielski 		}
3829*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
3830*b1cdbd2cSJim Jagielski 		{
3831*b1cdbd2cSJim Jagielski 			DBG_ERROR( "could not set enhanced customshape geometry" );
3832*b1cdbd2cSJim Jagielski 		}
3833*b1cdbd2cSJim Jagielski 		SdXMLShapeContext::StartElement(xAttrList);
3834*b1cdbd2cSJim Jagielski 	}
3835*b1cdbd2cSJim Jagielski }
3836*b1cdbd2cSJim Jagielski 
EndElement()3837*b1cdbd2cSJim Jagielski void SdXMLCustomShapeContext::EndElement()
3838*b1cdbd2cSJim Jagielski {
3839*b1cdbd2cSJim Jagielski     // for backward compatibility, the above SetTransformation() may alraedy have
3840*b1cdbd2cSJim Jagielski     // applied a call to SetMirroredX/SetMirroredY. This is not yet added to the
3841*b1cdbd2cSJim Jagielski     // beans::PropertyValues in maCustomShapeGeometry. When applying these now, this
3842*b1cdbd2cSJim Jagielski     // would be lost again.
3843*b1cdbd2cSJim Jagielski     // TTTT: Remove again after aw080
3844*b1cdbd2cSJim Jagielski     if(!maUsedTransformation.isIdentity())
3845*b1cdbd2cSJim Jagielski     {
3846*b1cdbd2cSJim Jagielski         basegfx::B2DVector aScale, aTranslate;
3847*b1cdbd2cSJim Jagielski         double fRotate, fShearX;
3848*b1cdbd2cSJim Jagielski 
3849*b1cdbd2cSJim Jagielski         maUsedTransformation.decompose(aScale, aTranslate, fRotate, fShearX);
3850*b1cdbd2cSJim Jagielski 
3851*b1cdbd2cSJim Jagielski         bool bFlippedX(aScale.getX() < 0.0);
3852*b1cdbd2cSJim Jagielski         bool bFlippedY(aScale.getY() < 0.0);
3853*b1cdbd2cSJim Jagielski 
3854*b1cdbd2cSJim Jagielski         if(bFlippedX && bFlippedY)
3855*b1cdbd2cSJim Jagielski         {
3856*b1cdbd2cSJim Jagielski             // when both are used it is the same as 180 degree rotation; reset
3857*b1cdbd2cSJim Jagielski             bFlippedX = bFlippedY = false;
3858*b1cdbd2cSJim Jagielski         }
3859*b1cdbd2cSJim Jagielski 
3860*b1cdbd2cSJim Jagielski         if(bFlippedX || bFlippedY)
3861*b1cdbd2cSJim Jagielski         {
3862*b1cdbd2cSJim Jagielski             beans::PropertyValue aNewPoroperty;
3863*b1cdbd2cSJim Jagielski 
3864*b1cdbd2cSJim Jagielski             if(bFlippedX)
3865*b1cdbd2cSJim Jagielski             {
3866*b1cdbd2cSJim Jagielski                 aNewPoroperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MirroredX"));
3867*b1cdbd2cSJim Jagielski             }
3868*b1cdbd2cSJim Jagielski             else
3869*b1cdbd2cSJim Jagielski             {
3870*b1cdbd2cSJim Jagielski                 aNewPoroperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MirroredY"));
3871*b1cdbd2cSJim Jagielski             }
3872*b1cdbd2cSJim Jagielski 
3873*b1cdbd2cSJim Jagielski             aNewPoroperty.Handle = -1;
3874*b1cdbd2cSJim Jagielski             aNewPoroperty.Value <<= sal_True;
3875*b1cdbd2cSJim Jagielski             aNewPoroperty.State = beans::PropertyState_DIRECT_VALUE;
3876*b1cdbd2cSJim Jagielski 
3877*b1cdbd2cSJim Jagielski             maCustomShapeGeometry.push_back(aNewPoroperty);
3878*b1cdbd2cSJim Jagielski         }
3879*b1cdbd2cSJim Jagielski     }
3880*b1cdbd2cSJim Jagielski 
3881*b1cdbd2cSJim Jagielski 	if ( !maCustomShapeGeometry.empty() )
3882*b1cdbd2cSJim Jagielski 	{
3883*b1cdbd2cSJim Jagielski 		const rtl::OUString	sCustomShapeGeometry	( RTL_CONSTASCII_USTRINGPARAM( "CustomShapeGeometry" ) );
3884*b1cdbd2cSJim Jagielski 
3885*b1cdbd2cSJim Jagielski 		// converting the vector to a sequence
3886*b1cdbd2cSJim Jagielski 		uno::Sequence< beans::PropertyValue > aSeq( maCustomShapeGeometry.size() );
3887*b1cdbd2cSJim Jagielski 		beans::PropertyValue* pValues = aSeq.getArray();
3888*b1cdbd2cSJim Jagielski 		std::vector< beans::PropertyValue >::const_iterator aIter( maCustomShapeGeometry.begin() );
3889*b1cdbd2cSJim Jagielski 		std::vector< beans::PropertyValue >::const_iterator aEnd( maCustomShapeGeometry.end() );
3890*b1cdbd2cSJim Jagielski 		while ( aIter != aEnd )
3891*b1cdbd2cSJim Jagielski 			*pValues++ = *aIter++;
3892*b1cdbd2cSJim Jagielski 
3893*b1cdbd2cSJim Jagielski 		try
3894*b1cdbd2cSJim Jagielski 		{
3895*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
3896*b1cdbd2cSJim Jagielski 			if( xPropSet.is() )
3897*b1cdbd2cSJim Jagielski 			{
3898*b1cdbd2cSJim Jagielski 				uno::Any aAny;
3899*b1cdbd2cSJim Jagielski 				aAny <<= aSeq;
3900*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( sCustomShapeGeometry, aAny );
3901*b1cdbd2cSJim Jagielski 			}
3902*b1cdbd2cSJim Jagielski 		}
3903*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
3904*b1cdbd2cSJim Jagielski 		{
3905*b1cdbd2cSJim Jagielski 			DBG_ERROR( "could not set enhanced customshape geometry" );
3906*b1cdbd2cSJim Jagielski 		}
3907*b1cdbd2cSJim Jagielski 
3908*b1cdbd2cSJim Jagielski         sal_Int32 nUPD( 0 );
3909*b1cdbd2cSJim Jagielski         sal_Int32 nBuild( 0 );
3910*b1cdbd2cSJim Jagielski         GetImport().getBuildIds( nUPD, nBuild );
3911*b1cdbd2cSJim Jagielski         if( ((nUPD >= 640 && nUPD <= 645) || (nUPD == 680)) && (nBuild <= 9221) )
3912*b1cdbd2cSJim Jagielski 		{
3913*b1cdbd2cSJim Jagielski 			Reference< drawing::XEnhancedCustomShapeDefaulter > xDefaulter( mxShape, UNO_QUERY );
3914*b1cdbd2cSJim Jagielski 			if( xDefaulter.is() )
3915*b1cdbd2cSJim Jagielski 			{
3916*b1cdbd2cSJim Jagielski 				rtl::OUString aEmptyType;
3917*b1cdbd2cSJim Jagielski 				xDefaulter->createCustomShapeDefaults( aEmptyType );
3918*b1cdbd2cSJim Jagielski 			}
3919*b1cdbd2cSJim Jagielski 		}
3920*b1cdbd2cSJim Jagielski 	}
3921*b1cdbd2cSJim Jagielski 
3922*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
3923*b1cdbd2cSJim Jagielski }
3924*b1cdbd2cSJim Jagielski 
3925*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
3926*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)3927*b1cdbd2cSJim Jagielski SvXMLImportContext* SdXMLCustomShapeContext::CreateChildContext(
3928*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
3929*b1cdbd2cSJim Jagielski 	const uno::Reference<xml::sax::XAttributeList>& xAttrList )
3930*b1cdbd2cSJim Jagielski {
3931*b1cdbd2cSJim Jagielski 	SvXMLImportContext* pContext = NULL;
3932*b1cdbd2cSJim Jagielski 	if ( XML_NAMESPACE_DRAW == nPrefix )
3933*b1cdbd2cSJim Jagielski 	{
3934*b1cdbd2cSJim Jagielski 		if ( IsXMLToken( rLocalName, XML_ENHANCED_GEOMETRY ) )
3935*b1cdbd2cSJim Jagielski 		{
3936*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xPropSet( mxShape,uno::UNO_QUERY );
3937*b1cdbd2cSJim Jagielski 			if ( xPropSet.is() )
3938*b1cdbd2cSJim Jagielski 				pContext = new XMLEnhancedCustomShapeContext( GetImport(), mxShape, nPrefix, rLocalName, maCustomShapeGeometry );
3939*b1cdbd2cSJim Jagielski 		}
3940*b1cdbd2cSJim Jagielski 	}
3941*b1cdbd2cSJim Jagielski 	// delegate to parent class if no context could be created
3942*b1cdbd2cSJim Jagielski 	if ( NULL == pContext )
3943*b1cdbd2cSJim Jagielski 		pContext = SdXMLShapeContext::CreateChildContext( nPrefix, rLocalName,
3944*b1cdbd2cSJim Jagielski 														 xAttrList);
3945*b1cdbd2cSJim Jagielski 	return pContext;
3946*b1cdbd2cSJim Jagielski }
3947*b1cdbd2cSJim Jagielski 
3948*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
3949*b1cdbd2cSJim Jagielski 
3950*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
3951*b1cdbd2cSJim Jagielski 
3952*b1cdbd2cSJim Jagielski TYPEINIT1( SdXMLTableShapeContext, SdXMLShapeContext );
3953*b1cdbd2cSJim Jagielski 
SdXMLTableShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> & rShapes)3954*b1cdbd2cSJim Jagielski SdXMLTableShapeContext::SdXMLTableShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes )
3955*b1cdbd2cSJim Jagielski : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, sal_False )
3956*b1cdbd2cSJim Jagielski {
3957*b1cdbd2cSJim Jagielski 	memset( &maTemplateStylesUsed, 0, sizeof( maTemplateStylesUsed ) );
3958*b1cdbd2cSJim Jagielski }
3959*b1cdbd2cSJim Jagielski 
~SdXMLTableShapeContext()3960*b1cdbd2cSJim Jagielski SdXMLTableShapeContext::~SdXMLTableShapeContext()
3961*b1cdbd2cSJim Jagielski {
3962*b1cdbd2cSJim Jagielski }
3963*b1cdbd2cSJim Jagielski 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)3964*b1cdbd2cSJim Jagielski void SdXMLTableShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
3965*b1cdbd2cSJim Jagielski {
3966*b1cdbd2cSJim Jagielski 	const char* pService = "com.sun.star.drawing.TableShape";
3967*b1cdbd2cSJim Jagielski 
3968*b1cdbd2cSJim Jagielski 	sal_Bool bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
3969*b1cdbd2cSJim Jagielski 	if( bIsPresShape )
3970*b1cdbd2cSJim Jagielski 	{
3971*b1cdbd2cSJim Jagielski 		if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) )
3972*b1cdbd2cSJim Jagielski 		{
3973*b1cdbd2cSJim Jagielski 			pService = "com.sun.star.presentation.TableShape";
3974*b1cdbd2cSJim Jagielski 		}
3975*b1cdbd2cSJim Jagielski 	}
3976*b1cdbd2cSJim Jagielski 
3977*b1cdbd2cSJim Jagielski 	AddShape( pService );
3978*b1cdbd2cSJim Jagielski 
3979*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
3980*b1cdbd2cSJim Jagielski 	{
3981*b1cdbd2cSJim Jagielski 		SetLayer();
3982*b1cdbd2cSJim Jagielski 
3983*b1cdbd2cSJim Jagielski 		uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
3984*b1cdbd2cSJim Jagielski 
3985*b1cdbd2cSJim Jagielski 		if(bIsPresShape)
3986*b1cdbd2cSJim Jagielski 		{
3987*b1cdbd2cSJim Jagielski 			if(xProps.is())
3988*b1cdbd2cSJim Jagielski 			{
3989*b1cdbd2cSJim Jagielski 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
3990*b1cdbd2cSJim Jagielski 				if( xPropsInfo.is() )
3991*b1cdbd2cSJim Jagielski 				{
3992*b1cdbd2cSJim Jagielski 					if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
3993*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
3994*b1cdbd2cSJim Jagielski 
3995*b1cdbd2cSJim Jagielski 					if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
3996*b1cdbd2cSJim Jagielski 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
3997*b1cdbd2cSJim Jagielski 				}
3998*b1cdbd2cSJim Jagielski 			}
3999*b1cdbd2cSJim Jagielski 		}
4000*b1cdbd2cSJim Jagielski 
4001*b1cdbd2cSJim Jagielski 		SetStyle();
4002*b1cdbd2cSJim Jagielski 
4003*b1cdbd2cSJim Jagielski 		if( xProps.is() )
4004*b1cdbd2cSJim Jagielski 		{
4005*b1cdbd2cSJim Jagielski 			if( msTemplateStyleName.getLength() ) try
4006*b1cdbd2cSJim Jagielski 			{
4007*b1cdbd2cSJim Jagielski 				Reference< XStyleFamiliesSupplier > xFamiliesSupp( GetImport().GetModel(), UNO_QUERY_THROW );
4008*b1cdbd2cSJim Jagielski 				Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() );
4009*b1cdbd2cSJim Jagielski 				const OUString sFamilyName( RTL_CONSTASCII_USTRINGPARAM("table" ) );
4010*b1cdbd2cSJim Jagielski 				Reference< XNameAccess > xTableFamily( xFamilies->getByName( sFamilyName ), UNO_QUERY_THROW );
4011*b1cdbd2cSJim Jagielski 				Reference< XStyle > xTableStyle( xTableFamily->getByName( msTemplateStyleName ), UNO_QUERY_THROW );
4012*b1cdbd2cSJim Jagielski 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TableTemplate" ) ), Any( xTableStyle ) );
4013*b1cdbd2cSJim Jagielski 			}
4014*b1cdbd2cSJim Jagielski 			catch( Exception& )
4015*b1cdbd2cSJim Jagielski 			{
4016*b1cdbd2cSJim Jagielski 				DBG_ERROR("SdXMLTableShapeContext::StartElement(), exception caught!");
4017*b1cdbd2cSJim Jagielski 			}
4018*b1cdbd2cSJim Jagielski 
4019*b1cdbd2cSJim Jagielski 			const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0];
4020*b1cdbd2cSJim Jagielski 			for( int i = 0; pEntry->msApiName && (i < 6); i++, pEntry++ )
4021*b1cdbd2cSJim Jagielski 			{
4022*b1cdbd2cSJim Jagielski 			    try
4023*b1cdbd2cSJim Jagielski 			    {
4024*b1cdbd2cSJim Jagielski 				    const OUString sAPIPropertyName( OUString(pEntry->msApiName, pEntry->nApiNameLength, RTL_TEXTENCODING_ASCII_US ) );
4025*b1cdbd2cSJim Jagielski 				    xProps->setPropertyValue( sAPIPropertyName, Any( maTemplateStylesUsed[i] ) );
4026*b1cdbd2cSJim Jagielski 			    }
4027*b1cdbd2cSJim Jagielski 			    catch( Exception& )
4028*b1cdbd2cSJim Jagielski 			    {
4029*b1cdbd2cSJim Jagielski 				    DBG_ERROR("SdXMLTableShapeContext::StartElement(), exception caught!");
4030*b1cdbd2cSJim Jagielski 			    }
4031*b1cdbd2cSJim Jagielski             }
4032*b1cdbd2cSJim Jagielski 		}
4033*b1cdbd2cSJim Jagielski 
4034*b1cdbd2cSJim Jagielski 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
4035*b1cdbd2cSJim Jagielski 
4036*b1cdbd2cSJim Jagielski 		const rtl::Reference< XMLTableImport >& xTableImport( GetImport().GetShapeImport()->GetShapeTableImport() );
4037*b1cdbd2cSJim Jagielski 		if( xTableImport.is() && xProps.is() )
4038*b1cdbd2cSJim Jagielski 		{
4039*b1cdbd2cSJim Jagielski 			uno::Reference< table::XColumnRowRange > xColumnRowRange(
4040*b1cdbd2cSJim Jagielski 				xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ), uno::UNO_QUERY );
4041*b1cdbd2cSJim Jagielski 
4042*b1cdbd2cSJim Jagielski 			if( xColumnRowRange.is() )
4043*b1cdbd2cSJim Jagielski 				mxTableImportContext = xTableImport->CreateTableContext( GetPrefix(), GetLocalName(), xColumnRowRange );
4044*b1cdbd2cSJim Jagielski 
4045*b1cdbd2cSJim Jagielski 			if( mxTableImportContext.Is() )
4046*b1cdbd2cSJim Jagielski 				mxTableImportContext->StartElement( xAttrList );
4047*b1cdbd2cSJim Jagielski 		}
4048*b1cdbd2cSJim Jagielski 	}
4049*b1cdbd2cSJim Jagielski }
4050*b1cdbd2cSJim Jagielski 
EndElement()4051*b1cdbd2cSJim Jagielski void SdXMLTableShapeContext::EndElement()
4052*b1cdbd2cSJim Jagielski {
4053*b1cdbd2cSJim Jagielski 	if( mxTableImportContext.Is() )
4054*b1cdbd2cSJim Jagielski 		mxTableImportContext->EndElement();
4055*b1cdbd2cSJim Jagielski 
4056*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::EndElement();
4057*b1cdbd2cSJim Jagielski 
4058*b1cdbd2cSJim Jagielski 	if( mxShape.is() )
4059*b1cdbd2cSJim Jagielski 	{
4060*b1cdbd2cSJim Jagielski 		// set pos, size, shear and rotate
4061*b1cdbd2cSJim Jagielski 		SetTransformation();
4062*b1cdbd2cSJim Jagielski 	}
4063*b1cdbd2cSJim Jagielski }
4064*b1cdbd2cSJim Jagielski 
4065*b1cdbd2cSJim Jagielski // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)4066*b1cdbd2cSJim Jagielski void SdXMLTableShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
4067*b1cdbd2cSJim Jagielski {
4068*b1cdbd2cSJim Jagielski 	if( nPrefix == XML_NAMESPACE_TABLE )
4069*b1cdbd2cSJim Jagielski 	{
4070*b1cdbd2cSJim Jagielski 		if( IsXMLToken( rLocalName, XML_TEMPLATE_NAME ) )
4071*b1cdbd2cSJim Jagielski 		{
4072*b1cdbd2cSJim Jagielski 			msTemplateStyleName = rValue;
4073*b1cdbd2cSJim Jagielski 		}
4074*b1cdbd2cSJim Jagielski 		else
4075*b1cdbd2cSJim Jagielski 		{
4076*b1cdbd2cSJim Jagielski 			int i = 0;
4077*b1cdbd2cSJim Jagielski 			const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0];
4078*b1cdbd2cSJim Jagielski 			while( pEntry->msApiName && (i < 6) )
4079*b1cdbd2cSJim Jagielski 			{
4080*b1cdbd2cSJim Jagielski 				if( IsXMLToken( rLocalName, pEntry->meXMLName ) )
4081*b1cdbd2cSJim Jagielski 				{
4082*b1cdbd2cSJim Jagielski 					if( IsXMLToken( rValue, XML_TRUE ) )
4083*b1cdbd2cSJim Jagielski 						maTemplateStylesUsed[i] = sal_True;
4084*b1cdbd2cSJim Jagielski 					break;
4085*b1cdbd2cSJim Jagielski 				}
4086*b1cdbd2cSJim Jagielski 				pEntry++;
4087*b1cdbd2cSJim Jagielski 				i++;
4088*b1cdbd2cSJim Jagielski 			}
4089*b1cdbd2cSJim Jagielski 		}
4090*b1cdbd2cSJim Jagielski 	}
4091*b1cdbd2cSJim Jagielski 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
4092*b1cdbd2cSJim Jagielski }
4093*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)4094*b1cdbd2cSJim Jagielski SvXMLImportContext* SdXMLTableShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const uno::Reference<xml::sax::XAttributeList>& xAttrList )
4095*b1cdbd2cSJim Jagielski {
4096*b1cdbd2cSJim Jagielski 	if( mxTableImportContext.Is() && (nPrefix == XML_NAMESPACE_TABLE) )
4097*b1cdbd2cSJim Jagielski 		return mxTableImportContext->CreateChildContext(nPrefix, rLocalName, xAttrList);
4098*b1cdbd2cSJim Jagielski 	else
4099*b1cdbd2cSJim Jagielski 		return SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
4100*b1cdbd2cSJim Jagielski }
4101*b1cdbd2cSJim Jagielski 
4102