2010-10-12 15:53:47 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2012-11-12 17:21:24 +00:00
/*
* This file is part of the LibreOffice project .
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2.0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice :
*
* Licensed to the Apache Software Foundation ( ASF ) under one or more
* contributor license agreements . See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership . The ASF licenses this file to you under the Apache
* License , Version 2.0 ( 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.apache.org/licenses/LICENSE-2.0 .
*/
2004-04-02 12:53:29 +00:00
# include "ximpcustomshape.hxx"
# include "ximpshap.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>
2013-11-11 22:30:35 -06:00
# include <xmloff/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"
2013-11-11 22:30:35 -06:00
# include <xmloff/xmlerror.hxx>
2004-04-02 12:53:29 +00:00
# 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>
2014-03-19 14:51:18 +00:00
# include <com/sun/star/drawing/HomogenMatrix3.hpp>
2011-02-05 13:18:52 +01:00
# include <boost/unordered_map.hpp>
2014-03-19 14:51:18 +00:00
# include <basegfx/vector/b2dvector.hxx>
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
# include <sax/tools/converter.hxx>
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 ,
2013-04-07 12:06:47 +02:00
sal_uInt16 nPrefix , const OUString & rLocalName ,
2005-04-12 15:52:37 +00:00
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 ,
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
2010-10-04 15:36:52 +01:00
bool bAttrBool ;
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
if ( : : sax : : Converter : : convertBool ( bAttrBool , rValue ) )
2004-04-02 12:53:29 +00:00
{
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( eDestProp ) ;
aProp . Value < < = bAttrBool ;
rDest . push_back ( aProp ) ;
}
}
void GetInt32 ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest ,
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
sal_Int32 nAttrNumber ;
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
if ( : : sax : : Converter : : convertNumber ( nAttrNumber , rValue ) )
2004-04-02 12:53:29 +00:00
{
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( eDestProp ) ;
aProp . Value < < = nAttrNumber ;
rDest . push_back ( aProp ) ;
}
}
void GetDouble ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest ,
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
double fAttrDouble ;
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
if ( : : sax : : Converter : : convertDouble ( fAttrDouble , rValue ) )
2004-04-02 12:53:29 +00:00
{
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( eDestProp ) ;
aProp . Value < < = fAttrDouble ;
rDest . push_back ( aProp ) ;
}
}
void GetString ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest ,
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( eDestProp ) ;
aProp . Value < < = rValue ;
rDest . push_back ( aProp ) ;
}
void GetEnum ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest ,
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp ,
2004-04-02 12:53:29 +00:00
const SvXMLEnumMapEntry & rMap )
{
2010-11-10 13:50:33 +08:00
sal_uInt16 eKind ;
2004-04-02 12:53:29 +00:00
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 ,
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
sal_Int16 const eSrcUnit = : : sax : : Converter : : GetUnitFromString (
rValue , util : : MeasureUnit : : MM_100TH ) ;
if ( util : : MeasureUnit : : PERCENT = = eSrcUnit )
2004-04-02 12:53:29 +00:00
{
rtl_math_ConversionStatus eStatus ;
double fAttrDouble = : : rtl : : math : : stringToDouble ( rValue ,
2013-11-13 12:10:31 +02:00
' . ' , ' , ' , & eStatus , NULL ) ;
2004-04-02 12:53:29 +00:00
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 ,
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
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 ) ;
}
}
2014-04-07 16:42:18 +02:00
bool GetEquationName ( const OUString & rEquation , const sal_Int32 nStart , OUString & rEquationName )
2004-11-26 13:10:19 +00:00
{
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 ;
}
2014-04-07 16:42:18 +02:00
bool bValid = ( nIndex - nStart ) ! = 0 ;
2004-11-26 13:10:19 +00:00
if ( bValid )
rEquationName = rEquation . copy ( nStart , nIndex - nStart ) ;
return bValid ;
}
2014-04-07 16:42:18 +02:00
bool GetNextParameter ( com : : sun : : star : : drawing : : EnhancedCustomShapeParameter & rParameter , sal_Int32 & nIndex , const OUString & rParaString )
2004-04-02 12:53:29 +00:00
{
if ( nIndex > = rParaString . getLength ( ) )
2014-04-07 16:42:18 +02:00
return false ;
2004-04-02 12:53:29 +00:00
2014-04-07 16:42:18 +02:00
bool bValid = true ;
bool bNumberRequired = true ;
bool bMustBePositiveWholeNumbered = false ;
2004-04-02 12:53:29 +00:00
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : NORMAL ;
2013-11-13 12:10:31 +02:00
if ( rParaString [ nIndex ] = = ' $ ' )
2004-04-02 12:53:29 +00:00
{
2005-03-01 16:59:26 +00:00
rParameter . Type = com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : ADJUSTMENT ;
2014-04-07 16:42:18 +02:00
bMustBePositiveWholeNumbered = true ;
2004-04-02 12:53:29 +00:00
nIndex + + ;
}
2013-11-13 12:10:31 +02:00
else if ( rParaString [ nIndex ] = = ' ? ' )
2004-04-02 12:53:29 +00:00
{
nIndex + + ;
2014-04-07 16:42:18 +02:00
bNumberRequired = false ;
2013-04-07 12:06:47 +02:00
OUString aEquationName ;
2004-11-26 13:10:19 +00:00
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
}
2013-11-13 12:10:31 +02:00
else if ( rParaString [ nIndex ] > ' 9 ' )
2004-04-02 12:53:29 +00:00
{
2014-04-07 16:42:18 +02:00
bNumberRequired = false ;
2004-04-02 12:53:29 +00:00
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
2014-04-07 16:42:18 +02:00
bValid = false ;
2004-04-02 12:53:29 +00:00
}
if ( bValid )
{
if ( bNumberRequired )
{
sal_Int32 nStartIndex = nIndex ;
2011-01-25 13:20:00 +01:00
sal_Int32 nEIndex = 0 ; // index of "E" in double
2004-04-02 12:53:29 +00:00
2014-04-07 16:42:18 +02:00
bool bE = false ; // set if a double is including a "E" statement
bool bENum = false ; // there is at least one number after "E"
bool bDot = false ; // set if there is a dot included
bool bEnd = false ; // set for each value that can not be part of a double/integer
2004-04-02 12:53:29 +00:00
while ( ( nIndex < rParaString . getLength ( ) ) & & bValid )
{
switch ( rParaString [ nIndex ] )
{
case ' . ' :
{
if ( bMustBePositiveWholeNumbered )
2014-04-07 16:42:18 +02:00
bValid = false ;
2004-04-02 12:53:29 +00:00
else
{
if ( bDot )
2014-04-07 16:42:18 +02:00
bValid = false ;
2004-04-02 12:53:29 +00:00
else
2014-04-07 16:42:18 +02:00
bDot = true ;
2004-04-02 12:53:29 +00:00
}
}
break ;
case ' - ' :
{
if ( bMustBePositiveWholeNumbered )
2014-04-07 16:42:18 +02:00
bValid = false ;
2004-04-02 12:53:29 +00:00
else
2011-01-25 14:45:21 +01:00
{
if ( nStartIndex = = nIndex )
2014-04-07 16:42:18 +02:00
bValid = true ;
2011-01-25 14:45:21 +01:00
else if ( bE )
{
if ( nEIndex + 1 = = nIndex )
2014-04-07 16:42:18 +02:00
bValid = true ;
2011-01-25 14:45:21 +01:00
else if ( bENum )
2014-04-07 16:42:18 +02:00
bEnd = true ;
2011-01-25 14:45:21 +01:00
else
2014-04-07 16:42:18 +02:00
bValid = false ;
2011-01-25 14:45:21 +01:00
}
}
2004-04-02 12:53:29 +00:00
}
break ;
case ' e ' :
case ' E ' :
{
if ( bMustBePositiveWholeNumbered )
2014-04-07 16:42:18 +02:00
bEnd = true ;
2004-04-02 12:53:29 +00:00
else
{
if ( ! bE )
2011-01-25 13:20:00 +01:00
{
2014-04-07 16:42:18 +02:00
bE = true ;
2011-01-25 13:20:00 +01:00
nEIndex = nIndex ;
}
2004-04-02 12:53:29 +00:00
else
2014-04-07 16:42:18 +02:00
bEnd = true ;
2004-04-02 12:53:29 +00:00
}
}
break ;
case ' 0 ' :
case ' 1 ' :
case ' 2 ' :
case ' 3 ' :
case ' 4 ' :
case ' 5 ' :
case ' 6 ' :
case ' 7 ' :
case ' 8 ' :
case ' 9 ' :
2011-01-25 14:45:21 +01:00
{
if ( bE & & ! bENum )
2014-04-07 16:42:18 +02:00
bENum = true ;
2011-01-25 14:45:21 +01:00
}
2004-04-02 12:53:29 +00:00
break ;
default :
2014-04-07 16:42:18 +02:00
bEnd = true ;
2004-04-02 12:53:29 +00:00
}
if ( ! bEnd )
nIndex + + ;
else
break ;
}
if ( nIndex = = nStartIndex )
2014-04-07 16:42:18 +02:00
bValid = false ;
2004-04-02 12:53:29 +00:00
if ( bValid )
{
2013-04-07 12:06:47 +02:00
OUString aNumber ( rParaString . copy ( nStartIndex , nIndex - nStartIndex ) ) ;
2004-04-02 12:53:29 +00:00
if ( bE | | bDot )
{
double fAttrDouble ;
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
if ( : : sax : : Converter : : convertDouble ( fAttrDouble , aNumber ) )
2004-04-02 12:53:29 +00:00
rParameter . Value < < = fAttrDouble ;
else
2014-04-07 16:42:18 +02:00
bValid = false ;
2004-04-02 12:53:29 +00:00
}
else
{
sal_Int32 nValue ;
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
if ( : : sax : : Converter : : convertNumber ( nValue , aNumber ) )
2004-04-02 12:53:29 +00:00
rParameter . Value < < = nValue ;
else
2014-04-07 16:42:18 +02:00
bValid = false ;
2004-04-02 12:53:29 +00:00
}
}
}
}
if ( bValid )
2013-05-29 13:10:27 +00:00
{
// skipping white spaces and commas (#i121507#)
2013-11-13 12:10:31 +02:00
const sal_Unicode aSpace ( ' ' ) ;
const sal_Unicode aCommata ( ' , ' ) ;
2013-05-29 13:10:27 +00:00
while ( nIndex < rParaString . getLength ( ) )
{
const sal_Unicode aCandidate ( rParaString [ nIndex ] ) ;
if ( aSpace = = aCandidate | | aCommata = = aCandidate )
{
nIndex + + ;
}
else
{
break ;
}
}
2004-04-02 12:53:29 +00:00
}
return bValid ;
}
void GetPosition3D ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest , // e.g. draw:extrusion-viewpoint
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp ,
2004-04-02 12:53:29 +00:00
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
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
std : : vector < double > vDirection ;
sal_Int32 nIndex = 0 ;
do
{
double fAttrDouble ;
2013-04-07 12:06:47 +02:00
OUString aToken ( rValue . getToken ( 0 , ' , ' , nIndex ) ) ;
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
if ( ! : : sax : : Converter : : convertDouble ( fAttrDouble , aToken ) )
2004-04-02 12:53:29 +00:00
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 ) ;
}
}
2013-01-31 12:05:50 +01:00
void GetSizeSequence ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest ,
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2013-01-31 12:05:50 +01:00
{
std : : vector < sal_Int32 > vNum ;
sal_Int32 nIndex = 0 ;
do
{
sal_Int32 n ;
2013-04-07 12:06:47 +02:00
OUString aToken ( rValue . getToken ( 0 , ' ' , nIndex ) ) ;
2013-01-31 12:05:50 +01:00
if ( ! : : sax : : Converter : : convertNumber ( n , aToken ) )
break ;
else
vNum . push_back ( n ) ;
}
while ( nIndex > = 0 ) ;
if ( ! vNum . empty ( ) )
{
uno : : Sequence < awt : : Size > aSizeSeq ( vNum . size ( ) / 2 ) ;
std : : vector < sal_Int32 > : : const_iterator aIter = vNum . begin ( ) ;
std : : vector < sal_Int32 > : : const_iterator aEnd = vNum . end ( ) ;
awt : : Size * pValues = aSizeSeq . getArray ( ) ;
while ( aIter ! = aEnd ) {
pValues - > Width = * aIter + + ;
if ( aIter ! = aEnd )
pValues - > Height = * aIter + + ;
pValues + + ;
}
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( eDestProp ) ;
aProp . Value < < = aSizeSeq ;
rDest . push_back ( aProp ) ;
}
}
2004-04-02 12:53:29 +00:00
void GetEnhancedParameter ( std : : vector < com : : sun : : star : : beans : : PropertyValue > & rDest , // e.g. draw:handle-position
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
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
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
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
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
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
2013-04-07 12:06:47 +02:00
const OUString & rValue , const EnhancedCustomShapeTokenEnum eDestProp )
2004-04-02 12:53:29 +00:00
{
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
2013-04-07 12:06:47 +02:00
const OUString & rValue )
2004-04-02 12:53:29 +00:00
{
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
2014-04-07 16:42:18 +02:00
bool bValid = true ;
2004-04-02 12:53:29 +00:00
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 ;
2012-07-19 11:06:50 +02:00
case ' G ' :
{
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ARCANGLETO ;
nParametersNeeded = 2 ;
nIndex + + ;
}
break ;
2013-02-01 12:25:23 +01:00
case ' H ' :
{
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : DARKEN ;
nParametersNeeded = 0 ;
nIndex + + ;
}
break ;
case ' I ' :
{
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : DARKENLESS ;
nParametersNeeded = 0 ;
nIndex + + ;
}
break ;
case ' J ' :
{
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : LIGHTEN ;
nParametersNeeded = 0 ;
nIndex + + ;
}
break ;
case ' K ' :
{
nLatestSegmentCommand = com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : LIGHTENLESS ;
nParametersNeeded = 0 ;
nIndex + + ;
}
break ;
2004-04-02 12:53:29 +00:00
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
2014-04-07 16:42:18 +02:00
bValid = false ;
2004-04-02 12:53:29 +00:00
}
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
2013-04-07 12:06:47 +02:00
const OUString & rValue )
2004-04-02 12:53:29 +00:00
{
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 + + )
{
2013-04-07 12:06:47 +02:00
OUString aLocalName ;
const 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 ( ) ) ;
2014-03-19 14:51:18 +00:00
awt : : Rectangle aRect (
basegfx : : fround ( aViewBox . GetX ( ) ) ,
basegfx : : fround ( aViewBox . GetY ( ) ) ,
basegfx : : fround ( aViewBox . GetWidth ( ) ) ,
basegfx : : fround ( aViewBox . GetHeight ( ) ) ) ;
if ( 0 = = aRect . Width & & 0 = = aRect . Height )
{
// #i124452# If in svg:viewBox no width and height is given the objects should normally
// not be visible at all, but in this case it is a bug in LO to write empty svg:viewBox
// entries for CustomShapes. To allow for a better ODF user experience, just correct this
// here by getting the real object scale from the already set transformation from the xShape.
// Hopefully LO will fix that bug (but this will still leave the files with the error), but
2014-04-11 08:41:24 +02:00
// even when not this will do no harm as long no one uses this state explicitely for some
2014-03-19 14:51:18 +00:00
// purpose (e.g. to really have CustomShapes without content, but unlikely).
uno : : Reference < beans : : XPropertySet > xProps ( mrxShape , uno : : UNO_QUERY_THROW ) ;
uno : : Any aObjectTransform = xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Transformation " ) ) ) ;
drawing : : HomogenMatrix3 aTransformMatrix ;
aObjectTransform > > = aTransformMatrix ;
basegfx : : B2DHomMatrix aMatrix ;
aMatrix . set ( 0 , 0 , aTransformMatrix . Line1 . Column1 ) ;
aMatrix . set ( 0 , 1 , aTransformMatrix . Line1 . Column2 ) ;
aMatrix . set ( 0 , 2 , aTransformMatrix . Line1 . Column3 ) ;
aMatrix . set ( 1 , 0 , aTransformMatrix . Line2 . Column1 ) ;
aMatrix . set ( 1 , 1 , aTransformMatrix . Line2 . Column2 ) ;
aMatrix . set ( 1 , 2 , aTransformMatrix . Line2 . Column3 ) ;
aMatrix . set ( 2 , 0 , aTransformMatrix . Line3 . Column1 ) ;
aMatrix . set ( 2 , 1 , aTransformMatrix . Line3 . Column2 ) ;
aMatrix . set ( 2 , 2 , aTransformMatrix . Line3 . Column3 ) ;
basegfx : : B2DVector aScale , aTranslate ;
double fRotate , fShearX ;
aMatrix . decompose ( aScale , aTranslate , fRotate , fShearX ) ;
aRect . Width = basegfx : : fround ( fabs ( aScale . getX ( ) ) ) ;
aRect . Height = basegfx : : fround ( fabs ( aScale . getY ( ) ) ) ;
}
2004-10-12 12:06:26 +00:00
beans : : PropertyValue aProp ;
aProp . Name = EASGet ( EAS_ViewBox ) ;
aProp . Value < < = aRect ;
mrCustomShapeGeometry . push_back ( aProp ) ;
2004-04-02 12:53:29 +00:00
}
break ;
2013-01-31 12:05:50 +01:00
case EAS_sub_view_size :
GetSizeSequence ( maPath , rValue , EAS_SubViewSize ) ;
break ;
2004-04-02 12:53:29 +00:00
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
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
sal_Int16 const eSrcUnit (
: : sax : : Converter : : GetUnitFromString (
rValue , util : : MeasureUnit : : MM_100TH ) ) ;
2004-10-12 12:06:26 +00:00
2013-04-07 12:06:47 +02:00
OUStringBuffer aUnitStr ;
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
double fFactor = : : sax : : Converter : : GetConversionFactor (
aUnitStr , util : : MeasureUnit : : MM_100TH , eSrcUnit ) ;
2004-10-12 12:06:26 +00:00
if ( ( fFactor ! = 1.0 ) & & ( fFactor ! = 0.0 ) )
{
2010-12-11 15:41:46 +00:00
double fDepth ( 0.0 ) ;
2004-10-12 12:06:26 +00:00
if ( rDepth . Value > > = fDepth )
{
fDepth / = fFactor ;
rDepth . Value < < = fDepth ;
}
}
2011-09-27 20:21:15 +02:00
if ( rValue . matchIgnoreAsciiCase ( aUnitStr . toString ( ) , nIndex ) )
2004-10-12 12:06:26 +00:00
nIndex + = aUnitStr . getLength ( ) ;
// skipping white spaces
2013-11-13 12:10:31 +02:00
while ( ( nIndex < rValue . getLength ( ) ) & & rValue [ nIndex ] = = ' ' )
2004-10-12 12:06:26 +00:00
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 :
{
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
if ( : : sax : : Converter : : convertNumber ( nAttrNumber , rValue ) )
2004-04-02 12:53:29 +00:00
{
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 :
{
#i108468#: clean up xmluconv code duplication, part 1:
move convertNumber64 from SvXMLUnitConverter to sax::converter.
remove duplicate methods from SvXMLUnitConverter:
convertBool, convertPercent, convertColor, convertNumber, convertDouble,
indexOfComma, encodeBase64, decodeBase64, decodeBase64SomeChars,
clearUndefinedChars
2011-10-11 14:19:00 +02:00
if ( : : sax : : Converter : : convertNumber ( nAttrNumber , rValue ) )
2004-04-02 12:53:29 +00:00
{
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 :
{
2014-04-07 16:42:18 +02:00
bool bScaleX = IsXMLToken ( rValue , XML_SHAPE ) ;
2005-02-21 15:04:23 +00:00
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 ,
2013-04-07 12:06:47 +02:00
const OUString & rElementName )
2004-04-02 12:53:29 +00:00
{
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 ,
2013-04-07 12:06:47 +02:00
const std : : vector < OUString > & rElement ,
const OUString & rElementName )
2004-04-02 12:53:29 +00:00
{
2009-04-23 10:42:05 +00:00
if ( ! rElement . empty ( ) )
2004-04-02 12:53:29 +00:00
{
2013-04-07 12:06:47 +02:00
uno : : Sequence < OUString > aPropSeq ( rElement . size ( ) ) ;
std : : vector < OUString > : : const_iterator aIter = rElement . begin ( ) ;
std : : vector < OUString > : : const_iterator aEnd = rElement . end ( ) ;
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 ,
2013-04-07 12:06:47 +02:00
const OUString & rElementName )
2004-04-02 12:53:29 +00:00
{
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 ) ;
}
}
2013-04-07 12:06:47 +02:00
typedef boost : : unordered_map < OUString , sal_Int32 , OUStringHash , OUStringEqFunc > EquationHashMap ;
2004-11-26 13:10:19 +00:00
/* if rPara.Type is from type EnhancedCustomShapeParameterType::EQUATION, the name of the equation
2013-04-07 12:06:47 +02:00
will be converted from 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
{
2013-04-07 12:06:47 +02:00
OUString aEquationName ;
2004-11-26 13:10:19 +00:00
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 ;
2013-04-07 12:06:47 +02:00
std : : vector < OUString > : : iterator aEquationNameIter = maEquationNames . begin ( ) ;
std : : vector < OUString > : : iterator aEquationNameEnd = maEquationNames . end ( ) ;
2004-11-26 13:10:19 +00:00
while ( aEquationNameIter ! = aEquationNameEnd )
{
( * pH ) [ * aEquationNameIter ] = ( sal_Int32 ) ( aEquationNameIter - maEquationNames . begin ( ) ) ;
2010-12-30 20:59:06 +00:00
+ + aEquationNameIter ;
2004-11-26 13:10:19 +00:00
}
// resolve equation
2013-04-07 12:06:47 +02:00
std : : vector < OUString > : : iterator aEquationIter = maEquations . begin ( ) ;
std : : vector < OUString > : : iterator aEquationEnd = maEquations . end ( ) ;
2004-11-26 13:10:19 +00:00
while ( aEquationIter ! = aEquationEnd )
{
sal_Int32 nIndexOf = 0 ;
do
{
nIndexOf = aEquationIter - > indexOf ( ' ? ' , nIndexOf ) ;
if ( nIndexOf ! = - 1 )
{
2013-04-07 12:06:47 +02:00
OUString aEquationName ;
2004-11-26 13:10:19 +00:00
if ( GetEquationName ( * aEquationIter , nIndexOf + 1 , aEquationName ) )
{
// copying first characters inclusive '?'
2013-04-07 12:06:47 +02:00
OUString aNew ( aEquationIter - > copy ( 0 , nIndexOf + 1 ) ) ;
2004-11-26 13:10:19 +00:00
sal_Int32 nIndex = 0 ;
EquationHashMap : : iterator aHashIter ( pH - > find ( aEquationName ) ) ;
if ( aHashIter ! = pH - > end ( ) )
nIndex = ( * aHashIter ) . second ;
2013-08-21 15:07:31 +02:00
aNew + = OUString : : number ( nIndex ) ;
2004-11-26 13:10:19 +00:00
aNew + = aEquationIter - > copy ( nIndexOf + aEquationName . getLength ( ) + 1 ) ;
* aEquationIter = aNew ;
}
nIndexOf + + ;
}
}
while ( nIndexOf ! = - 1 ) ;
2010-12-30 20:59:06 +00:00
+ + aEquationIter ;
2004-11-26 13:10:19 +00:00
}
// 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
}
2010-12-30 20:59:06 +00:00
+ + aPathIter ;
2004-11-26 13:10:19 +00:00
}
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_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 ;
2010-09-02 18:37:30 +02:00
case EAS_Position :
2004-11-26 13:10:19 +00:00
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 + + ;
}
2010-12-30 20:59:06 +00:00
+ + aHandleIter ;
2004-11-26 13:10:19 +00:00
}
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 ) ) ;
}
2013-04-07 12:06:47 +02:00
SvXMLImportContext * XMLEnhancedCustomShapeContext : : CreateChildContext ( sal_uInt16 nPrefix , const OUString & rLocalName ,
2004-04-02 12:53:29 +00:00
const uno : : Reference < xml : : sax : : XAttributeList > & xAttrList )
{
EnhancedCustomShapeTokenEnum aTokenEnum = EASGet ( rLocalName ) ;
if ( aTokenEnum = = EAS_equation )
{
sal_Int16 nLength = xAttrList - > getLength ( ) ;
if ( nLength )
{
2013-04-07 12:06:47 +02:00
OUString aFormula ;
OUString aFormulaName ;
2004-04-02 12:53:29 +00:00
for ( sal_Int16 nAttr = 0 ; nAttr < nLength ; nAttr + + )
{
2013-04-07 12:06:47 +02:00
OUString aLocalName ;
const 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
}
}
2012-01-25 17:00:07 -02:00
if ( ! aFormulaName . isEmpty ( ) | | ! aFormula . isEmpty ( ) )
2004-11-26 13:10:19 +00:00
{
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
{
2013-04-07 12:06:47 +02:00
OUString aLocalName ;
const 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 ) ;
}
2010-10-12 15:53:47 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */