2004-04-02 12:53:29 +00:00
/*************************************************************************
*
2008-04-10 20:54:25 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2004-04-02 12:53:29 +00:00
*
2010-02-12 15:01:35 +01:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2004-04-02 12:53:29 +00:00
*
2008-04-10 20:54:25 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2004-04-02 12:53:29 +00:00
*
2008-04-10 20:54:25 +00:00
* This file is part of OpenOffice . org .
2004-04-02 12:53:29 +00:00
*
2008-04-10 20:54:25 +00:00
* OpenOffice . org is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License version 3
* only , as published by the Free Software Foundation .
2004-04-02 12:53:29 +00:00
*
2008-04-10 20:54:25 +00:00
* OpenOffice . org 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 version 3 for more details
* ( a copy is included in the LICENSE file that accompanied this code ) .
2004-04-02 12:53:29 +00:00
*
2008-04-10 20:54:25 +00:00
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice . org . If not , see
* < http : //www.openoffice.org/license.html>
* for a copy of the LGPLv3 License .
2004-04-02 12:53:29 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-17 09:31:20 +00:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_xmloff.hxx"
2004-04-02 12:53:29 +00:00
# include "ximpcustomshape.hxx"
# include "ximpshap.hxx"
# include "xmlehelp.hxx"
# include <rtl/math.hxx>
# include <rtl/ustrbuf.hxx>
2004-11-26 13:10:19 +00:00
# include <rtl/ustring.hxx>
2004-04-02 12:53:29 +00:00
# include <com/sun/star/uno/Reference.h>
# include <com/sun/star/beans/XPropertySet.hpp>
# include <com/sun/star/xml/sax/XAttributeList.hpp>
# include <com/sun/star/container/XIndexContainer.hpp>
2007-06-27 14:09:31 +00:00
# include <xmloff/xmltoken.hxx>
2004-04-02 12:53:29 +00:00
# include "EnhancedCustomShapeToken.hxx"
2007-06-27 14:09:31 +00:00
# include <xmloff/xmlimp.hxx>
# include <xmloff/xmltkmap.hxx>
2004-04-02 12:53:29 +00:00
# include "xmlnmspe.hxx"
2007-06-27 14:09:31 +00:00
# include <xmloff/nmspmap.hxx>
# include <xmloff/xmluconv.hxx>
2004-04-02 12:53:29 +00:00
# include "xexptran.hxx"
# include "xmlerror.hxx"
# include <tools/debug.hxx>
# include <com/sun/star/drawing/Direction3D.hpp>
2005-03-01 16:59:26 +00:00
# include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeParameterType.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeTextFrame.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp>
2004-10-12 12:06:26 +00:00
# include <com/sun/star/drawing/ProjectionMode.hpp>
2004-11-26 13:10:19 +00:00
# include <hash_map>
2004-04-02 12:53:29 +00:00
using namespace : : com : : sun : : star ;
using namespace : : xmloff : : token ;
using namespace : : xmloff : : EnhancedCustomShapeToken ;
TYPEINIT1 ( XMLEnhancedCustomShapeContext , SvXMLImportContext ) ;
2005-04-12 15:52:37 +00:00
XMLEnhancedCustomShapeContext : : XMLEnhancedCustomShapeContext ( SvXMLImport & rImport ,
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : drawing : : XShape > & rxShape ,
sal_uInt16 nPrefix , const rtl : : OUString & rLocalName ,
std : : vector < com : : sun : : star : : beans : : PropertyValue > & rCustomShapeGeometry ) :
2006-06-19 17:14:18 +00:00
SvXMLImportContext ( rImport , nPrefix , rLocalName ) ,
2004-04-02 12:53:29 +00:00
mrUnitConverter ( rImport . GetMM100UnitConverter ( ) ) ,
2006-06-19 17:14:18 +00:00
mrxShape ( rxShape ) ,
mrCustomShapeGeometry ( rCustomShapeGeometry )
2004-04-02 12:53:29 +00:00
{
}
const SvXMLEnumMapEntry aXML_GluePointEnumMap [ ] =
{
{ XML_NONE , 0 } ,
{ XML_SEGMENTS , 1 } ,
{ XML_NONE , 2 } ,
2004-11-15 11:36:07 +00:00
{ XML_RECTANGLE , 3 } ,
{ XML_TOKEN_INVALID , 0 }
2004-04-02 12:53:29 +00:00
} ;
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 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 ) ;
}
}
}
2006-11-14 13:16:16 +00:00
void GetB3DVector ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest ,
2004-04-02 12:53:29 +00:00
const rtl : : OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
{
2006-11-14 13:16:16 +00:00
: : basegfx : : B3DVector aB3DVector ;
if ( SvXMLUnitConverter : : convertB3DVector ( aB3DVector , rValue ) )
2004-04-02 12:53:29 +00:00
{
2006-11-14 13:16:16 +00:00
drawing : : Direction3D aDirection3D ( aB3DVector . getX ( ) , aB3DVector . getY ( ) , aB3DVector . getZ ( ) ) ;
2004-04-02 12:53:29 +00:00
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( eDestProp ) ;
aProp . Value < < = aDirection3D ;
rDest . push_back ( aProp ) ;
}
}
2004-11-26 13:10:19 +00:00
sal_Bool GetEquationName ( const rtl : : OUString & rEquation , const sal_Int32 nStart , rtl : : OUString & rEquationName )
{
sal_Int32 nIndex = nStart ;
while ( nIndex < rEquation . getLength ( ) )
{
sal_Unicode nChar = rEquation [ nIndex ] ;
if (
( ( nChar > = ' a ' ) & & ( nChar < = ' z ' ) )
| | ( ( nChar > = ' A ' ) & & ( nChar < = ' Z ' ) )
| | ( ( nChar > = ' 0 ' ) & & ( nChar < = ' 9 ' ) )
)
{
nIndex + + ;
}
else
break ;
}
sal_Bool bValid = ( nIndex - nStart ) ! = 0 ;
if ( bValid )
rEquationName = rEquation . copy ( nStart , nIndex - nStart ) ;
return bValid ;
}
2005-03-01 16:59:26 +00:00
sal_Bool GetNextParameter ( com : : sun : : star : : drawing : : EnhancedCustomShapeParameter & rParameter , sal_Int32 & nIndex , const rtl : : OUString & rParaString )
2004-04-02 12:53:29 +00:00
{
if ( nIndex > = rParaString . getLength ( ) )
return sal_False ;
sal_Bool bValid = sal_True ;
sal_Bool bNumberRequired = sal_True ;
sal_Bool bMustBePositiveWholeNumbered = sal_False ;
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : NORMAL ;
2004-11-26 13:10:19 +00:00
if ( rParaString [ nIndex ] = = ( sal_Unicode ) ' $ ' )
2004-04-02 12:53:29 +00:00
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : ADJUSTMENT ;
2004-04-02 12:53:29 +00:00
bMustBePositiveWholeNumbered = sal_True ;
nIndex + + ;
}
2004-11-26 13:10:19 +00:00
else if ( rParaString [ nIndex ] = = ( sal_Unicode ) ' ? ' )
2004-04-02 12:53:29 +00:00
{
nIndex + + ;
2004-11-26 13:10:19 +00:00
bNumberRequired = sal_False ;
rtl : : OUString aEquationName ;
bValid = GetEquationName ( rParaString , nIndex , aEquationName ) ;
if ( bValid )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : EQUATION ;
2004-11-26 13:10:19 +00:00
rParameter . Value < < = aEquationName ;
nIndex + = aEquationName . getLength ( ) ;
}
2004-04-02 12:53:29 +00:00
}
else if ( rParaString [ nIndex ] > ( sal_Unicode ) ' 9 ' )
{
bNumberRequired = sal_False ;
if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " left " , 4 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : LEFT ;
2004-04-02 12:53:29 +00:00
nIndex + = 4 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " top " , 3 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : TOP ;
2004-04-02 12:53:29 +00:00
nIndex + = 3 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " right " , 5 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : RIGHT ;
2004-04-02 12:53:29 +00:00
nIndex + = 5 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " bottom " , 6 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : BOTTOM ;
2004-04-02 12:53:29 +00:00
nIndex + = 6 ;
}
2004-11-26 13:10:19 +00:00
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " xstretch " , 8 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : XSTRETCH ;
2004-11-26 13:10:19 +00:00
nIndex + = 8 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " ystretch " , 8 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : YSTRETCH ;
2004-11-26 13:10:19 +00:00
nIndex + = 8 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " hasstroke " , 9 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : HASSTROKE ;
2004-11-26 13:10:19 +00:00
nIndex + = 9 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " hasfill " , 7 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : HASFILL ;
2004-11-26 13:10:19 +00:00
nIndex + = 7 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " width " , 5 , nIndex ) )
2004-04-02 12:53:29 +00:00
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : WIDTH ;
2004-11-26 13:10:19 +00:00
nIndex + = 5 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " height " , 6 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : HEIGHT ;
2004-04-02 12:53:29 +00:00
nIndex + = 6 ;
}
2004-11-26 13:10:19 +00:00
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " logwidth " , 8 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : LOGWIDTH ;
2004-11-26 13:10:19 +00:00
nIndex + = 8 ;
}
else if ( rParaString . matchIgnoreAsciiCaseAsciiL ( " logheight " , 9 , nIndex ) )
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : LOGHEIGHT ;
2004-11-26 13:10:19 +00:00
nIndex + = 9 ;
}
2004-04-02 12:53:29 +00:00
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 ) ;
2009-04-23 10:42:05 +00:00
if ( ! vDirection . empty ( ) )
2004-04-02 12:53:29 +00:00
{
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 ;
2005-03-01 16:59:26 +00:00
com : : sun : : star : : drawing : : EnhancedCustomShapeParameter aParameter ;
2004-04-02 12:53:29 +00:00
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 ;
2005-03-01 16:59:26 +00:00
com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair aParameterPair ;
2004-04-02 12:53:29 +00:00
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 ) ;
}
}
2005-04-12 15:52:37 +00:00
sal_Int32 GetEnhancedParameterPairSequence ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest , // e.g. draw:glue-points
2004-04-02 12:53:29 +00:00
const rtl : : OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
{
2005-03-01 16:59:26 +00:00
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > vParameter ;
com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair aParameter ;
2004-04-02 12:53:29 +00:00
sal_Int32 nIndex = 0 ;
while ( GetNextParameter ( aParameter . First , nIndex , rValue )
& & GetNextParameter ( aParameter . Second , nIndex , rValue ) )
{
vParameter . push_back ( aParameter ) ;
}
2009-04-23 10:42:05 +00:00
if ( ! vParameter . empty ( ) )
2004-04-02 12:53:29 +00:00
{
2005-03-01 16:59:26 +00:00
uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > aParameterSeq ( vParameter . size ( ) ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > : : const_iterator aIter = vParameter . begin ( ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > : : const_iterator aEnd = vParameter . end ( ) ;
com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair * pValues = aParameterSeq . getArray ( ) ;
2004-04-02 12:53:29 +00:00
while ( aIter ! = aEnd )
* pValues + + = * aIter + + ;
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( eDestProp ) ;
aProp . Value < < = aParameterSeq ;
rDest . push_back ( aProp ) ;
}
2005-04-12 15:52:37 +00:00
return vParameter . size ( ) ;
2004-04-02 12:53:29 +00:00
}
2004-11-26 13:10:19 +00:00
void GetEnhancedRectangleSequence ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest , // e.g. draw:text-areas
2004-04-02 12:53:29 +00:00
const rtl : : OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
{
2005-03-01 16:59:26 +00:00
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeTextFrame > vTextFrame ;
com : : sun : : star : : drawing : : EnhancedCustomShapeTextFrame aParameter ;
2004-04-02 12:53:29 +00:00
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 ) ;
}
2009-04-23 10:42:05 +00:00
if ( ! vTextFrame . empty ( ) )
2004-04-02 12:53:29 +00:00
{
2005-03-01 16:59:26 +00:00
uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeTextFrame > aTextFrameSeq ( vTextFrame . size ( ) ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeTextFrame > : : const_iterator aIter = vTextFrame . begin ( ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeTextFrame > : : const_iterator aEnd = vTextFrame . end ( ) ;
com : : sun : : star : : drawing : : EnhancedCustomShapeTextFrame * pValues = aTextFrameSeq . getArray ( ) ;
2004-04-02 12:53:29 +00:00
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 )
{
2005-03-01 16:59:26 +00:00
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > vCoordinates ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeSegment > vSegments ;
2004-04-02 12:53:29 +00:00
sal_Int32 nIndex = 0 ;
sal_Int32 nParameterCount = 0 ;
sal_Int32 nParametersNeeded = 1 ;
2005-03-01 16:59:26 +00:00
sal_Int16 nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : MOVETO ;
2004-04-02 12:53:29 +00:00
sal_Bool bValid = sal_True ;
while ( bValid & & ( nIndex < rValue . getLength ( ) ) )
{
switch ( rValue [ nIndex ] )
{
case ' M ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : MOVETO ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 1 ;
nIndex + + ;
}
break ;
case ' L ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : LINETO ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 1 ;
nIndex + + ;
}
break ;
case ' C ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : CURVETO ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 3 ;
nIndex + + ;
}
break ;
case ' Z ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : CLOSESUBPATH ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 0 ;
nIndex + + ;
}
break ;
case ' N ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ENDSUBPATH ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 0 ;
nIndex + + ;
}
break ;
case ' F ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : NOFILL ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 0 ;
nIndex + + ;
}
break ;
case ' S ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : NOSTROKE ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 0 ;
nIndex + + ;
}
break ;
case ' T ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ANGLEELLIPSETO ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 3 ;
nIndex + + ;
}
break ;
case ' U ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ANGLEELLIPSE ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 3 ;
nIndex + + ;
}
break ;
case ' A ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ARCTO ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 4 ;
nIndex + + ;
}
break ;
case ' B ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ARC ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 4 ;
nIndex + + ;
}
break ;
case ' W ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : CLOCKWISEARCTO ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 4 ;
nIndex + + ;
}
break ;
case ' V ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : CLOCKWISEARC ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 4 ;
nIndex + + ;
}
break ;
case ' X ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ELLIPTICALQUADRANTX ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 1 ;
nIndex + + ;
}
break ;
case ' Y ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ELLIPTICALQUADRANTY ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 1 ;
nIndex + + ;
}
break ;
case ' Q ' :
{
2005-03-01 16:59:26 +00:00
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : QUADRATICCURVETO ;
2004-04-02 12:53:29 +00:00
nParametersNeeded = 2 ;
nIndex + + ;
}
break ;
case ' ' :
{
nIndex + + ;
}
break ;
2004-11-26 13:10:19 +00:00
case ' $ ' :
case ' ? ' :
2004-04-02 12:53:29 +00:00
case ' 0 ' :
case ' 1 ' :
case ' 2 ' :
case ' 3 ' :
case ' 4 ' :
case ' 5 ' :
case ' 6 ' :
case ' 7 ' :
case ' 8 ' :
case ' 9 ' :
case ' . ' :
2010-07-14 13:47:44 +02:00
case ' - ' :
2004-04-02 12:53:29 +00:00
{
2005-03-01 16:59:26 +00:00
com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair aPair ;
2004-04-02 12:53:29 +00:00
if ( GetNextParameter ( aPair . First , nIndex , rValue ) & &
GetNextParameter ( aPair . Second , nIndex , rValue ) )
{
vCoordinates . push_back ( aPair ) ;
nParameterCount + + ;
}
else
bValid = sal_False ;
}
break ;
default :
nIndex + + ;
break ;
}
2004-11-26 13:10:19 +00:00
if ( ! nParameterCount & & ! nParametersNeeded )
{
2005-03-01 16:59:26 +00:00
com : : sun : : star : : drawing : : EnhancedCustomShapeSegment aSegment ;
2004-11-26 13:10:19 +00:00
aSegment . Command = nLatestSegmentCommand ;
aSegment . Count = 0 ;
vSegments . push_back ( aSegment ) ;
nParametersNeeded = 0x7fffffff ;
}
else if ( nParameterCount > = nParametersNeeded )
2004-04-02 12:53:29 +00:00
{
// check if the last command is identical,
// if so, we just need to increment the count
2009-04-23 10:42:05 +00:00
if ( ! vSegments . empty ( ) & & ( vSegments [ vSegments . size ( ) - 1 ] . Command = = nLatestSegmentCommand ) )
2004-04-02 12:53:29 +00:00
vSegments [ vSegments . size ( ) - 1 ] . Count + + ;
else
{
2005-03-01 16:59:26 +00:00
com : : sun : : star : : drawing : : EnhancedCustomShapeSegment aSegment ;
2004-04-02 12:53:29 +00:00
aSegment . Command = nLatestSegmentCommand ;
aSegment . Count = 1 ;
vSegments . push_back ( aSegment ) ;
}
nParameterCount = 0 ;
}
}
// adding the Coordinates property
2005-03-01 16:59:26 +00:00
uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > seqCoordinates ( vCoordinates . size ( ) ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > : : const_iterator aCoordinatesIter = vCoordinates . begin ( ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > : : const_iterator aCoordinatesEnd = vCoordinates . end ( ) ;
com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair * pCoordinateValues = seqCoordinates . getArray ( ) ;
2004-04-02 12:53:29 +00:00
while ( aCoordinatesIter ! = aCoordinatesEnd )
* pCoordinateValues + + = * aCoordinatesIter + + ;
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_Coordinates ) ;
aProp . Value < < = seqCoordinates ;
rDest . push_back ( aProp ) ;
// adding the Segments property
2005-03-01 16:59:26 +00:00
uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeSegment > seqSegments ( vSegments . size ( ) ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeSegment > : : const_iterator aSegmentsIter = vSegments . begin ( ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeSegment > : : const_iterator aSegmentsEnd = vSegments . end ( ) ;
com : : sun : : star : : drawing : : EnhancedCustomShapeSegment * pSegmentValues = seqSegments . getArray ( ) ;
2004-04-02 12:53:29 +00:00
while ( aSegmentsIter ! = aSegmentsEnd )
* pSegmentValues + + = * aSegmentsIter + + ;
aProp . Name = EASGet ( EAS_Segments ) ;
aProp . Value < < = seqSegments ;
rDest . push_back ( aProp ) ;
}
void GetAdjustmentValues ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest , // draw:adjustments
const rtl : : OUString & rValue )
{
2005-03-01 16:59:26 +00:00
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeAdjustmentValue > vAdjustmentValue ;
com : : sun : : star : : drawing : : EnhancedCustomShapeParameter aParameter ;
2004-04-02 12:53:29 +00:00
sal_Int32 nIndex = 0 ;
2004-11-26 13:10:19 +00:00
while ( GetNextParameter ( aParameter , nIndex , rValue ) )
2004-04-02 12:53:29 +00:00
{
2005-03-01 16:59:26 +00:00
com : : sun : : star : : drawing : : EnhancedCustomShapeAdjustmentValue aAdj ;
if ( aParameter . Type = = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : NORMAL )
2004-04-02 12:53:29 +00:00
{
aAdj . Value < < = aParameter . Value ;
aAdj . State = beans : : PropertyState_DIRECT_VALUE ;
}
else
2004-11-26 13:10:19 +00:00
aAdj . State = beans : : PropertyState_DEFAULT_VALUE ; // this should not be, but better than setting nothing
2004-04-02 12:53:29 +00:00
vAdjustmentValue . push_back ( aAdj ) ;
}
sal_Int32 nAdjustmentValues = vAdjustmentValue . size ( ) ;
if ( nAdjustmentValues )
{
2005-03-01 16:59:26 +00:00
uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeAdjustmentValue > aAdjustmentValues ( nAdjustmentValues ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeAdjustmentValue > : : const_iterator aIter = vAdjustmentValue . begin ( ) ;
std : : vector < com : : sun : : star : : drawing : : EnhancedCustomShapeAdjustmentValue > : : const_iterator aEnd = vAdjustmentValue . end ( ) ;
com : : sun : : star : : drawing : : EnhancedCustomShapeAdjustmentValue * pValues = aAdjustmentValues . getArray ( ) ;
2004-04-02 12:53:29 +00:00
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 ;
for ( sal_Int16 nAttr = 0 ; nAttr < nLength ; nAttr + + )
{
rtl : : OUString aLocalName ;
const rtl : : OUString & rValue = xAttrList - > getValueByIndex ( nAttr ) ;
2006-06-19 17:14:18 +00:00
/* sven fixme, this must be checked! sal_uInt16 nPrefix = */ GetImport ( ) . GetNamespaceMap ( ) . GetKeyByAttrName ( xAttrList - > getNameByIndex ( nAttr ) , & aLocalName ) ;
2004-04-02 12:53:29 +00:00
switch ( EASGet ( aLocalName ) )
{
2004-11-26 13:10:19 +00:00
case EAS_type :
GetString ( mrCustomShapeGeometry , rValue , EAS_Type ) ;
2004-04-02 12:53:29 +00:00
break ;
case EAS_mirror_horizontal :
GetBool ( mrCustomShapeGeometry , rValue , EAS_MirroredX ) ;
break ;
case EAS_mirror_vertical :
GetBool ( mrCustomShapeGeometry , rValue , EAS_MirroredY ) ;
break ;
2004-10-12 12:06:26 +00:00
case EAS_viewBox :
2004-04-02 12:53:29 +00:00
{
2004-10-12 12:06:26 +00:00
SdXMLImExViewBox aViewBox ( rValue , GetImport ( ) . GetMM100UnitConverter ( ) ) ;
awt : : Rectangle aRect ( aViewBox . GetX ( ) , aViewBox . GetY ( ) , aViewBox . GetWidth ( ) , aViewBox . GetHeight ( ) ) ;
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_ViewBox ) ;
aProp . Value < < = aRect ;
mrCustomShapeGeometry . push_back ( aProp ) ;
2004-04-02 12:53:29 +00:00
}
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 :
2004-10-12 12:06:26 +00:00
GetBool ( maExtrusion , rValue , EAS_Extrusion ) ;
2004-04-02 12:53:29 +00:00
break ;
case EAS_extrusion_brightness :
GetDoublePercentage ( maExtrusion , rValue , EAS_Brightness ) ;
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_depth :
{
sal_Int32 nIndex = 0 ;
2005-03-01 16:59:26 +00:00
com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair aParameterPair ;
com : : sun : : star : : drawing : : EnhancedCustomShapeParameter & rDepth = aParameterPair . First ;
com : : sun : : star : : drawing : : EnhancedCustomShapeParameter & rFraction = aParameterPair . Second ;
2004-10-12 12:06:26 +00:00
if ( GetNextParameter ( rDepth , nIndex , rValue ) )
{
// try to catch the unit for the depth
MapUnit eSrcUnit ( SvXMLExportHelper : : GetUnitFromString ( rValue , MAP_100TH_MM ) ) ;
rtl : : OUStringBuffer aUnitStr ;
double fFactor = SvXMLExportHelper : : GetConversionFactor ( aUnitStr , MAP_100TH_MM , eSrcUnit ) ;
if ( ( fFactor ! = 1.0 ) & & ( fFactor ! = 0.0 ) )
{
double fDepth ;
if ( rDepth . Value > > = fDepth )
{
fDepth / = fFactor ;
rDepth . Value < < = fDepth ;
}
}
if ( rValue . matchIgnoreAsciiCase ( rtl : : OUString ( aUnitStr ) , nIndex ) )
nIndex + = aUnitStr . getLength ( ) ;
// skipping white spaces
while ( ( nIndex < rValue . getLength ( ) ) & & rValue [ nIndex ] = = ( sal_Unicode ) ' ' )
nIndex + + ;
if ( GetNextParameter ( rFraction , nIndex , rValue ) )
{
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_Depth ) ;
aProp . Value < < = aParameterPair ;
maExtrusion . push_back ( aProp ) ;
}
}
}
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_diffusion :
GetDoublePercentage ( maExtrusion , rValue , EAS_Diffusion ) ;
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_number_of_line_segments :
GetInt32 ( maExtrusion , rValue , EAS_NumberOfLineSegments ) ;
2004-04-02 12:53:29 +00:00
break ;
case EAS_extrusion_light_face :
GetBool ( maExtrusion , rValue , EAS_LightFace ) ;
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_first_light_harsh :
GetBool ( maExtrusion , rValue , EAS_FirstLightHarsh ) ;
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_second_light_harsh :
GetBool ( maExtrusion , rValue , EAS_SecondLightHarsh ) ;
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_first_light_level :
GetDoublePercentage ( maExtrusion , rValue , EAS_FirstLightLevel ) ;
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_second_light_level :
GetDoublePercentage ( maExtrusion , rValue , EAS_SecondLightLevel ) ;
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_first_light_direction :
2006-11-14 13:16:16 +00:00
GetB3DVector ( maExtrusion , rValue , EAS_FirstLightDirection ) ;
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_second_light_direction :
2006-11-14 13:16:16 +00:00
GetB3DVector ( maExtrusion , rValue , EAS_SecondLightDirection ) ;
2004-04-02 12:53:29 +00:00
break ;
case EAS_extrusion_metal :
GetBool ( maExtrusion , rValue , EAS_Metal ) ;
break ;
2004-10-12 12:06:26 +00:00
case EAS_shade_mode :
{
drawing : : ShadeMode eShadeMode ( drawing : : ShadeMode_FLAT ) ;
if ( IsXMLToken ( rValue , XML_PHONG ) )
eShadeMode = drawing : : ShadeMode_PHONG ;
else if ( IsXMLToken ( rValue , XML_GOURAUD ) )
eShadeMode = drawing : : ShadeMode_SMOOTH ;
else if ( IsXMLToken ( rValue , XML_DRAFT ) )
eShadeMode = drawing : : ShadeMode_DRAFT ;
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_ShadeMode ) ;
aProp . Value < < = eShadeMode ;
maExtrusion . push_back ( aProp ) ;
}
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_rotation_angle :
GetEnhancedParameterPair ( maExtrusion , rValue , EAS_RotateAngle ) ;
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_rotation_center :
2006-11-14 13:16:16 +00:00
GetB3DVector ( maExtrusion , rValue , EAS_RotationCenter ) ;
2004-04-02 12:53:29 +00:00
break ;
case EAS_extrusion_shininess :
GetDoublePercentage ( maExtrusion , rValue , EAS_Shininess ) ;
break ;
case EAS_extrusion_skew :
2004-10-12 12:06:26 +00:00
GetEnhancedParameterPair ( maExtrusion , rValue , EAS_Skew ) ;
2004-04-02 12:53:29 +00:00
break ;
case EAS_extrusion_specularity :
GetDoublePercentage ( maExtrusion , rValue , EAS_Specularity ) ;
break ;
2004-10-12 12:06:26 +00:00
case EAS_projection :
{
drawing : : ProjectionMode eProjectionMode ( drawing : : ProjectionMode_PERSPECTIVE ) ;
if ( IsXMLToken ( rValue , XML_PARALLEL ) )
eProjectionMode = drawing : : ProjectionMode_PARALLEL ;
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_ProjectionMode ) ;
aProp . Value < < = eProjectionMode ;
maExtrusion . push_back ( aProp ) ;
}
2004-04-02 12:53:29 +00:00
break ;
case EAS_extrusion_viewpoint :
GetPosition3D ( maExtrusion , rValue , EAS_ViewPoint , mrUnitConverter ) ;
break ;
2004-10-12 12:06:26 +00:00
case EAS_extrusion_origin :
GetEnhancedParameterPair ( maExtrusion , rValue , EAS_Origin ) ;
2004-04-02 12:53:29 +00:00
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 ) )
{
2004-11-26 13:10:19 +00:00
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_StretchX ) ;
aProp . Value < < = nAttrNumber ;
maPath . push_back ( aProp ) ;
2004-04-02 12:53:29 +00:00
}
}
break ;
case EAS_path_stretchpoint_y :
{
if ( SvXMLUnitConverter : : convertNumber ( nAttrNumber , rValue ) )
{
2004-11-26 13:10:19 +00:00
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_StretchY ) ;
aProp . Value < < = nAttrNumber ;
maPath . push_back ( aProp ) ;
2004-04-02 12:53:29 +00:00
}
}
break ;
2004-11-26 13:10:19 +00:00
case EAS_text_areas :
2004-04-02 12:53:29 +00:00
GetEnhancedRectangleSequence ( maPath , rValue , EAS_TextFrames ) ;
break ;
case EAS_glue_points :
2005-04-12 15:52:37 +00:00
{
sal_Int32 i , nPairs = GetEnhancedParameterPairSequence ( maPath , rValue , EAS_GluePoints ) ;
2005-05-13 06:57:13 +00:00
GetImport ( ) . GetShapeImport ( ) - > moveGluePointMapping ( mrxShape , nPairs ) ;
2005-04-12 15:52:37 +00:00
for ( i = 0 ; i < nPairs ; i + + )
GetImport ( ) . GetShapeImport ( ) - > addGluePointMapping ( mrxShape , i + 4 , i + 4 ) ;
}
2004-04-02 12:53:29 +00:00
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 :
2004-10-12 12:06:26 +00:00
GetBool ( maTextPath , rValue , EAS_TextPath ) ;
2004-04-02 12:53:29 +00:00
break ;
2004-10-12 12:06:26 +00:00
case EAS_text_path_mode :
{
2005-03-01 16:59:26 +00:00
com : : sun : : star : : drawing : : EnhancedCustomShapeTextPathMode eTextPathMode ( com : : sun : : star : : drawing : : EnhancedCustomShapeTextPathMode_NORMAL ) ;
2004-10-12 12:06:26 +00:00
if ( IsXMLToken ( rValue , XML_PATH ) )
2005-03-01 16:59:26 +00:00
eTextPathMode = com : : sun : : star : : drawing : : EnhancedCustomShapeTextPathMode_PATH ;
2004-10-12 12:06:26 +00:00
else if ( IsXMLToken ( rValue , XML_SHAPE ) )
2005-03-01 16:59:26 +00:00
eTextPathMode = com : : sun : : star : : drawing : : EnhancedCustomShapeTextPathMode_SHAPE ;
2004-10-12 12:06:26 +00:00
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_TextPathMode ) ;
aProp . Value < < = eTextPathMode ;
maTextPath . push_back ( aProp ) ;
}
2004-04-02 12:53:29 +00:00
break ;
2005-02-21 15:04:23 +00:00
case EAS_text_path_scale :
{
sal_Bool bScaleX = IsXMLToken ( rValue , XML_SHAPE ) ;
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_ScaleX ) ;
aProp . Value < < = bScaleX ;
maTextPath . push_back ( aProp ) ;
}
2004-04-02 12:53:29 +00:00
break ;
case EAS_text_path_same_letter_heights :
GetBool ( maTextPath , rValue , EAS_SameLetterHeights ) ;
break ;
2004-11-26 13:10:19 +00:00
case EAS_modifiers :
2004-04-02 12:53:29 +00:00
GetAdjustmentValues ( mrCustomShapeGeometry , rValue ) ;
break ;
2006-06-19 17:14:18 +00:00
default :
break ;
2004-04-02 12:53:29 +00:00
}
}
}
}
void SdXMLCustomShapePropertyMerge ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rPropVec ,
const std : : vector < beans : : PropertyValues > & rElement ,
const rtl : : OUString & rElementName )
{
2009-04-23 10:42:05 +00:00
if ( ! rElement . empty ( ) )
2004-04-02 12:53:29 +00:00
{
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 ,
2004-11-26 13:10:19 +00:00
const std : : vector < rtl : : OUString > & rElement ,
2004-04-02 12:53:29 +00:00
const rtl : : OUString & rElementName )
{
2009-04-23 10:42:05 +00:00
if ( ! rElement . empty ( ) )
2004-04-02 12:53:29 +00:00
{
2004-11-26 13:10:19 +00:00
uno : : Sequence < rtl : : OUString > aPropSeq ( rElement . size ( ) ) ;
std : : vector < rtl : : OUString > : : const_iterator aIter = rElement . begin ( ) ;
std : : vector < rtl : : OUString > : : const_iterator aEnd = rElement . end ( ) ;
rtl : : OUString * pValues = aPropSeq . getArray ( ) ;
2004-04-02 12:53:29 +00:00
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 )
{
2009-04-23 10:42:05 +00:00
if ( ! rElement . empty ( ) )
2004-04-02 12:53:29 +00:00
{
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 ) ;
}
}
2004-11-26 13:10:19 +00:00
typedef std : : hash_map < rtl : : OUString , sal_Int32 , rtl : : OUStringHash , OUStringEqFunc > EquationHashMap ;
/* if rPara.Type is from type EnhancedCustomShapeParameterType::EQUATION, the name of the equation
will be converted from rtl : : OUString to index */
2005-03-01 16:59:26 +00:00
void CheckAndResolveEquationParameter ( com : : sun : : star : : drawing : : EnhancedCustomShapeParameter & rPara , EquationHashMap * pH )
2004-11-26 13:10:19 +00:00
{
2005-03-01 16:59:26 +00:00
if ( rPara . Type = = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : EQUATION )
2004-11-26 13:10:19 +00:00
{
rtl : : OUString aEquationName ;
if ( rPara . Value > > = aEquationName )
{
sal_Int32 nIndex = 0 ;
EquationHashMap : : iterator aHashIter ( pH - > find ( aEquationName ) ) ;
if ( aHashIter ! = pH - > end ( ) )
nIndex = ( * aHashIter ) . second ;
rPara . Value < < = nIndex ;
}
}
}
2004-04-02 12:53:29 +00:00
void XMLEnhancedCustomShapeContext : : EndElement ( )
{
2004-11-26 13:10:19 +00:00
// resolve properties that are indexing a Equation
2009-04-23 10:42:05 +00:00
if ( ! maEquations . empty ( ) )
2004-11-26 13:10:19 +00:00
{
// creating hash map containing the name and index of each equation
EquationHashMap * pH = new EquationHashMap ;
std : : vector < rtl : : OUString > : : iterator aEquationNameIter = maEquationNames . begin ( ) ;
std : : vector < rtl : : OUString > : : iterator aEquationNameEnd = maEquationNames . end ( ) ;
while ( aEquationNameIter ! = aEquationNameEnd )
{
( * pH ) [ * aEquationNameIter ] = ( sal_Int32 ) ( aEquationNameIter - maEquationNames . begin ( ) ) ;
aEquationNameIter + + ;
}
// resolve equation
std : : vector < rtl : : OUString > : : iterator aEquationIter = maEquations . begin ( ) ;
std : : vector < rtl : : OUString > : : iterator aEquationEnd = maEquations . end ( ) ;
while ( aEquationIter ! = aEquationEnd )
{
sal_Int32 nIndexOf = 0 ;
do
{
nIndexOf = aEquationIter - > indexOf ( ' ? ' , nIndexOf ) ;
if ( nIndexOf ! = - 1 )
{
rtl : : OUString aEquationName ;
if ( GetEquationName ( * aEquationIter , nIndexOf + 1 , aEquationName ) )
{
// copying first characters inclusive '?'
rtl : : OUString aNew ( aEquationIter - > copy ( 0 , nIndexOf + 1 ) ) ;
sal_Int32 nIndex = 0 ;
EquationHashMap : : iterator aHashIter ( pH - > find ( aEquationName ) ) ;
if ( aHashIter ! = pH - > end ( ) )
nIndex = ( * aHashIter ) . second ;
aNew + = rtl : : OUString : : valueOf ( nIndex ) ;
aNew + = aEquationIter - > copy ( nIndexOf + aEquationName . getLength ( ) + 1 ) ;
* aEquationIter = aNew ;
}
nIndexOf + + ;
}
}
while ( nIndexOf ! = - 1 ) ;
aEquationIter + + ;
}
// Path
sal_Int32 i ;
std : : vector < beans : : PropertyValue > : : iterator aPathIter = maPath . begin ( ) ;
std : : vector < beans : : PropertyValue > : : iterator aPathEnd = maPath . end ( ) ;
while ( aPathIter ! = aPathEnd )
{
switch ( EASGet ( aPathIter - > Name ) )
{
case EAS_Coordinates :
case EAS_GluePoints :
{
2005-03-01 16:59:26 +00:00
uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > & rSeq =
* ( ( uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair > * )
2004-11-26 13:10:19 +00:00
aPathIter - > Value . getValue ( ) ) ;
for ( i = 0 ; i < rSeq . getLength ( ) ; i + + )
{
CheckAndResolveEquationParameter ( rSeq [ i ] . First , pH ) ;
CheckAndResolveEquationParameter ( rSeq [ i ] . Second , pH ) ;
}
}
break ;
case EAS_TextFrames :
{
2005-03-01 16:59:26 +00:00
uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeTextFrame > & rSeq =
* ( ( uno : : Sequence < com : : sun : : star : : drawing : : EnhancedCustomShapeTextFrame > * )
2004-11-26 13:10:19 +00:00
aPathIter - > Value . getValue ( ) ) ;
for ( i = 0 ; i < rSeq . getLength ( ) ; i + + )
{
CheckAndResolveEquationParameter ( rSeq [ i ] . TopLeft . First , pH ) ;
CheckAndResolveEquationParameter ( rSeq [ i ] . TopLeft . Second , pH ) ;
CheckAndResolveEquationParameter ( rSeq [ i ] . BottomRight . First , pH ) ;
CheckAndResolveEquationParameter ( rSeq [ i ] . BottomRight . Second , pH ) ;
}
}
break ;
2006-06-19 17:14:18 +00:00
default :
break ;
2004-11-26 13:10:19 +00:00
}
aPathIter + + ;
}
std : : vector < beans : : PropertyValues > : : iterator aHandleIter = maHandles . begin ( ) ;
std : : vector < beans : : PropertyValues > : : iterator aHandleEnd = maHandles . end ( ) ;
while ( aHandleIter ! = aHandleEnd )
{
beans : : PropertyValue * pValues = aHandleIter - > getArray ( ) ;
for ( i = 0 ; i < aHandleIter - > getLength ( ) ; i + + )
{
switch ( EASGet ( pValues - > Name ) )
{
case EAS_Position :
case EAS_RangeYMinimum :
case EAS_RangeYMaximum :
case EAS_RangeXMinimum :
case EAS_RangeXMaximum :
case EAS_RadiusRangeMinimum :
case EAS_RadiusRangeMaximum :
{
2005-03-01 16:59:26 +00:00
CheckAndResolveEquationParameter ( * ( ( com : : sun : : star : : drawing : : EnhancedCustomShapeParameter * )
2004-11-26 13:10:19 +00:00
pValues - > Value . getValue ( ) ) , pH ) ;
}
break ;
case EAS_Polar :
{
2005-03-01 16:59:26 +00:00
CheckAndResolveEquationParameter ( ( * ( ( com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair * )
2004-11-26 13:10:19 +00:00
pValues - > Value . getValue ( ) ) ) . First , pH ) ;
2005-03-01 16:59:26 +00:00
CheckAndResolveEquationParameter ( ( * ( ( com : : sun : : star : : drawing : : EnhancedCustomShapeParameterPair * )
2004-11-26 13:10:19 +00:00
pValues - > Value . getValue ( ) ) ) . Second , pH ) ;
}
break ;
2006-06-19 17:14:18 +00:00
default :
break ;
2004-11-26 13:10:19 +00:00
}
pValues + + ;
}
aHandleIter + + ;
}
delete pH ;
}
2004-04-02 12:53:29 +00:00
SdXMLCustomShapePropertyMerge ( mrCustomShapeGeometry , maExtrusion , EASGet ( EAS_Extrusion ) ) ;
SdXMLCustomShapePropertyMerge ( mrCustomShapeGeometry , maPath , EASGet ( EAS_Path ) ) ;
SdXMLCustomShapePropertyMerge ( mrCustomShapeGeometry , maTextPath , EASGet ( EAS_TextPath ) ) ;
SdXMLCustomShapePropertyMerge ( mrCustomShapeGeometry , maEquations , EASGet ( EAS_Equations ) ) ;
2009-04-23 10:42:05 +00:00
if ( ! maHandles . empty ( ) )
2004-04-02 12:53:29 +00:00
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 )
{
2004-11-26 13:10:19 +00:00
rtl : : OUString aFormula ;
rtl : : OUString aFormulaName ;
2004-04-02 12:53:29 +00:00
for ( sal_Int16 nAttr = 0 ; nAttr < nLength ; nAttr + + )
{
rtl : : OUString aLocalName ;
const rtl : : OUString & rValue = xAttrList - > getValueByIndex ( nAttr ) ;
2006-06-19 17:14:18 +00:00
/* fixme sven, this needs to be chekced! sal_uInt16 nPrefix = */ GetImport ( ) . GetNamespaceMap ( ) . GetKeyByAttrName ( xAttrList - > getNameByIndex ( nAttr ) , & aLocalName ) ;
2004-11-26 13:10:19 +00:00
switch ( EASGet ( aLocalName ) )
{
case EAS_formula :
aFormula = rValue ;
break ;
case EAS_name :
aFormulaName = rValue ;
break ;
2006-06-19 17:14:18 +00:00
default :
break ;
2004-11-26 13:10:19 +00:00
}
}
if ( aFormulaName . getLength ( ) | | aFormula . getLength ( ) )
{
maEquations . push_back ( aFormula ) ;
maEquationNames . push_back ( aFormulaName ) ;
2004-04-02 12:53:29 +00:00
}
}
}
else if ( aTokenEnum = = EAS_handle )
{
std : : vector < com : : sun : : star : : beans : : PropertyValue > aHandle ;
2009-04-23 10:42:05 +00:00
const sal_Int16 nLength = xAttrList - > getLength ( ) ;
for ( sal_Int16 nAttr = 0 ; nAttr < nLength ; nAttr + + )
2004-04-02 12:53:29 +00:00
{
rtl : : OUString aLocalName ;
const rtl : : OUString & rValue = xAttrList - > getValueByIndex ( nAttr ) ;
2006-06-19 17:14:18 +00:00
/* fixme sven, this needs to be chekced! sal_uInt16 nPrefix = */ GetImport ( ) . GetNamespaceMap ( ) . GetKeyByAttrName ( xAttrList - > getNameByIndex ( nAttr ) , & aLocalName ) ;
2004-04-02 12:53:29 +00:00
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 ;
2006-06-19 17:14:18 +00:00
default :
break ;
2004-04-02 12:53:29 +00:00
}
}
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 ) ;
}