summaryrefslogtreecommitdiff
path: root/xmloff/source/draw/ximpcustomshape.cxx
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2004-04-02 12:53:29 +0000
committerRüdiger Timm <rt@openoffice.org>2004-04-02 12:53:29 +0000
commit57fce16fd026cfe789c1b05d385d9afb9a1c9c70 (patch)
treebff7b374bc31ba1fcaab68ab3af127d5472d1d35 /xmloff/source/draw/ximpcustomshape.cxx
parent2e056539cdd39c82d41411744ac8eb14bd40d497 (diff)
INTEGRATION: CWS sj05 (1.1.2); FILE ADDED
2004/03/09 13:56:03 sj 1.1.2.2: added same letter heights property for fontwork 2004/02/06 09:51:39 sj 1.1.2.1: initial version
Diffstat (limited to 'xmloff/source/draw/ximpcustomshape.cxx')
-rw-r--r--xmloff/source/draw/ximpcustomshape.cxx1444
1 files changed, 1444 insertions, 0 deletions
diff --git a/xmloff/source/draw/ximpcustomshape.cxx b/xmloff/source/draw/ximpcustomshape.cxx
new file mode 100644
index 000000000000..cbb2b2e72a89
--- /dev/null
+++ b/xmloff/source/draw/ximpcustomshape.cxx
@@ -0,0 +1,1444 @@
+/*************************************************************************
+ *
+ * $RCSfile: ximpcustomshape.cxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: rt $ $Date: 2004-04-02 13:53:29 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _XMLOFF_XIMPCUSTOMSHAPE_HXX_
+#include "ximpcustomshape.hxx"
+#endif
+
+#ifndef _XIMPSHAPE_HXX
+#include "ximpshap.hxx"
+#endif
+
+#ifndef _XMLOFF_XMLEHELP_HXX
+#include "xmlehelp.hxx"
+#endif
+
+#ifndef INCLUDED_RTL_MATH_HXX
+#include <rtl/math.hxx>
+#endif
+
+#ifndef _RTL_USTRBUF_HXX_
+#include <rtl/ustrbuf.hxx>
+#endif
+
+#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_
+#include <com/sun/star/uno/Reference.h>
+#endif
+
+#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
+#include <com/sun/star/beans/XPropertySet.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_XML_SAX_XATTRIBUTELIST_HPP_
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_CONTAINER_XINDEXCONTAINER_HPP_
+#include <com/sun/star/container/XIndexContainer.hpp>
+#endif
+
+#ifndef _XMLOFF_XMLTOKEN_HXX
+#include "xmltoken.hxx"
+#endif
+
+#ifndef _ENHANCED_CUSTOMSHAPE_TOKEN_HXX
+#include "EnhancedCustomShapeToken.hxx"
+#endif
+
+#ifndef _XMLOFF_XMLIMP_HXX
+#include "xmlimp.hxx"
+#endif
+
+#ifndef _XMLOFF_XMLTKMAP_HXX
+#include "xmltkmap.hxx"
+#endif
+
+#ifndef _XMLOFF_XMLNMSPE_HXX
+#include "xmlnmspe.hxx"
+#endif
+
+#ifndef _XMLOFF_NMSPMAP_HXX
+#include "nmspmap.hxx"
+#endif
+
+#ifndef _XMLOFF_XMLUCONV_HXX
+#include "xmluconv.hxx"
+#endif
+
+#ifndef _XEXPTRANSFORM_HXX
+#include "xexptran.hxx"
+#endif
+
+#ifndef _XMLOFF_XMLERROR_HXX
+#include "xmlerror.hxx"
+#endif
+
+#ifndef _TOOLS_DEBUG_HXX
+#include <tools/debug.hxx>
+#endif
+
+#ifndef _COM_SUN_STAR_DRAWING_DIRECTION3D_HPP_
+#include <com/sun/star/drawing/Direction3D.hpp>
+#endif
+
+#ifndef _DRAFTS_COM_SUN_STAR_DRAWING_ENHANCEDCUSTOMSHAPEOPERATION_HPP_
+#include <drafts/com/sun/star/drawing/EnhancedCustomShapeOperation.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_DRAWING_ENHANCEDCUSTOMSHAPEPARAMETER_HPP_
+#include <drafts/com/sun/star/drawing/EnhancedCustomShapeParameter.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_DRAWING_ENHANCEDCUSTOMSHAPEPARAMETERPAIR_HPP_
+#include <drafts/com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_DRAWING_ENHANCEDCUSTOMSHAPEPARAMETERTYPE_HPP_
+#include <drafts/com/sun/star/drawing/EnhancedCustomShapeParameterType.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_DRAWING_ENHANCEDCUSTOMSHAPETEXTFRAME_HPP_
+#include <drafts/com/sun/star/drawing/EnhancedCustomShapeTextFrame.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_DRAWING_ENHANCEDCUSTOMSHAPEADJUSTMENTVALUE_HPP_
+#include <drafts/com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_DRAWING_ENHANCEDCUSTOMSHAPESEGMENT_HPP_
+#include <drafts/com/sun/star/drawing/EnhancedCustomShapeSegment.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_DRAWING_ENHANCEDCUSTOMSHAPESEGMENTCOMMAND_HPP_
+#include <drafts/com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp>
+#endif
+
+using namespace ::com::sun::star;
+using namespace ::xmloff::token;
+using namespace ::xmloff::EnhancedCustomShapeToken;
+
+TYPEINIT1( XMLEnhancedCustomShapeContext, SvXMLImportContext );
+
+XMLEnhancedCustomShapeContext::XMLEnhancedCustomShapeContext( SvXMLImport& rImport, sal_uInt16 nPrefix, const rtl::OUString& rLocalName,
+ std::vector< com::sun::star::beans::PropertyValue >& rCustomShapeGeometry ) :
+ mrCustomShapeGeometry( rCustomShapeGeometry ),
+ mrUnitConverter( rImport.GetMM100UnitConverter() ),
+ SvXMLImportContext( rImport, nPrefix, rLocalName )
+{
+}
+
+const SvXMLEnumMapEntry aXML_OnOffEnumMap[] =
+{
+ { XML_OFF, sal_False },
+ { XML_ON, sal_True },
+ { XML_TOKEN_INVALID, 0 }
+};
+const SvXMLEnumMapEntry aXML_ExtrusionPlaneEnumMap[] =
+{
+ { XML_XY, 0 },
+ { XML_ZX, 1 },
+ { XML_YZ, 2 },
+ { XML_TOKEN_INVALID,0 }
+};
+const SvXMLEnumMapEntry aXML_ExtrusionRenderEnumMap[] =
+{
+ { XML_SOLID, 0 },
+ { XML_WIREFRAME, 1 },
+ { XML_BOUNDINGCUBE, 2 },
+ { XML_TOKEN_INVALID,0 }
+};
+const SvXMLEnumMapEntry aXML_GluePointEnumMap[] =
+{
+ { XML_NONE, 0 },
+ { XML_SEGMENTS, 1 },
+ { XML_NONE, 2 },
+ { XML_RECTANGLE, 3 }
+};
+const SvXMLEnumMapEntry aXML_CalloutDropEnumMap[] =
+{
+ { XML_TOP, 0 },
+ { XML_CENTER, 1 },
+ { XML_BOTTOM, 2 }
+};
+const SvXMLEnumMapEntry aXML_CalloutTypeEnumMap[] =
+{
+ { XML_RECTANGLE, 0 },
+ { XML_ROUNDRECTANGLE, 1 },
+ { XML_OVAL, 2 },
+ { XML_CLOUD, 3 }
+};
+
+void GetBool( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ sal_Bool bAttrBool;
+ if ( SvXMLUnitConverter::convertBool( bAttrBool, rValue ) )
+ {
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= bAttrBool;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetInt32( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ sal_Int32 nAttrNumber;
+ if ( SvXMLUnitConverter::convertNumber( nAttrNumber, rValue ) )
+ {
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= nAttrNumber;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetDouble( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ double fAttrDouble;
+ if ( SvXMLUnitConverter::convertDouble( fAttrDouble, rValue ) )
+ {
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= fAttrDouble;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetDistance( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ double fAttrDouble;
+ MapUnit eSrcUnit( SvXMLExportHelper::GetUnitFromString( rValue, MAP_100TH_MM ) );
+ if ( SvXMLUnitConverter::convertDouble( fAttrDouble, rValue, eSrcUnit, MAP_100TH_MM ) )
+ {
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= fAttrDouble;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetString( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= rValue;
+ rDest.push_back( aProp );
+}
+
+void GetEnum( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp,
+ const SvXMLEnumMapEntry& rMap )
+{
+ USHORT eKind;
+ if( SvXMLUnitConverter::convertEnum( eKind, rValue, &rMap ) )
+ {
+ sal_Int16 nEnum = (sal_Int16)eKind;
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= nEnum;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetOnOff( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ USHORT eKind;
+ if( SvXMLUnitConverter::convertEnum( eKind, rValue, aXML_OnOffEnumMap ) )
+ {
+ sal_Bool bAttrBool = eKind == 1 ? sal_True : sal_False;
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= bAttrBool;
+ rDest.push_back( aProp );
+ }
+ }
+
+
+void GetDoublePercentage( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ MapUnit eSrcUnit = SvXMLExportHelper::GetUnitFromString( rValue, MAP_100TH_MM );
+ if ( eSrcUnit == MAP_RELATIVE )
+ {
+ rtl_math_ConversionStatus eStatus;
+ double fAttrDouble = ::rtl::math::stringToDouble( rValue,
+ (sal_Unicode)('.'), (sal_Unicode)(','), &eStatus, NULL );
+ if ( eStatus == rtl_math_ConversionStatus_Ok )
+ {
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= fAttrDouble;
+ rDest.push_back( aProp );
+ }
+ }
+}
+
+void GetVector3D( std::vector< com::sun::star::beans::PropertyValue >& rDest,
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ Vector3D aVector3D;
+ if ( SvXMLUnitConverter::convertVector3D( aVector3D, rValue ) )
+ {
+ drawing::Direction3D aDirection3D( aVector3D.X(), aVector3D.Y(), aVector3D.Z() );
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= aDirection3D;
+ rDest.push_back( aProp );
+ }
+}
+
+sal_Bool GetNextParameter( drafts::com::sun::star::drawing::EnhancedCustomShapeParameter& rParameter, sal_Int32& nIndex, const rtl::OUString& rParaString )
+{
+ if ( nIndex >= rParaString.getLength() )
+ return sal_False;
+
+ sal_Bool bValid = sal_True;
+ sal_Bool bNumberRequired = sal_True;
+ sal_Bool bMustBePositiveWholeNumbered = sal_False;
+
+ rParameter.Type = drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::NORMAL;
+ if ( rParaString[ nIndex ] == (sal_Unicode)'#' )
+ {
+ rParameter.Type = drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::ADJUSTMENT;
+ bMustBePositiveWholeNumbered = sal_True;
+ nIndex++;
+ }
+ else if ( rParaString[ nIndex ] == (sal_Unicode)'@' )
+ {
+ rParameter.Type = drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::EQUATION;
+ bMustBePositiveWholeNumbered = sal_True;
+ nIndex++;
+ }
+ else if ( rParaString[ nIndex ] > (sal_Unicode)'9' )
+ {
+ bNumberRequired = sal_False;
+ if ( rParaString.matchIgnoreAsciiCaseAsciiL( "left", 4, nIndex ) )
+ {
+ rParameter.Type = drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::LEFT;
+ nIndex += 4;
+ }
+ else if ( rParaString.matchIgnoreAsciiCaseAsciiL( "top", 3, nIndex ) )
+ {
+ rParameter.Type = drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::TOP;
+ nIndex += 3;
+ }
+ else if ( rParaString.matchIgnoreAsciiCaseAsciiL( "right", 5, nIndex ) )
+ {
+ rParameter.Type = drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::RIGHT;
+ nIndex += 5;
+ }
+ else if ( rParaString.matchIgnoreAsciiCaseAsciiL( "bottom", 6, nIndex ) )
+ {
+ rParameter.Type = drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::BOTTOM;
+ nIndex += 6;
+ }
+ else if ( rParaString.matchIgnoreAsciiCaseAsciiL( "center", 6, nIndex ) )
+ {
+ rParameter.Type = drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::CENTER;
+ nIndex += 6;
+ }
+ else
+ bValid = sal_False;
+ }
+ if ( bValid )
+ {
+ if ( bNumberRequired )
+ {
+ sal_Int32 nStartIndex = nIndex;
+
+ sal_Bool bM = sal_False; // set if the value is negative
+ sal_Bool bE = sal_False; // set if a double is including a "E" statement
+ sal_Bool bEM = sal_False; // set if a double is including a "E-"statement
+ sal_Bool bDot = sal_False; // set if there is a dot included
+ sal_Bool bEnd = sal_False; // set for each value that can not be part of a double/integer
+
+ while( ( nIndex < rParaString.getLength() ) && bValid )
+ {
+ switch( rParaString[ nIndex ] )
+ {
+ case '.' :
+ {
+ if ( bMustBePositiveWholeNumbered )
+ bValid = sal_False;
+ else
+ {
+ if ( bDot )
+ bValid = sal_False;
+ else
+ bDot = sal_True;
+ }
+ }
+ break;
+ case '-' :
+ {
+ if ( bMustBePositiveWholeNumbered )
+ bValid = sal_False;
+ else
+ {
+ if ( nStartIndex == nIndex )
+ bM = sal_True;
+ else if ( bE )
+ bEM = sal_True;
+ else
+ bValid = sal_False;
+ }
+ }
+ break;
+
+ case 'e' :
+ case 'E' :
+ {
+ if ( bMustBePositiveWholeNumbered )
+ bEnd = sal_True;
+ else
+ {
+ if ( !bE )
+ bE = sal_True;
+ else
+ bEnd = sal_True;
+ }
+ }
+ break;
+ case '0' :
+ case '1' :
+ case '2' :
+ case '3' :
+ case '4' :
+ case '5' :
+ case '6' :
+ case '7' :
+ case '8' :
+ case '9' :
+ break;
+ default:
+ bEnd = sal_True;
+ }
+ if ( !bEnd )
+ nIndex++;
+ else
+ break;
+ }
+ if ( nIndex == nStartIndex )
+ bValid = sal_False;
+ if ( bValid )
+ {
+ rtl::OUString aNumber( rParaString.copy( nStartIndex, nIndex - nStartIndex ) );
+ if ( bE || bDot )
+ {
+ double fAttrDouble;
+ if ( SvXMLUnitConverter::convertDouble( fAttrDouble, aNumber ) )
+ rParameter.Value <<= fAttrDouble;
+ else
+ bValid = sal_False;
+ }
+ else
+ {
+ sal_Int32 nValue;
+ if ( SvXMLUnitConverter::convertNumber( nValue, aNumber ) )
+ rParameter.Value <<= nValue;
+ else
+ bValid = sal_False;
+ }
+ }
+ }
+ }
+ if ( bValid )
+ { // skipping white spaces
+ while( ( nIndex < rParaString.getLength() ) && rParaString[ nIndex ] == (sal_Unicode)' ' )
+ nIndex++;
+ }
+ return bValid;
+}
+
+void GetPosition3D( std::vector< com::sun::star::beans::PropertyValue >& rDest, // e.g. draw:extrusion-viewpoint
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp,
+ SvXMLUnitConverter& rUnitConverter )
+{
+ drawing::Position3D aPosition3D;
+ if ( rUnitConverter.convertPosition3D( aPosition3D, rValue ) )
+ {
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= aPosition3D;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetDoubleSequence( std::vector< com::sun::star::beans::PropertyValue >& rDest, // e.g. draw:glue-point-leaving-directions
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ std::vector< double > vDirection;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ double fAttrDouble;
+ rtl::OUString aToken( rValue.getToken( 0, ',', nIndex ) );
+ if ( !SvXMLUnitConverter::convertDouble( fAttrDouble, aToken ) )
+ break;
+ else
+ vDirection.push_back( fAttrDouble );
+ }
+ while ( nIndex >= 0 );
+
+ if ( vDirection.size() )
+ {
+ uno::Sequence< double > aDirectionsSeq( vDirection.size() );
+ std::vector< double >::const_iterator aIter = vDirection.begin();
+ std::vector< double >::const_iterator aEnd = vDirection.end();
+ double* pValues = aDirectionsSeq.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= aDirectionsSeq;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetEnhancedParameter( std::vector< com::sun::star::beans::PropertyValue >& rDest, // e.g. draw:handle-position
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ sal_Int32 nIndex = 0;
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameter aParameter;
+ if ( GetNextParameter( aParameter, nIndex, rValue ) )
+ {
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= aParameter;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetEnhancedParameterPair( std::vector< com::sun::star::beans::PropertyValue >& rDest, // e.g. draw:handle-position
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ sal_Int32 nIndex = 0;
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair aParameterPair;
+ if ( GetNextParameter( aParameterPair.First, nIndex, rValue )
+ && GetNextParameter( aParameterPair.Second, nIndex, rValue ) )
+ {
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= aParameterPair;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetEnhancedParameterPairSequence( std::vector< com::sun::star::beans::PropertyValue >& rDest, // e.g. draw:glue-points
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair > vParameter;
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair aParameter;
+
+ sal_Int32 nIndex = 0;
+
+ while ( GetNextParameter( aParameter.First, nIndex, rValue )
+ && GetNextParameter( aParameter.Second, nIndex, rValue ) )
+ {
+ vParameter.push_back( aParameter );
+ }
+ if ( vParameter.size() )
+ {
+ uno::Sequence< drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair > aParameterSeq( vParameter.size() );
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair >::const_iterator aIter = vParameter.begin();
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair >::const_iterator aEnd = vParameter.end();
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair* pValues = aParameterSeq.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= aParameterSeq;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetEnhancedRectangleSequence( std::vector< com::sun::star::beans::PropertyValue >& rDest, // e.g. draw:text-frames
+ const rtl::OUString& rValue, const EnhancedCustomShapeTokenEnum eDestProp )
+{
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeTextFrame > vTextFrame;
+ drafts::com::sun::star::drawing::EnhancedCustomShapeTextFrame aParameter;
+
+ sal_Int32 nIndex = 0;
+
+ while ( GetNextParameter( aParameter.TopLeft.First, nIndex, rValue )
+ && GetNextParameter( aParameter.TopLeft.Second, nIndex, rValue )
+ && GetNextParameter( aParameter.BottomRight.First, nIndex, rValue )
+ && GetNextParameter( aParameter.BottomRight.Second, nIndex, rValue ) )
+ {
+ vTextFrame.push_back( aParameter );
+ }
+ if ( vTextFrame.size() )
+ {
+ uno::Sequence< drafts::com::sun::star::drawing::EnhancedCustomShapeTextFrame > aTextFrameSeq( vTextFrame.size() );
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeTextFrame >::const_iterator aIter = vTextFrame.begin();
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeTextFrame >::const_iterator aEnd = vTextFrame.end();
+ drafts::com::sun::star::drawing::EnhancedCustomShapeTextFrame* pValues = aTextFrameSeq.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( eDestProp );
+ aProp.Value <<= aTextFrameSeq;
+ rDest.push_back( aProp );
+ }
+}
+
+void GetEnhancedPath( std::vector< com::sun::star::beans::PropertyValue >& rDest, // e.g. draw:enhanced-path
+ const rtl::OUString& rValue )
+{
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair > vCoordinates;
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeSegment > vSegments;
+
+ sal_Int32 nIndex = 0;
+ sal_Int32 nParameterCount = 0;
+
+ sal_Int32 nParametersNeeded = 1;
+ sal_Int16 nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::MOVETO;
+
+ sal_Bool bValid = sal_True;
+
+ while( bValid && ( nIndex < rValue.getLength() ) )
+ {
+ switch( rValue[ nIndex ] )
+ {
+ case 'M' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::MOVETO;
+ nParametersNeeded = 1;
+ nIndex++;
+ }
+ break;
+ case 'L' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::LINETO;
+ nParametersNeeded = 1;
+ nIndex++;
+ }
+ break;
+ case 'C' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CURVETO;
+ nParametersNeeded = 3;
+ nIndex++;
+ }
+ break;
+ case 'Z' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOSESUBPATH;
+ nParametersNeeded = 0;
+ nIndex++;
+ }
+ break;
+ case 'N' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ENDSUBPATH;
+ nParametersNeeded = 0;
+ nIndex++;
+ }
+ break;
+ case 'F' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::NOFILL;
+ nParametersNeeded = 0;
+ nIndex++;
+ }
+ break;
+ case 'S' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::NOSTROKE;
+ nParametersNeeded = 0;
+ nIndex++;
+ }
+ break;
+ case 'T' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ANGLEELLIPSETO;
+ nParametersNeeded = 3;
+ nIndex++;
+ }
+ break;
+ case 'U' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ANGLEELLIPSE;
+ nParametersNeeded = 3;
+ nIndex++;
+ }
+ break;
+ case 'A' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ARCTO;
+ nParametersNeeded = 4;
+ nIndex++;
+ }
+ break;
+ case 'B' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ARC;
+ nParametersNeeded = 4;
+ nIndex++;
+ }
+ break;
+ case 'W' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOCKWISEARCTO;
+ nParametersNeeded = 4;
+ nIndex++;
+ }
+ break;
+ case 'V' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOCKWISEARC;
+ nParametersNeeded = 4;
+ nIndex++;
+ }
+ break;
+ case 'X' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTX;
+ nParametersNeeded = 1;
+ nIndex++;
+ }
+ break;
+ case 'Y' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTY;
+ nParametersNeeded = 1;
+ nIndex++;
+ }
+ break;
+ case 'Q' :
+ {
+ nLatestSegmentCommand = drafts::com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::QUADRATICCURVETO;
+ nParametersNeeded = 2;
+ nIndex++;
+ }
+ break;
+ case ' ' :
+ {
+ nIndex++;
+ }
+ break;
+
+ case '#' :
+ case '@' :
+ case '0' :
+ case '1' :
+ case '2' :
+ case '3' :
+ case '4' :
+ case '5' :
+ case '6' :
+ case '7' :
+ case '8' :
+ case '9' :
+ case '.' :
+ {
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair aPair;
+ if ( GetNextParameter( aPair.First, nIndex, rValue ) &&
+ GetNextParameter( aPair.Second, nIndex, rValue ) )
+ {
+ vCoordinates.push_back( aPair );
+ nParameterCount++;
+ }
+ else
+ bValid = sal_False;
+ }
+ break;
+ default:
+ nIndex++;
+ break;
+ }
+ if ( nParameterCount >= nParametersNeeded )
+ {
+ // check if the last command is identical,
+ // if so, we just need to increment the count
+ if ( vSegments.size() && ( vSegments[ vSegments.size() - 1 ].Command == nLatestSegmentCommand ) )
+ vSegments[ vSegments.size() -1 ].Count++;
+ else
+ {
+ drafts::com::sun::star::drawing::EnhancedCustomShapeSegment aSegment;
+ aSegment.Command = nLatestSegmentCommand;
+ aSegment.Count = 1;
+ vSegments.push_back( aSegment );
+ }
+ nParameterCount = 0;
+ }
+ }
+ // adding the Coordinates property
+ uno::Sequence< drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair > seqCoordinates( vCoordinates.size() );
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair >::const_iterator aCoordinatesIter = vCoordinates.begin();
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair >::const_iterator aCoordinatesEnd = vCoordinates.end();
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameterPair* pCoordinateValues = seqCoordinates.getArray();
+
+ while ( aCoordinatesIter != aCoordinatesEnd )
+ *pCoordinateValues++ = *aCoordinatesIter++;
+
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( EAS_Coordinates );
+ aProp.Value <<= seqCoordinates;
+ rDest.push_back( aProp );
+
+
+ // adding the Segments property
+ uno::Sequence< drafts::com::sun::star::drawing::EnhancedCustomShapeSegment > seqSegments( vSegments.size() );
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeSegment >::const_iterator aSegmentsIter = vSegments.begin();
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeSegment >::const_iterator aSegmentsEnd = vSegments.end();
+ drafts::com::sun::star::drawing::EnhancedCustomShapeSegment* pSegmentValues = seqSegments.getArray();
+
+ while ( aSegmentsIter != aSegmentsEnd )
+ *pSegmentValues++ = *aSegmentsIter++;
+
+ aProp.Name = EASGet( EAS_Segments );
+ aProp.Value <<= seqSegments;
+ rDest.push_back( aProp );
+}
+
+void GetEnhancedCustomShapeEquation( std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeEquation >& rDest, // draw:formula
+ const rtl::OUString& rValue )
+{
+ drafts::com::sun::star::drawing::EnhancedCustomShapeEquation aEquation;
+
+ rtl::OUString aString( rValue.trim() ); // removing white spaces
+ sal_Int32 i = aString.indexOf( (sal_Char)' ', 0 );
+ if ( ( !i ) || ( i == -1 ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::UNKNOWN;
+ else
+ {
+ rtl::OUString aOperation( aString.copy( 0, i ) );
+ rtl::OUString aParaString( aString.copy( i + 1 ).trim() );
+
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::UNKNOWN;
+ switch( aOperation.getLength() )
+ {
+ case 2 :
+ {
+ if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "if" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::IF;
+ }
+ break;
+ case 3 :
+ {
+ if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "sum" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::SUM;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "mid" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::MID;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "abs" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::ABS;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "min" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::MIN;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "max" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::MAX;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "mod" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::MOD;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "sin" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::SIN;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "cos" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::COS;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "tan" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::TAN;
+ }
+ break;
+ case 4 :
+ {
+ if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "sqrt" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::SQRT;
+ }
+ break;
+ case 5 :
+ {
+ if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "atan2" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::ATAN2;
+
+ }
+ break;
+ case 7 :
+ {
+ if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "product" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::PROD;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "ellipse" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::ELLIPSE;
+ }
+ break;
+ case 8 :
+ {
+ if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "cosatan2" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::COSATAN2;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "sinatan2" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::SINATAN2;
+ else if ( aOperation.equalsIgnoreAsciiCase( rtl::OUString::createFromAscii( "sumangle" ) ) )
+ aEquation.Operation = drafts::com::sun::star::drawing::EnhancedCustomShapeOperation::SUMANGLE;
+ }
+ break;
+ }
+ i = 0;
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameter > aParameters;
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameter aParameter;
+
+ while( GetNextParameter( aParameter, i, aParaString ) )
+ {
+ aParameters.push_back( aParameter );
+ }
+ if ( aParameters.size() )
+ {
+ uno::Sequence< drafts::com::sun::star::drawing::EnhancedCustomShapeParameter > aParaPropSeq( aParameters.size() );
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameter >::const_iterator aIter = aParameters.begin();
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeParameter >::const_iterator aEnd = aParameters.end();
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameter* pValues = aParaPropSeq.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ aEquation.Parameters = aParaPropSeq;
+ }
+ }
+ rDest.push_back( aEquation );
+}
+
+void GetAdjustmentValues( std::vector< com::sun::star::beans::PropertyValue >& rDest, // draw:adjustments
+ const rtl::OUString& rValue )
+{
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue > vAdjustmentValue;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ drafts::com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue aAdj;
+ rtl::OUString aToken( rValue.getToken( 0, ',', nIndex ) );
+
+ // the adjustment value can be double or integer, we use GetNextParameter
+ // to determine the correct type
+ sal_Int32 nIndex = 0;
+ drafts::com::sun::star::drawing::EnhancedCustomShapeParameter aParameter;
+ if ( GetNextParameter( aParameter, nIndex, aToken )
+ && ( aParameter.Type == drafts::com::sun::star::drawing::EnhancedCustomShapeParameterType::NORMAL ) )
+ {
+ aAdj.Value <<= aParameter.Value;
+ aAdj.State = beans::PropertyState_DIRECT_VALUE;
+ }
+ else
+ aAdj.State = beans::PropertyState_DEFAULT_VALUE;
+
+ vAdjustmentValue.push_back( aAdj );
+ }
+ while ( nIndex >= 0 );
+
+ sal_Int32 nAdjustmentValues = vAdjustmentValue.size();
+ if ( nAdjustmentValues )
+ {
+ uno::Sequence< drafts::com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue > aAdjustmentValues( nAdjustmentValues );
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue >::const_iterator aIter = vAdjustmentValue.begin();
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue >::const_iterator aEnd = vAdjustmentValue.end();
+ drafts::com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue* pValues = aAdjustmentValues.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ beans::PropertyValue aProp;
+ aProp.Name = EASGet( EAS_AdjustmentValues );
+ aProp.Value <<= aAdjustmentValues;
+ rDest.push_back( aProp );
+ }
+}
+
+void XMLEnhancedCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+{
+ sal_Int16 nLength = xAttrList->getLength();
+ if ( nLength )
+ {
+ sal_Int32 nAttrNumber;
+
+ sal_Bool bCoordinateSizeUsed = sal_False;
+ sal_Bool bCoordinateOriginUsed = sal_False;
+ sal_Bool bStretchPointUsed = sal_False;
+ awt::Size aCoordinateSize( 0, 0 );
+ awt::Point aCoordinateOrigin( 0, 0 );
+ awt::Point aStretchPoint( 0, 0 );
+
+ for( sal_Int16 nAttr = 0; nAttr < nLength; nAttr++ )
+ {
+ rtl::OUString aLocalName;
+ const rtl::OUString& rValue = xAttrList->getValueByIndex( nAttr );
+ sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( nAttr ), &aLocalName );
+
+ switch( EASGet( aLocalName ) )
+ {
+ case EAS_predefined_type :
+ GetString( mrCustomShapeGeometry, rValue, EAS_PredefinedType );
+ break;
+ case EAS_mirror_horizontal :
+ GetBool( mrCustomShapeGeometry, rValue, EAS_MirroredX );
+ break;
+ case EAS_mirror_vertical :
+ GetBool( mrCustomShapeGeometry, rValue, EAS_MirroredY );
+ break;
+ case EAS_coordinate_origin_x :
+ {
+ if ( SvXMLUnitConverter::convertNumber( nAttrNumber, rValue ) )
+ {
+ bCoordinateOriginUsed = sal_True;
+ aCoordinateOrigin.X = nAttrNumber;
+ }
+ }
+ break;
+ case EAS_coordinate_origin_y :
+ {
+ if ( SvXMLUnitConverter::convertNumber( nAttrNumber, rValue ) )
+ {
+ bCoordinateOriginUsed = sal_True;
+ aCoordinateOrigin.Y = nAttrNumber;
+ }
+ }
+ break;
+ case EAS_coordinate_width :
+ {
+ if ( SvXMLUnitConverter::convertNumber( nAttrNumber, rValue ) )
+ {
+ bCoordinateSizeUsed = sal_True;
+ aCoordinateSize.Width = nAttrNumber;
+ }
+ }
+ break;
+ case EAS_coordinate_height :
+ {
+ if ( SvXMLUnitConverter::convertNumber( nAttrNumber, rValue ) )
+ {
+ bCoordinateSizeUsed = sal_True;
+ aCoordinateSize.Height = nAttrNumber;
+ }
+ }
+ break;
+ case EAS_text_rotate_angle :
+ GetDouble( mrCustomShapeGeometry, rValue, EAS_TextRotateAngle );
+ break;
+ case EAS_extrusion_allowed :
+ GetBool( maPath, rValue, EAS_ExtrusionAllowed );
+ break;
+ case EAS_text_path_allowed :
+ GetBool( maPath, rValue, EAS_TextPathAllowed );
+ break;
+ case EAS_concentric_gradient_fill_allowed :
+ GetBool( maPath, rValue, EAS_ConcentricGradientFillAllowed );
+ break;
+ case EAS_extrusion :
+ GetOnOff( maExtrusion, rValue, EAS_On );
+ break;
+ case EAS_extrusion_auto_rotation_center :
+ GetBool( maExtrusion, rValue, EAS_AutoRotationCenter );
+ break;
+ case EAS_extrusion_backward_depth :
+ GetDistance( maExtrusion, rValue, EAS_BackwardDepth );
+ break;
+ case EAS_extrusion_brightness :
+ GetDoublePercentage( maExtrusion, rValue, EAS_Brightness );
+ break;
+ case EAS_extrusion_diffusity :
+ GetDoublePercentage( maExtrusion, rValue, EAS_Diffusity );
+ break;
+ case EAS_extrusion_edge :
+ GetInt32( maExtrusion, rValue, EAS_Edge );
+ break;
+ case EAS_extrusion_facet :
+ GetInt32( maExtrusion, rValue, EAS_Facet );
+ break;
+ case EAS_extrusion_foreward_depth :
+ GetDistance( maExtrusion, rValue, EAS_ForewardDepth );
+ break;
+ case EAS_extrusion_light_face :
+ GetBool( maExtrusion, rValue, EAS_LightFace );
+ break;
+ case EAS_extrusion_light_harsh1 :
+ GetBool( maExtrusion, rValue, EAS_LightHarsh1 );
+ break;
+ case EAS_extrusion_light_harsh2 :
+ GetBool( maExtrusion, rValue, EAS_LightHarsh2 );
+ break;
+ case EAS_extrusion_light_level1 :
+ GetDoublePercentage( maExtrusion, rValue, EAS_LightLevel1 );
+ break;
+ case EAS_extrusion_light_level2 :
+ GetDoublePercentage( maExtrusion, rValue, EAS_LightLevel2 );
+ break;
+ case EAS_extrusion_light_direction1 :
+ GetVector3D( maExtrusion, rValue, EAS_LightDirection1 );
+ break;
+ case EAS_extrusion_light_direction2 :
+ GetVector3D( maExtrusion, rValue, EAS_LightDirection2 );
+ break;
+ case EAS_extrusion_metal :
+ GetBool( maExtrusion, rValue, EAS_Metal );
+ break;
+ case EAS_extrusion_plane :
+ GetEnum( maExtrusion, rValue, EAS_Plane, *aXML_ExtrusionPlaneEnumMap );
+ break;
+ case EAS_extrusion_render_mode :
+ GetEnum( maExtrusion, rValue, EAS_RenderMode, *aXML_ExtrusionRenderEnumMap );
+ break;
+ case EAS_extrusion_rotation_angle_x :
+ GetDouble( maExtrusion, rValue, EAS_AngleX );
+ break;
+ case EAS_extrusion_rotation_angle_y :
+ GetDouble( maExtrusion, rValue, EAS_AngleY );
+ break;
+ case EAS_extrusion_rotation_center_x :
+ GetDoublePercentage( maExtrusion, rValue, EAS_RotationCenterX );
+ break;
+ case EAS_extrusion_rotation_center_y :
+ GetDoublePercentage( maExtrusion, rValue, EAS_RotationCenterY );
+ break;
+ case EAS_extrusion_rotation_center_z :
+ GetDoublePercentage( maExtrusion, rValue, EAS_RotationCenterZ );
+ break;
+ case EAS_extrusion_shininess :
+ GetDoublePercentage( maExtrusion, rValue, EAS_Shininess );
+ break;
+ case EAS_extrusion_skew :
+ GetDoublePercentage( maExtrusion, rValue, EAS_Skew );
+ break;
+ case EAS_extrusion_skew_angle :
+ GetDouble( maExtrusion, rValue, EAS_SkewAngle );
+ break;
+ case EAS_extrusion_specularity :
+ GetDoublePercentage( maExtrusion, rValue, EAS_Specularity );
+ break;
+ case EAS_extrusion_parallel :
+ GetBool( maExtrusion, rValue, EAS_Parallel );
+ break;
+ case EAS_extrusion_viewpoint :
+ GetPosition3D( maExtrusion, rValue, EAS_ViewPoint, mrUnitConverter );
+ break;
+ case EAS_extrusion_origin_x :
+ GetDoublePercentage( maExtrusion, rValue, EAS_OriginX );
+ break;
+ case EAS_extrusion_origin_y :
+ GetDoublePercentage( maExtrusion, rValue, EAS_OriginY );
+ break;
+ case EAS_extrusion_color :
+ GetBool( maExtrusion, rValue, EAS_Color );
+ break;
+ case EAS_enhanced_path :
+ GetEnhancedPath( maPath, rValue );
+ break;
+ case EAS_path_stretchpoint_x :
+ {
+ if ( SvXMLUnitConverter::convertNumber( nAttrNumber, rValue ) )
+ {
+ bStretchPointUsed = sal_True;
+ aStretchPoint.X = nAttrNumber;
+ }
+ }
+ break;
+ case EAS_path_stretchpoint_y :
+ {
+ if ( SvXMLUnitConverter::convertNumber( nAttrNumber, rValue ) )
+ {
+ bStretchPointUsed = sal_True;
+ aStretchPoint.Y = nAttrNumber;
+ }
+ }
+ break;
+ case EAS_text_frames :
+ GetEnhancedRectangleSequence( maPath, rValue, EAS_TextFrames );
+ break;
+ case EAS_glue_points :
+ GetEnhancedParameterPairSequence( maPath, rValue, EAS_GluePoints );
+ break;
+ case EAS_glue_point_type :
+ GetEnum( maPath, rValue, EAS_GluePointType, *aXML_GluePointEnumMap );
+ break;
+ case EAS_glue_point_leaving_directions :
+ GetDoubleSequence( maPath, rValue, EAS_GluePointLeavingDirections );
+ break;
+ case EAS_text_path :
+ GetOnOff( maTextPath, rValue, EAS_On );
+ break;
+ case EAS_text_path_fit_text :
+ GetBool( maTextPath, rValue, EAS_FitPath );
+ break;
+ case EAS_text_path_fit_shape :
+ GetBool( maTextPath, rValue, EAS_FitShape );
+ break;
+ case EAS_text_path_scale_x :
+ GetBool( maTextPath, rValue, EAS_ScaleX );
+ break;
+ case EAS_text_path_same_letter_heights :
+ GetBool( maTextPath, rValue, EAS_SameLetterHeights );
+ break;
+ case EAS_adjustments :
+ GetAdjustmentValues( mrCustomShapeGeometry, rValue );
+ break;
+ case EAS_callout :
+ GetOnOff( maCallout, rValue, EAS_On );
+ break;
+ case EAS_callout_accent_bar :
+ GetBool( maCallout, rValue, EAS_AccentBar );
+ break;
+ case EAS_callout_angle :
+ GetDouble( maCallout, rValue, EAS_Angle );
+ break;
+ case EAS_callout_drop_distance :
+ GetDistance( maCallout, rValue, EAS_Distance );
+ break;
+ case EAS_callout_drop :
+ GetEnum( maCallout, rValue, EAS_Drop, *aXML_CalloutDropEnumMap );
+ break;
+ case EAS_callout_drop_automatic :
+ GetBool( maCallout, rValue, EAS_DropAuto );
+ break;
+ case EAS_callout_gap :
+ GetDistance( maCallout, rValue, EAS_Gap );
+ break;
+ case EAS_callout_length :
+ GetDistance( maCallout, rValue, EAS_Length );
+ break;
+ case EAS_callout_length_specified :
+ GetBool( maCallout, rValue, EAS_LengthSpecified );
+ break;
+ case EAS_callout_flip_x :
+ GetBool( maCallout, rValue, EAS_FlipX );
+ break;
+ case EAS_callout_flip_y :
+ GetBool( maCallout, rValue, EAS_FlipY );
+ break;
+ case EAS_callout_text_border :
+ GetBool( maCallout, rValue, EAS_TextBorder );
+ break;
+ case EAS_callout_type :
+ GetEnum( maCallout, rValue, EAS_Type, *aXML_CalloutTypeEnumMap );
+ break;
+ }
+ }
+ beans::PropertyValue aProp;
+ if ( bCoordinateOriginUsed )
+ {
+ aProp.Name = EASGet( EAS_CoordinateOrigin );
+ aProp.Value <<= aCoordinateOrigin;
+ mrCustomShapeGeometry.push_back( aProp );
+ }
+ if ( bCoordinateSizeUsed )
+ {
+ aProp.Name = EASGet( EAS_CoordinateSize );
+ aProp.Value <<= aCoordinateSize;
+ mrCustomShapeGeometry.push_back( aProp );
+ }
+ if ( bStretchPointUsed )
+ {
+ aProp.Name = EASGet( EAS_StretchPoint );
+ aProp.Value <<= aStretchPoint;
+ maPath.push_back( aProp );
+ }
+ }
+}
+
+void SdXMLCustomShapePropertyMerge( std::vector< com::sun::star::beans::PropertyValue >& rPropVec,
+ const std::vector< beans::PropertyValues >& rElement,
+ const rtl::OUString& rElementName )
+{
+ if ( rElement.size() )
+ {
+ uno::Sequence< beans::PropertyValues > aPropSeq( rElement.size() );
+ std::vector< beans::PropertyValues >::const_iterator aIter = rElement.begin();
+ std::vector< beans::PropertyValues >::const_iterator aEnd = rElement.end();
+ beans::PropertyValues* pValues = aPropSeq.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ beans::PropertyValue aProp;
+ aProp.Name = rElementName;
+ aProp.Value <<= aPropSeq;
+ rPropVec.push_back( aProp );
+ }
+}
+
+void SdXMLCustomShapePropertyMerge( std::vector< com::sun::star::beans::PropertyValue >& rPropVec,
+ const std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeEquation >& rElement,
+ const rtl::OUString& rElementName )
+{
+ if ( rElement.size() )
+ {
+ uno::Sequence< drafts::com::sun::star::drawing::EnhancedCustomShapeEquation > aPropSeq( rElement.size() );
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeEquation >::const_iterator aIter = rElement.begin();
+ std::vector< drafts::com::sun::star::drawing::EnhancedCustomShapeEquation >::const_iterator aEnd = rElement.end();
+ drafts::com::sun::star::drawing::EnhancedCustomShapeEquation* pValues = aPropSeq.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ beans::PropertyValue aProp;
+ aProp.Name = rElementName;
+ aProp.Value <<= aPropSeq;
+ rPropVec.push_back( aProp );
+ }
+}
+
+void SdXMLCustomShapePropertyMerge( std::vector< com::sun::star::beans::PropertyValue >& rPropVec,
+ const std::vector< com::sun::star::beans::PropertyValue >& rElement,
+ const rtl::OUString& rElementName )
+{
+ if ( rElement.size() )
+ {
+ uno::Sequence< beans::PropertyValue > aPropSeq( rElement.size() );
+ std::vector< beans::PropertyValue >::const_iterator aIter = rElement.begin();
+ std::vector< beans::PropertyValue >::const_iterator aEnd = rElement.end();
+ beans::PropertyValue* pValues = aPropSeq.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ beans::PropertyValue aProp;
+ aProp.Name = rElementName;
+ aProp.Value <<= aPropSeq;
+ rPropVec.push_back( aProp );
+ }
+}
+
+void XMLEnhancedCustomShapeContext::EndElement()
+{
+ SdXMLCustomShapePropertyMerge( mrCustomShapeGeometry, maCallout, EASGet( EAS_Callout ) );
+ SdXMLCustomShapePropertyMerge( mrCustomShapeGeometry, maExtrusion, EASGet( EAS_Extrusion ) );
+ SdXMLCustomShapePropertyMerge( mrCustomShapeGeometry, maPath, EASGet( EAS_Path ) );
+ SdXMLCustomShapePropertyMerge( mrCustomShapeGeometry, maTextPath, EASGet( EAS_TextPath ) );
+ SdXMLCustomShapePropertyMerge( mrCustomShapeGeometry, maEquations, EASGet( EAS_Equations ) );
+ if ( maHandles.size() )
+ SdXMLCustomShapePropertyMerge( mrCustomShapeGeometry, maHandles, EASGet( EAS_Handles ) );
+}
+
+SvXMLImportContext* XMLEnhancedCustomShapeContext::CreateChildContext( USHORT nPrefix,const rtl::OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList> & xAttrList )
+{
+ EnhancedCustomShapeTokenEnum aTokenEnum = EASGet( rLocalName );
+ if ( aTokenEnum == EAS_equation )
+ {
+ sal_Int16 nLength = xAttrList->getLength();
+ if ( nLength )
+ {
+ for( sal_Int16 nAttr = 0; nAttr < nLength; nAttr++ )
+ {
+ rtl::OUString aLocalName;
+ const rtl::OUString& rValue = xAttrList->getValueByIndex( nAttr );
+ sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( nAttr ), &aLocalName );
+ if ( EASGet( aLocalName ) == EAS_formula )
+ GetEnhancedCustomShapeEquation( maEquations, rValue );
+ }
+ }
+ }
+ else if ( aTokenEnum == EAS_handle )
+ {
+ std::vector< com::sun::star::beans::PropertyValue > aHandle;
+ for( sal_Int16 nAttr = 0; nAttr < xAttrList->getLength(); nAttr++ )
+ {
+ rtl::OUString aLocalName;
+ const rtl::OUString& rValue = xAttrList->getValueByIndex( nAttr );
+ sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( nAttr ), &aLocalName );
+ switch( EASGet( aLocalName ) )
+ {
+ case EAS_handle_mirror_vertical :
+ GetBool( aHandle, rValue, EAS_MirroredY );
+ break;
+ case EAS_handle_mirror_horizontal :
+ GetBool( aHandle, rValue, EAS_MirroredX );
+ break;
+ case EAS_handle_switched :
+ GetBool( aHandle, rValue, EAS_Switched );
+ break;
+ case EAS_handle_position :
+ GetEnhancedParameterPair( aHandle, rValue, EAS_Position );
+ break;
+ case EAS_handle_range_x_minimum :
+ GetEnhancedParameter( aHandle, rValue, EAS_RangeXMinimum );
+ break;
+ case EAS_handle_range_x_maximum :
+ GetEnhancedParameter( aHandle, rValue, EAS_RangeXMaximum );
+ break;
+ case EAS_handle_range_y_minimum :
+ GetEnhancedParameter( aHandle, rValue, EAS_RangeYMinimum );
+ break;
+ case EAS_handle_range_y_maximum :
+ GetEnhancedParameter( aHandle, rValue, EAS_RangeYMaximum );
+ break;
+ case EAS_handle_polar :
+ GetEnhancedParameterPair( aHandle, rValue, EAS_Polar );
+ break;
+ case EAS_handle_radius_range_minimum :
+ GetEnhancedParameter( aHandle, rValue, EAS_RadiusRangeMinimum );
+ break;
+ case EAS_handle_radius_range_maximum :
+ GetEnhancedParameter( aHandle, rValue, EAS_RadiusRangeMaximum );
+ break;
+ }
+ }
+ beans::PropertyValues aPropSeq( aHandle.size() );
+ std::vector< beans::PropertyValue >::const_iterator aIter = aHandle.begin();
+ std::vector< beans::PropertyValue >::const_iterator aEnd = aHandle.end();
+ beans::PropertyValue* pValues = aPropSeq.getArray();
+
+ while ( aIter != aEnd )
+ *pValues++ = *aIter++;
+
+ maHandles.push_back( aPropSeq );
+ }
+ return SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
+}
+
+