Files
loongoffice/xmloff/source/draw/shapeexport4.cxx
Thomas Arnhold ba0a57702c remove OUString wrap for string literals
For some functions and all kinds of Exceptions.

CannotConvertException
CloseVetoException
DisposedException
EmptyUndoStackException
ErrorCodeIOException
Exception
GridInvalidDataException
GridInvalidModelException
IOException
IllegalAccessException
IllegalArgumentException
IllegalTypeException
IndexOutOfBoundsException
NoMasterException
NoSuchElementException
NoSupportException
PropertyVetoException
RuntimeException
SAXException
ScannerException
StorageWrappedTargetException
UnsupportedFlavorException
VetoException
WrappedTargetException
ZipIOException
throwGenericSQLException
throwIllegallArgumentException

createInstance
createInstanceWithContext
forName
getByName
getPackageManager
getPropertyValue
getUnpackedValueOrDefault
getValueByName
hasPropertyByName
openKey
setName
setPropertyValue
supportsService

bash command:

for i in `cat list`; do git grep "$i\s*(\s*OUString(\s*\"" -- '*.[hc]xx'
	| cut -d ':' -f1 | sort -u
	| xargs sed -i
		-e "s/\(\<$i\s*(\)\s*OUString(\s*\(\"[^\")\\]*\"\)\s*)\s*/\1\2/g"
		-e "s/\($i.*\)\"+ /\1\" + /g";
done

Change-Id: Iaf8e641b0abf28c082906014f87a183517630535
Reviewed-on: https://gerrit.libreoffice.org/4624
Tested-by: LibreOffice gerrit bot <gerrit@libreoffice.org>
Reviewed-by: Thomas Arnhold <thomas@arnhold.org>
Tested-by: Thomas Arnhold <thomas@arnhold.org>
2013-06-29 21:52:54 +00:00

1321 lines
70 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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 .
*/
#include <com/sun/star/graphic/XGraphic.hpp>
#include <com/sun/star/graphic/GraphicProvider.hpp>
#include <com/sun/star/graphic/XGraphicProvider.hpp>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/embed/XTransactedObject.hpp>
#include <com/sun/star/io/XSeekableInputStream.hpp>
#include <com/sun/star/drawing/HomogenMatrix.hpp>
#include <com/sun/star/drawing/PolyPolygonShape3D.hpp>
#include <com/sun/star/drawing/ProjectionMode.hpp>
#include <com/sun/star/drawing/ShadeMode.hpp>
#include <com/sun/star/drawing/Direction3D.hpp>
#include <com/sun/star/drawing/Position3D.hpp>
#include <com/sun/star/drawing/CameraGeometry.hpp>
#include <com/sun/star/drawing/DoubleSequence.hpp>
#include <com/sun/star/table/XColumnRowRange.hpp>
#include <sax/tools/converter.hxx>
#include <xmloff/shapeexport.hxx>
#include "sdpropls.hxx"
#include <tools/debug.hxx>
#include <rtl/ustrbuf.hxx>
#include <xmloff/xmlexp.hxx>
#include <xmloff/xmluconv.hxx>
#include "xexptran.hxx"
#include <xmloff/xmltoken.hxx>
#include "EnhancedCustomShapeToken.hxx"
#include <com/sun/star/container/XIdentifierContainer.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeParameterType.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeGluePointType.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeTextFrame.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp>
#include <com/sun/star/beans/PropertyValues.hpp>
#include <rtl/math.hxx>
#include <basegfx/vector/b3dvector.hxx>
#include "xmloff/xmlnmspe.hxx"
#include "XMLBase64Export.hxx"
#include <comphelper/processfactory.hxx>
using namespace ::com::sun::star;
using namespace ::com::sun::star::io;
using namespace ::xmloff::token;
using namespace ::xmloff::EnhancedCustomShapeToken;
using ::com::sun::star::embed::XStorage;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Sequence;
//////////////////////////////////////////////////////////////////////////////
void ExportParameter( OUStringBuffer& rStrBuffer, const com::sun::star::drawing::EnhancedCustomShapeParameter& rParameter )
{
if ( !rStrBuffer.isEmpty() )
rStrBuffer.append( (sal_Unicode)' ' );
if ( rParameter.Value.getValueTypeClass() == uno::TypeClass_DOUBLE )
{
double fNumber = 0.0;
rParameter.Value >>= fNumber;
::rtl::math::doubleToUStringBuffer( rStrBuffer, fNumber, rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, '.', sal_True );
}
else
{
sal_Int32 nValue = 0;
rParameter.Value >>= nValue;
switch( rParameter.Type )
{
case com::sun::star::drawing::EnhancedCustomShapeParameterType::EQUATION :
{
rStrBuffer.append( (sal_Unicode)'?' );
rStrBuffer.append( (sal_Unicode)'f' );
rStrBuffer.append( OUString::valueOf( nValue ) );
}
break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::ADJUSTMENT :
{
rStrBuffer.append( (sal_Unicode)'$' );
rStrBuffer.append( OUString::valueOf( nValue ) );
}
break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::BOTTOM :
rStrBuffer.append( GetXMLToken( XML_BOTTOM ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::RIGHT :
rStrBuffer.append( GetXMLToken( XML_RIGHT ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::TOP :
rStrBuffer.append( GetXMLToken( XML_TOP ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::LEFT :
rStrBuffer.append( GetXMLToken( XML_LEFT ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::XSTRETCH :
rStrBuffer.append( GetXMLToken( XML_XSTRETCH ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::YSTRETCH :
rStrBuffer.append( GetXMLToken( XML_YSTRETCH ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::HASSTROKE :
rStrBuffer.append( GetXMLToken( XML_HASSTROKE ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::HASFILL :
rStrBuffer.append( GetXMLToken( XML_HASFILL ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::WIDTH :
rStrBuffer.append( GetXMLToken( XML_WIDTH ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::HEIGHT :
rStrBuffer.append( GetXMLToken( XML_HEIGHT ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::LOGWIDTH :
rStrBuffer.append( GetXMLToken( XML_LOGWIDTH ) ); break;
case com::sun::star::drawing::EnhancedCustomShapeParameterType::LOGHEIGHT :
rStrBuffer.append( GetXMLToken( XML_LOGHEIGHT ) ); break;
default :
rStrBuffer.append( OUString::valueOf( nValue ) );
}
}
}
void ImpExportEquations( SvXMLExport& rExport, const uno::Sequence< OUString >& rEquations )
{
sal_Int32 i;
for ( i = 0; i < rEquations.getLength(); i++ )
{
OUString aStr(static_cast<sal_Unicode>('f'));
aStr += OUString::valueOf( i );
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aStr );
aStr = rEquations[ i ];
sal_Int32 nIndex = 0;
do
{
nIndex = aStr.indexOf( (sal_Unicode)'?', nIndex );
if ( nIndex != -1 )
{
OUString aNew( aStr.copy( 0, nIndex + 1 ) );
aNew += OUString(static_cast<sal_Unicode>('f'));
aNew += aStr.copy( nIndex + 1, ( aStr.getLength() - nIndex ) - 1 );
aStr = aNew;
nIndex++;
}
} while( nIndex != -1 );
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_FORMULA, aStr );
SvXMLElementExport aOBJ( rExport, XML_NAMESPACE_DRAW, XML_EQUATION, sal_True, sal_True );
}
}
void ImpExportHandles( SvXMLExport& rExport, const uno::Sequence< beans::PropertyValues >& rHandles )
{
sal_uInt32 i, j, nElements = rHandles.getLength();
if ( nElements )
{
OUString aStr;
OUStringBuffer aStrBuffer;
for ( i = 0; i < nElements; i++ )
{
sal_Bool bPosition = sal_False;
const uno::Sequence< beans::PropertyValue >& rPropSeq = rHandles[ i ];
for ( j = 0; j < (sal_uInt32)rPropSeq.getLength(); j++ )
{
const beans::PropertyValue& rPropVal = rPropSeq[ j ];
switch( EASGet( rPropVal.Name ) )
{
case EAS_Position :
{
com::sun::star::drawing::EnhancedCustomShapeParameterPair aPosition;
if ( rPropVal.Value >>= aPosition )
{
ExportParameter( aStrBuffer, aPosition.First );
ExportParameter( aStrBuffer, aPosition.Second );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_POSITION, aStr );
bPosition = sal_True;
}
}
break;
case EAS_MirroredX :
{
sal_Bool bMirroredX = sal_Bool();
if ( rPropVal.Value >>= bMirroredX )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_MIRROR_HORIZONTAL,
bMirroredX ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_MirroredY :
{
sal_Bool bMirroredY = sal_Bool();
if ( rPropVal.Value >>= bMirroredY )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_MIRROR_VERTICAL,
bMirroredY ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_Switched :
{
sal_Bool bSwitched = sal_Bool();
if ( rPropVal.Value >>= bSwitched )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_SWITCHED,
bSwitched ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_Polar :
{
com::sun::star::drawing::EnhancedCustomShapeParameterPair aPolar;
if ( rPropVal.Value >>= aPolar )
{
ExportParameter( aStrBuffer, aPolar.First );
ExportParameter( aStrBuffer, aPolar.Second );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_POLAR, aStr );
}
}
break;
case EAS_RadiusRangeMinimum :
{
com::sun::star::drawing::EnhancedCustomShapeParameter aRadiusRangeMinimum;
if ( rPropVal.Value >>= aRadiusRangeMinimum )
{
ExportParameter( aStrBuffer, aRadiusRangeMinimum );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_RADIUS_RANGE_MINIMUM, aStr );
}
}
break;
case EAS_RadiusRangeMaximum :
{
com::sun::star::drawing::EnhancedCustomShapeParameter aRadiusRangeMaximum;
if ( rPropVal.Value >>= aRadiusRangeMaximum )
{
ExportParameter( aStrBuffer, aRadiusRangeMaximum );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_RADIUS_RANGE_MAXIMUM, aStr );
}
}
break;
case EAS_RangeXMinimum :
{
com::sun::star::drawing::EnhancedCustomShapeParameter aXRangeMinimum;
if ( rPropVal.Value >>= aXRangeMinimum )
{
ExportParameter( aStrBuffer, aXRangeMinimum );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_RANGE_X_MINIMUM, aStr );
}
}
break;
case EAS_RangeXMaximum :
{
com::sun::star::drawing::EnhancedCustomShapeParameter aXRangeMaximum;
if ( rPropVal.Value >>= aXRangeMaximum )
{
ExportParameter( aStrBuffer, aXRangeMaximum );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_RANGE_X_MAXIMUM, aStr );
}
}
break;
case EAS_RangeYMinimum :
{
com::sun::star::drawing::EnhancedCustomShapeParameter aYRangeMinimum;
if ( rPropVal.Value >>= aYRangeMinimum )
{
ExportParameter( aStrBuffer, aYRangeMinimum );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_RANGE_Y_MINIMUM, aStr );
}
}
break;
case EAS_RangeYMaximum :
{
com::sun::star::drawing::EnhancedCustomShapeParameter aYRangeMaximum;
if ( rPropVal.Value >>= aYRangeMaximum )
{
ExportParameter( aStrBuffer, aYRangeMaximum );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_HANDLE_RANGE_Y_MAXIMUM, aStr );
}
}
break;
default:
break;
}
}
if ( bPosition )
SvXMLElementExport aOBJ( rExport, XML_NAMESPACE_DRAW, XML_HANDLE, sal_True, sal_True );
else
rExport.ClearAttrList();
}
}
}
void ImpExportEnhancedPath( SvXMLExport& rExport,
const uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair >& rCoordinates,
const uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeSegment >& rSegments,
bool bExtended = false )
{
OUString aStr;
OUStringBuffer aStrBuffer;
bool bNeedExtended = false;
sal_Int32 i, j, k, l;
sal_Int32 nCoords = rCoordinates.getLength();
sal_Int32 nSegments = rSegments.getLength();
sal_Bool bSimpleSegments = nSegments == 0;
if ( bSimpleSegments )
nSegments = 4;
for ( j = i = 0; j < nSegments; j++ )
{
com::sun::star::drawing::EnhancedCustomShapeSegment aSegment;
if ( bSimpleSegments )
{
// if there are not enough segments we will default them
switch( j )
{
case 0 :
{
aSegment.Count = 1;
aSegment.Command = com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::MOVETO;
}
break;
case 1 :
{
aSegment.Count = (sal_Int16)std::min( nCoords - 1, (sal_Int32)32767 );
aSegment.Command = com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::LINETO;
}
break;
case 2 :
{
aSegment.Count = 1;
aSegment.Command = com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOSESUBPATH;
}
break;
case 3 :
{
aSegment.Count = 1;
aSegment.Command = com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ENDSUBPATH;
}
break;
}
}
else
aSegment = rSegments[ j ];
if ( !aStrBuffer.isEmpty() )
aStrBuffer.append( (sal_Unicode)' ' );
sal_Int32 nParameter = 0;
switch( aSegment.Command )
{
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOSESUBPATH :
aStrBuffer.append( (sal_Unicode)'Z' ); break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ENDSUBPATH :
aStrBuffer.append( (sal_Unicode)'N' ); break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::NOFILL :
aStrBuffer.append( (sal_Unicode)'F' ); break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::NOSTROKE :
aStrBuffer.append( (sal_Unicode)'S' ); break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::MOVETO :
aStrBuffer.append( (sal_Unicode)'M' ); nParameter = 1; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::LINETO :
aStrBuffer.append( (sal_Unicode)'L' ); nParameter = 1; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CURVETO :
aStrBuffer.append( (sal_Unicode)'C' ); nParameter = 3; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ANGLEELLIPSETO :
aStrBuffer.append( (sal_Unicode)'T' ); nParameter = 3; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ANGLEELLIPSE :
aStrBuffer.append( (sal_Unicode)'U' ); nParameter = 3; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ARCTO :
aStrBuffer.append( (sal_Unicode)'A' ); nParameter = 4; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ARC :
aStrBuffer.append( (sal_Unicode)'B' ); nParameter = 4; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOCKWISEARCTO :
aStrBuffer.append( (sal_Unicode)'W' ); nParameter = 4; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOCKWISEARC :
aStrBuffer.append( (sal_Unicode)'V' ); nParameter = 4; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTX :
aStrBuffer.append( (sal_Unicode)'X' ); nParameter = 1; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTY :
aStrBuffer.append( (sal_Unicode)'Y' ); nParameter = 1; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::QUADRATICCURVETO :
aStrBuffer.append( (sal_Unicode)'Q' ); nParameter = 2; break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ARCANGLETO :
if ( bExtended ) {
aStrBuffer.append( (sal_Unicode)'G' );
nParameter = 2;
} else {
aStrBuffer.setLength( aStrBuffer.getLength() - 1);
bNeedExtended = true;
i += 2;
}
break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::DARKEN :
if ( bExtended )
aStrBuffer.append( (sal_Unicode)'H' );
else
bNeedExtended = true;
break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::DARKENLESS :
if ( bExtended )
aStrBuffer.append( (sal_Unicode)'I' );
else
bNeedExtended = true;
break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::LIGHTEN :
if ( bExtended )
aStrBuffer.append( (sal_Unicode)'J' );
else
bNeedExtended = true;
break;
case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::LIGHTENLESS :
if ( bExtended )
aStrBuffer.append( (sal_Unicode)'K' );
else
bNeedExtended = true;
break;
default : // ups, seems to be something wrong
{
aSegment.Count = 1;
aSegment.Command = com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::LINETO;
}
break;
}
if ( nParameter )
{
for ( k = 0; k < aSegment.Count; k++ )
{
if ( ( i + nParameter ) <= nCoords )
{
for ( l = 0; l < nParameter; l++ )
{
ExportParameter( aStrBuffer, rCoordinates[ i ].First );
ExportParameter( aStrBuffer, rCoordinates[ i++ ].Second );
}
}
else
{
j = nSegments; // error -> exiting
break;
}
}
}
}
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( bExtended ? XML_NAMESPACE_DRAW_EXT : XML_NAMESPACE_DRAW, XML_ENHANCED_PATH, aStr );
if ( !bExtended && bNeedExtended )
ImpExportEnhancedPath( rExport, rCoordinates, rSegments, true );
}
void ImpExportEnhancedGeometry( SvXMLExport& rExport, const uno::Reference< beans::XPropertySet >& xPropSet )
{
sal_Bool bEquations = sal_False;
uno::Sequence< OUString > aEquations;
sal_Bool bHandles = sal_False;
uno::Sequence< beans::PropertyValues > aHandles;
sal_Bool bCoordinates = sal_False;
uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeSegment > aSegments;
uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair > aCoordinates;
uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue > aAdjustmentValues;
OUString aStr;
OUStringBuffer aStrBuffer;
SvXMLUnitConverter& rUnitConverter = rExport.GetMM100UnitConverter();
uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
// geometry
const OUString sCustomShapeGeometry( "CustomShapeGeometry" );
if ( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName( sCustomShapeGeometry ) )
{
uno::Any aGeoPropSet( xPropSet->getPropertyValue( sCustomShapeGeometry ) );
uno::Sequence< beans::PropertyValue > aGeoPropSeq;
if ( aGeoPropSet >>= aGeoPropSeq )
{
const OUString sCustomShapeType( "non-primitive" );
OUString aCustomShapeType( sCustomShapeType );
sal_Int32 j, nGeoPropCount = aGeoPropSeq.getLength();
for ( j = 0; j < nGeoPropCount; j++ )
{
const beans::PropertyValue& rGeoProp = aGeoPropSeq[ j ];
switch( EASGet( rGeoProp.Name ) )
{
case EAS_Type :
{
rGeoProp.Value >>= aCustomShapeType;
}
break;
case EAS_MirroredX :
{
sal_Bool bMirroredX = sal_Bool();
if ( rGeoProp.Value >>= bMirroredX )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MIRROR_HORIZONTAL,
bMirroredX ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_MirroredY :
{
sal_Bool bMirroredY = sal_Bool();
if ( rGeoProp.Value >>= bMirroredY )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MIRROR_VERTICAL,
bMirroredY ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_ViewBox :
{
awt::Rectangle aRect;
if ( rGeoProp.Value >>= aRect )
{
SdXMLImExViewBox aViewBox( aRect.X, aRect.Y, aRect.Width, aRect.Height );
rExport.AddAttribute( XML_NAMESPACE_SVG, XML_VIEWBOX, aViewBox.GetExportString() );
}
}
break;
case EAS_TextRotateAngle :
{
double fTextRotateAngle = 0;
if ( rGeoProp.Value >>= fTextRotateAngle )
{
::sax::Converter::convertDouble(
aStrBuffer, fTextRotateAngle );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TEXT_ROTATE_ANGLE, aStr );
}
}
break;
case EAS_Extrusion :
{
uno::Sequence< beans::PropertyValue > aExtrusionPropSeq;
if ( rGeoProp.Value >>= aExtrusionPropSeq )
{
sal_Int32 i, nCount = aExtrusionPropSeq.getLength();
for ( i = 0; i < nCount; i++ )
{
const beans::PropertyValue& rProp = aExtrusionPropSeq[ i ];
switch( EASGet( rProp.Name ) )
{
case EAS_Extrusion :
{
sal_Bool bExtrusionOn = sal_Bool();
if ( rProp.Value >>= bExtrusionOn )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION,
bExtrusionOn ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_Brightness :
{
double fExtrusionBrightness = 0;
if ( rProp.Value >>= fExtrusionBrightness )
{
::sax::Converter::convertDouble(
aStrBuffer,
fExtrusionBrightness,
false,
util::MeasureUnit::PERCENT,
util::MeasureUnit::PERCENT);
aStrBuffer.append( (sal_Unicode)'%' );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_BRIGHTNESS, aStr );
}
}
break;
case EAS_Depth :
{
com::sun::star::drawing::EnhancedCustomShapeParameterPair aDepthParaPair;
if ( rProp.Value >>= aDepthParaPair )
{
double fDepth = 0;
if ( aDepthParaPair.First.Value >>= fDepth )
{
rExport.GetMM100UnitConverter().convertDouble( aStrBuffer, fDepth, sal_True );
ExportParameter( aStrBuffer, aDepthParaPair.Second );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_DEPTH, aStr );
}
}
}
break;
case EAS_Diffusion :
{
double fExtrusionDiffusion = 0;
if ( rProp.Value >>= fExtrusionDiffusion )
{
::sax::Converter::convertDouble(
aStrBuffer,
fExtrusionDiffusion,
false,
util::MeasureUnit::PERCENT,
util::MeasureUnit::PERCENT);
aStrBuffer.append( (sal_Unicode)'%' );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_DIFFUSION, aStr );
}
}
break;
case EAS_NumberOfLineSegments :
{
sal_Int32 nExtrusionNumberOfLineSegments = 0;
if ( rProp.Value >>= nExtrusionNumberOfLineSegments )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_NUMBER_OF_LINE_SEGMENTS, OUString::valueOf( nExtrusionNumberOfLineSegments ) );
}
break;
case EAS_LightFace :
{
sal_Bool bExtrusionLightFace = sal_Bool();
if ( rProp.Value >>= bExtrusionLightFace )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_LIGHT_FACE,
bExtrusionLightFace ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_FirstLightHarsh :
{
sal_Bool bExtrusionFirstLightHarsh = sal_Bool();
if ( rProp.Value >>= bExtrusionFirstLightHarsh )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_FIRST_LIGHT_HARSH,
bExtrusionFirstLightHarsh ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_SecondLightHarsh :
{
sal_Bool bExtrusionSecondLightHarsh = sal_Bool();
if ( rProp.Value >>= bExtrusionSecondLightHarsh )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_SECOND_LIGHT_HARSH,
bExtrusionSecondLightHarsh ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_FirstLightLevel :
{
double fExtrusionFirstLightLevel = 0;
if ( rProp.Value >>= fExtrusionFirstLightLevel )
{
::sax::Converter::convertDouble(
aStrBuffer,
fExtrusionFirstLightLevel,
false,
util::MeasureUnit::PERCENT,
util::MeasureUnit::PERCENT);
aStrBuffer.append( (sal_Unicode)'%' );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_FIRST_LIGHT_LEVEL, aStr );
}
}
break;
case EAS_SecondLightLevel :
{
double fExtrusionSecondLightLevel = 0;
if ( rProp.Value >>= fExtrusionSecondLightLevel )
{
::sax::Converter::convertDouble(
aStrBuffer,
fExtrusionSecondLightLevel,
false,
util::MeasureUnit::PERCENT,
util::MeasureUnit::PERCENT);
aStrBuffer.append( (sal_Unicode)'%' );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_SECOND_LIGHT_LEVEL, aStr );
}
}
break;
case EAS_FirstLightDirection :
{
drawing::Direction3D aExtrusionFirstLightDirection;
if ( rProp.Value >>= aExtrusionFirstLightDirection )
{
::basegfx::B3DVector aVec3D( aExtrusionFirstLightDirection.DirectionX, aExtrusionFirstLightDirection.DirectionY,
aExtrusionFirstLightDirection.DirectionZ );
rUnitConverter.convertB3DVector( aStrBuffer, aVec3D );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_FIRST_LIGHT_DIRECTION, aStr );
}
}
break;
case EAS_SecondLightDirection :
{
drawing::Direction3D aExtrusionSecondLightDirection;
if ( rProp.Value >>= aExtrusionSecondLightDirection )
{
::basegfx::B3DVector aVec3D( aExtrusionSecondLightDirection.DirectionX, aExtrusionSecondLightDirection.DirectionY,
aExtrusionSecondLightDirection.DirectionZ );
rUnitConverter.convertB3DVector( aStrBuffer, aVec3D );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_SECOND_LIGHT_DIRECTION, aStr );
}
}
break;
case EAS_Metal :
{
sal_Bool bExtrusionMetal = sal_Bool();
if ( rProp.Value >>= bExtrusionMetal )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_METAL,
bExtrusionMetal ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_ShadeMode :
{
// shadeMode
drawing::ShadeMode eShadeMode;
if( rProp.Value >>= eShadeMode )
{
if( eShadeMode == drawing::ShadeMode_FLAT )
aStr = GetXMLToken( XML_FLAT );
else if( eShadeMode == drawing::ShadeMode_PHONG )
aStr = GetXMLToken( XML_PHONG );
else if( eShadeMode == drawing::ShadeMode_SMOOTH )
aStr = GetXMLToken( XML_GOURAUD );
else
aStr = GetXMLToken( XML_DRAFT );
}
else
{
// ShadeMode enum not there, write default
aStr = GetXMLToken( XML_FLAT);
}
rExport.AddAttribute( XML_NAMESPACE_DR3D, XML_SHADE_MODE, aStr );
}
break;
case EAS_RotateAngle :
{
com::sun::star::drawing::EnhancedCustomShapeParameterPair aRotateAngleParaPair;
if ( rProp.Value >>= aRotateAngleParaPair )
{
ExportParameter( aStrBuffer, aRotateAngleParaPair.First );
ExportParameter( aStrBuffer, aRotateAngleParaPair.Second );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_ROTATION_ANGLE, aStr );
}
}
break;
case EAS_RotationCenter :
{
drawing::Direction3D aExtrusionRotationCenter;
if ( rProp.Value >>= aExtrusionRotationCenter )
{
::basegfx::B3DVector aVec3D( aExtrusionRotationCenter.DirectionX, aExtrusionRotationCenter.DirectionY,
aExtrusionRotationCenter.DirectionZ );
rUnitConverter.convertB3DVector( aStrBuffer, aVec3D );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_ROTATION_CENTER, aStr );
}
}
break;
case EAS_Shininess :
{
double fExtrusionShininess = 0;
if ( rProp.Value >>= fExtrusionShininess )
{
::sax::Converter::convertDouble(
aStrBuffer,
fExtrusionShininess,
false,
util::MeasureUnit::PERCENT,
util::MeasureUnit::PERCENT);
aStrBuffer.append( (sal_Unicode)'%' );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_SHININESS, aStr );
}
}
break;
case EAS_Skew :
{
com::sun::star::drawing::EnhancedCustomShapeParameterPair aSkewParaPair;
if ( rProp.Value >>= aSkewParaPair )
{
ExportParameter( aStrBuffer, aSkewParaPair.First );
ExportParameter( aStrBuffer, aSkewParaPair.Second );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_SKEW, aStr );
}
}
break;
case EAS_Specularity :
{
double fExtrusionSpecularity = 0;
if ( rProp.Value >>= fExtrusionSpecularity )
{
::sax::Converter::convertDouble(
aStrBuffer,
fExtrusionSpecularity,
false,
util::MeasureUnit::PERCENT,
util::MeasureUnit::PERCENT);
aStrBuffer.append( (sal_Unicode)'%' );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_SPECULARITY, aStr );
}
}
break;
case EAS_ProjectionMode :
{
drawing::ProjectionMode eProjectionMode;
if ( rProp.Value >>= eProjectionMode )
rExport.AddAttribute( XML_NAMESPACE_DR3D, XML_PROJECTION,
eProjectionMode == drawing::ProjectionMode_PARALLEL ? GetXMLToken( XML_PARALLEL ) : GetXMLToken( XML_PERSPECTIVE ) );
}
break;
case EAS_ViewPoint :
{
drawing::Position3D aExtrusionViewPoint;
if ( rProp.Value >>= aExtrusionViewPoint )
{
rUnitConverter.convertPosition3D( aStrBuffer, aExtrusionViewPoint );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_VIEWPOINT, aStr );
}
}
break;
case EAS_Origin :
{
com::sun::star::drawing::EnhancedCustomShapeParameterPair aOriginParaPair;
if ( rProp.Value >>= aOriginParaPair )
{
ExportParameter( aStrBuffer, aOriginParaPair.First );
ExportParameter( aStrBuffer, aOriginParaPair.Second );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_ORIGIN, aStr );
}
}
break;
case EAS_Color :
{
sal_Bool bExtrusionColor = sal_Bool();
if ( rProp.Value >>= bExtrusionColor )
{
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_COLOR,
bExtrusionColor ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
}
break;
default:
break;
}
}
}
}
break;
case EAS_TextPath :
{
uno::Sequence< beans::PropertyValue > aTextPathPropSeq;
if ( rGeoProp.Value >>= aTextPathPropSeq )
{
sal_Int32 i, nCount = aTextPathPropSeq.getLength();
for ( i = 0; i < nCount; i++ )
{
const beans::PropertyValue& rProp = aTextPathPropSeq[ i ];
switch( EASGet( rProp.Name ) )
{
case EAS_TextPath :
{
sal_Bool bTextPathOn = sal_Bool();
if ( rProp.Value >>= bTextPathOn )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TEXT_PATH,
bTextPathOn ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_TextPathMode :
{
com::sun::star::drawing::EnhancedCustomShapeTextPathMode eTextPathMode;
if ( rProp.Value >>= eTextPathMode )
{
switch ( eTextPathMode )
{
case com::sun::star::drawing::EnhancedCustomShapeTextPathMode_NORMAL: aStr = GetXMLToken( XML_NORMAL ); break;
case com::sun::star::drawing::EnhancedCustomShapeTextPathMode_PATH : aStr = GetXMLToken( XML_PATH ); break;
case com::sun::star::drawing::EnhancedCustomShapeTextPathMode_SHAPE : aStr = GetXMLToken( XML_SHAPE ); break;
default:
break;
}
if ( !aStr.isEmpty() )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TEXT_PATH_MODE, aStr );
}
}
break;
case EAS_ScaleX :
{
sal_Bool bScaleX = sal_Bool();
if ( rProp.Value >>= bScaleX )
{
aStr = bScaleX ? GetXMLToken( XML_SHAPE ) : GetXMLToken( XML_PATH );
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TEXT_PATH_SCALE, aStr );
}
}
break;
case EAS_SameLetterHeights :
{
sal_Bool bSameLetterHeights = sal_Bool();
if ( rProp.Value >>= bSameLetterHeights )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TEXT_PATH_SAME_LETTER_HEIGHTS,
bSameLetterHeights ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
default:
break;
}
}
}
}
break;
case EAS_Path :
{
uno::Sequence< beans::PropertyValue > aPathPropSeq;
if ( rGeoProp.Value >>= aPathPropSeq )
{
sal_Int32 i, nCount = aPathPropSeq.getLength();
for ( i = 0; i < nCount; i++ )
{
const beans::PropertyValue& rProp = aPathPropSeq[ i ];
switch( EASGet( rProp.Name ) )
{
case EAS_SubViewSize:
{
uno::Sequence< awt::Size > aSubViewSizes;
rProp.Value >>= aSubViewSizes;
for ( int nIdx = 0; nIdx < aSubViewSizes.getLength(); nIdx++ )
{
if ( nIdx )
aStrBuffer.append(' ');
::sax::Converter::convertNumber( aStrBuffer, aSubViewSizes[nIdx].Width );
aStrBuffer.append(' ');
::sax::Converter::convertNumber( aStrBuffer, aSubViewSizes[nIdx].Height );
}
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW_EXT, XML_SUB_VIEW_SIZE, aStr );
}
break;
case EAS_ExtrusionAllowed :
{
sal_Bool bExtrusionAllowed = sal_Bool();
if ( rProp.Value >>= bExtrusionAllowed )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_EXTRUSION_ALLOWED,
bExtrusionAllowed ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_ConcentricGradientFillAllowed :
{
sal_Bool bConcentricGradientFillAllowed = sal_Bool();
if ( rProp.Value >>= bConcentricGradientFillAllowed )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CONCENTRIC_GRADIENT_FILL_ALLOWED,
bConcentricGradientFillAllowed ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_TextPathAllowed :
{
sal_Bool bTextPathAllowed = sal_Bool();
if ( rProp.Value >>= bTextPathAllowed )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TEXT_PATH_ALLOWED,
bTextPathAllowed ? GetXMLToken( XML_TRUE ) : GetXMLToken( XML_FALSE ) );
}
break;
case EAS_GluePoints :
{
com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair> aGluePoints;
if ( rProp.Value >>= aGluePoints )
{
sal_Int32 k, nElements = aGluePoints.getLength();
if ( nElements )
{
for( k = 0; k < nElements; k++ )
{
ExportParameter( aStrBuffer, aGluePoints[ k ].First );
ExportParameter( aStrBuffer, aGluePoints[ k ].Second );
}
aStr = aStrBuffer.makeStringAndClear();
}
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GLUE_POINTS, aStr );
}
}
break;
case EAS_GluePointType :
{
sal_Int16 nGluePointType = sal_Int16();
if ( rProp.Value >>= nGluePointType )
{
switch ( nGluePointType )
{
case com::sun::star::drawing::EnhancedCustomShapeGluePointType::NONE : aStr = GetXMLToken( XML_NONE ); break;
case com::sun::star::drawing::EnhancedCustomShapeGluePointType::SEGMENTS : aStr = GetXMLToken( XML_SEGMENTS ); break;
case com::sun::star::drawing::EnhancedCustomShapeGluePointType::RECT : aStr = GetXMLToken( XML_RECTANGLE ); break;
}
if ( !aStr.isEmpty() )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GLUE_POINT_TYPE, aStr );
}
}
break;
case EAS_Coordinates :
{
bCoordinates = ( rProp.Value >>= aCoordinates );
}
break;
case EAS_Segments :
{
rProp.Value >>= aSegments;
}
break;
case EAS_StretchX :
{
sal_Int32 nStretchPoint = 0;
if ( rProp.Value >>= nStretchPoint )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_PATH_STRETCHPOINT_X, OUString::valueOf( nStretchPoint ) );
}
break;
case EAS_StretchY :
{
sal_Int32 nStretchPoint = 0;
if ( rProp.Value >>= nStretchPoint )
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_PATH_STRETCHPOINT_Y, OUString::valueOf( nStretchPoint ) );
}
break;
case EAS_TextFrames :
{
com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeTextFrame > aPathTextFrames;
if ( rProp.Value >>= aPathTextFrames )
{
if ( (sal_uInt16)aPathTextFrames.getLength() )
{
sal_uInt16 k, nElements = (sal_uInt16)aPathTextFrames.getLength();
for ( k = 0; k < nElements; k++ )
{
ExportParameter( aStrBuffer, aPathTextFrames[ k ].TopLeft.First );
ExportParameter( aStrBuffer, aPathTextFrames[ k ].TopLeft.Second );
ExportParameter( aStrBuffer, aPathTextFrames[ k ].BottomRight.First );
ExportParameter( aStrBuffer, aPathTextFrames[ k ].BottomRight.Second );
}
aStr = aStrBuffer.makeStringAndClear();
}
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TEXT_AREAS, aStr );
}
}
break;
default:
break;
}
}
}
}
break;
case EAS_Equations :
{
bEquations = ( rGeoProp.Value >>= aEquations );
}
break;
case EAS_Handles :
{
bHandles = ( rGeoProp.Value >>= aHandles );
}
break;
case EAS_AdjustmentValues :
{
rGeoProp.Value >>= aAdjustmentValues;
}
break;
default:
break;
}
} // for
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TYPE, aCustomShapeType );
// adjustments
sal_Int32 nAdjustmentValues = aAdjustmentValues.getLength();
if ( nAdjustmentValues )
{
sal_Int32 i, nValue = 0;
for ( i = 0; i < nAdjustmentValues; i++ )
{
if ( i )
aStrBuffer.append( (sal_Unicode)' ' );
const com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue& rAdj = aAdjustmentValues[ i ];
if ( rAdj.State == beans::PropertyState_DIRECT_VALUE )
{
if ( rAdj.Value.getValueTypeClass() == uno::TypeClass_DOUBLE )
{
double fValue = 0.0;
rAdj.Value >>= fValue;
::sax::Converter::convertDouble(aStrBuffer, fValue);
}
else
{
rAdj.Value >>= nValue;
::sax::Converter::convertNumber(aStrBuffer, nValue);
}
}
else
{
// this should not be, but better than setting nothing
::sax::Converter::convertNumber( aStrBuffer, 0 );
}
}
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MODIFIERS, aStr );
}
if ( bCoordinates )
ImpExportEnhancedPath( rExport, aCoordinates, aSegments );
}
}
SvXMLElementExport aOBJ( rExport, XML_NAMESPACE_DRAW, XML_ENHANCED_GEOMETRY, sal_True, sal_True );
if ( bEquations )
ImpExportEquations( rExport, aEquations );
if ( bHandles )
ImpExportHandles( rExport, aHandles );
}
void XMLShapeExport::ImpExportCustomShape(
const uno::Reference< drawing::XShape >& xShape,
XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint )
{
const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
if ( xPropSet.is() )
{
OUString aStr;
uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
// Transformation
ImpExportNewTrans( xPropSet, nFeatures, pRefPoint );
if ( xPropSetInfo.is() )
{
const OUString sCustomShapeEngine( "CustomShapeEngine" );
if ( xPropSetInfo->hasPropertyByName( sCustomShapeEngine ) )
{
uno::Any aEngine( xPropSet->getPropertyValue( sCustomShapeEngine ) );
if ( ( aEngine >>= aStr ) && !aStr.isEmpty() )
mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_ENGINE, aStr );
}
const OUString sCustomShapeData( "CustomShapeData" );
if ( xPropSetInfo->hasPropertyByName( sCustomShapeData ) )
{
uno::Any aData( xPropSet->getPropertyValue( sCustomShapeData ) );
if ( ( aData >>= aStr ) && !aStr.isEmpty() )
mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DATA, aStr );
}
}
sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210#
SvXMLElementExport aOBJ( mrExport, XML_NAMESPACE_DRAW, XML_CUSTOM_SHAPE, bCreateNewline, sal_True );
ImpExportDescription( xShape ); // #i68101#
ImpExportEvents( xShape );
ImpExportGluePoints( xShape );
ImpExportText( xShape );
ImpExportEnhancedGeometry( mrExport, xPropSet );
}
}
void XMLShapeExport::ImpExportTableShape( const uno::Reference< drawing::XShape >& xShape, XmlShapeType eShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint )
{
uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
uno::Reference< container::XNamed > xNamed(xShape, uno::UNO_QUERY);
DBG_ASSERT( xPropSet.is() && xNamed.is(), "xmloff::XMLShapeExport::ImpExportTableShape(), tabe shape is not implementing needed interfaces");
if(xPropSet.is() && xNamed.is()) try
{
// Transformation
ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
sal_Bool bIsEmptyPresObj = sal_False;
// presentation settings
if(eShapeType == XmlShapeTypePresTableShape)
bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_TABLE) );
const bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 );
const bool bExportEmbedded(0 != (mrExport.getExportFlags() & EXPORT_EMBEDDED));
SvXMLElementExport aElement( mrExport, XML_NAMESPACE_DRAW, XML_FRAME, bCreateNewline, sal_True );
// do not export in ODF 1.1 or older
if( mrExport.getDefaultVersion() >= SvtSaveOptions::ODFVER_012 )
{
if( !bIsEmptyPresObj )
{
uno::Reference< container::XNamed > xTemplate( xPropSet->getPropertyValue("TableTemplate"), uno::UNO_QUERY );
if( xTemplate.is() )
{
const OUString sTemplate( xTemplate->getName() );
if( !sTemplate.isEmpty() )
{
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TEMPLATE_NAME, sTemplate );
for( const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0]; pEntry->msApiName; pEntry++ )
{
try
{
sal_Bool bBool = sal_False;
const OUString sAPIPropertyName( OUString(pEntry->msApiName, pEntry->nApiNameLength, RTL_TEXTENCODING_ASCII_US ) );
xPropSet->getPropertyValue( sAPIPropertyName ) >>= bBool;
if( bBool )
mrExport.AddAttribute(pEntry->mnNameSpace, pEntry->meXMLName, XML_TRUE );
}
catch( uno::Exception& )
{
OSL_FAIL("XMLShapeExport::ImpExportTableShape(), exception caught!");
}
}
}
}
uno::Reference< table::XColumnRowRange > xRange( xPropSet->getPropertyValue( msModel ), uno::UNO_QUERY_THROW );
GetShapeTableExport()->exportTable( xRange );
}
}
if( !bIsEmptyPresObj )
{
uno::Reference< graphic::XGraphic > xGraphic( xPropSet->getPropertyValue("ReplacementGraphic"), uno::UNO_QUERY );
if( xGraphic.is() ) try
{
Reference< uno::XComponentContext > xContext = GetExport().getComponentContext();
uno::Reference< embed::XStorage > xPictureStorage;
uno::Reference< embed::XStorage > xStorage;
uno::Reference< io::XStream > xPictureStream;
OUString sPictureName;
if( bExportEmbedded )
{
xPictureStream.set( xContext->getServiceManager()->createInstanceWithContext( "com.sun.star.comp.MemoryStream", xContext), UNO_QUERY_THROW );
}
else
{
xStorage.set( GetExport().GetTargetStorage(), UNO_QUERY_THROW );
xPictureStorage.set( xStorage->openStorageElement( OUString( "Pictures" ), ::embed::ElementModes::READWRITE ), uno::UNO_QUERY_THROW );
const OUString sPrefix( "TablePreview" );
const OUString sSuffix( ".svm" );
sal_Int32 nIndex = 0;
do
{
sPictureName = sPrefix;
sPictureName += OUString::valueOf( ++nIndex );
sPictureName += sSuffix;
}
while( xPictureStorage->hasByName( sPictureName ) );
xPictureStream.set( xPictureStorage->openStreamElement( sPictureName, ::embed::ElementModes::READWRITE ), UNO_QUERY_THROW );
}
Reference< graphic::XGraphicProvider > xProvider( graphic::GraphicProvider::create(xContext) );
Sequence< beans::PropertyValue > aArgs( 2 );
aArgs[ 0 ].Name = OUString( "MimeType" );
aArgs[ 0 ].Value <<= OUString( "image/x-vclgraphic" );
aArgs[ 1 ].Name = OUString( "OutputStream" );
aArgs[ 1 ].Value <<= xPictureStream->getOutputStream();
xProvider->storeGraphic( xGraphic, aArgs );
if( xPictureStorage.is() )
{
Reference< embed::XTransactedObject > xTrans( xPictureStorage, UNO_QUERY );
if( xTrans.is() )
xTrans->commit();
}
if( !bExportEmbedded )
{
OUString sURL( "Pictures/" );
sURL += sPictureName;
mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sURL );
mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
}
SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_DRAW, XML_IMAGE, sal_False, sal_True );
if( bExportEmbedded )
{
Reference< XSeekableInputStream > xSeekable( xPictureStream, UNO_QUERY_THROW );
xSeekable->seek(0);
XMLBase64Export aBase64Exp( GetExport() );
aBase64Exp.exportOfficeBinaryDataElement( Reference < XInputStream >( xPictureStream, UNO_QUERY_THROW ) );
}
}
catch( uno::Exception& )
{
OSL_FAIL("xmloff::XMLShapeExport::ImpExportTableShape(), exception caught!");
}
}
ImpExportEvents( xShape );
ImpExportGluePoints( xShape );
ImpExportDescription( xShape ); // #i68101#
}
catch( uno::Exception& )
{
OSL_FAIL( "xmloff::XMLShapeExport::ImpExportTableShape(), exception caught!" );
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */