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 .
2000-09-18 16:07:07 +00:00
*
2012-11-12 17:21:24 +00:00
* 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/.
2000-09-18 16:07:07 +00:00
*
2012-11-12 17:21:24 +00:00
* This file incorporates work covered by the following license notice :
2000-09-18 16:07:07 +00:00
*
2012-11-12 17:21:24 +00:00
* 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 .
*/
2000-09-18 16:07:07 +00:00
2013-10-13 14:36:21 +03:00
# include <basegfx/matrix/b2dhommatrix.hxx>
2013-10-29 14:11:45 +00:00
# include <basegfx/matrix/b2dhommatrixtools.hxx>
# include <basegfx/matrix/b3dhommatrix.hxx>
# include <basegfx/point/b2dpoint.hxx>
# include <basegfx/polygon/b2dpolypolygon.hxx>
# include <basegfx/polygon/b2dpolypolygontools.hxx>
# include <basegfx/polygon/b2dpolygontools.hxx>
# include <basegfx/polygon/b3dpolypolygon.hxx>
# include <basegfx/polygon/b3dpolypolygontools.hxx>
2013-10-13 14:36:21 +03:00
# include <basegfx/tuple/b2dtuple.hxx>
# include <basegfx/vector/b3dvector.hxx>
# include <com/sun/star/beans/XPropertyState.hpp>
# include <com/sun/star/beans/PropertyValues.hpp>
2000-09-18 16:07:07 +00:00
# include <com/sun/star/chart/XChartDocument.hpp>
2013-10-13 14:36:21 +03:00
# include <com/sun/star/container/XChild.hpp>
# include <com/sun/star/container/XEnumerationAccess.hpp>
2002-05-28 08:28:05 +00:00
# include <com/sun/star/container/XIdentifierAccess.hpp>
2013-10-13 14:36:21 +03:00
# include <com/sun/star/container/XIdentifierContainer.hpp>
# include <com/sun/star/container/XNamed.hpp>
# include <com/sun/star/document/XEventsSupplier.hpp>
2002-05-28 08:28:05 +00:00
# include <com/sun/star/drawing/Alignment.hpp>
2013-10-13 14:36:21 +03:00
# include <com/sun/star/drawing/CameraGeometry.hpp>
# include <com/sun/star/drawing/CircleKind.hpp>
# include <com/sun/star/drawing/ConnectorType.hpp>
# include <com/sun/star/drawing/Direction3D.hpp>
# include <com/sun/star/drawing/DoubleSequence.hpp>
2002-05-28 08:28:05 +00:00
# include <com/sun/star/drawing/EscapeDirection.hpp>
2013-10-13 14:36:21 +03:00
# include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeGluePointType.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeParameterType.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeTextFrame.hpp>
# include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp>
# include <com/sun/star/drawing/GluePoint2.hpp>
# include <com/sun/star/drawing/HomogenMatrix.hpp>
# include <com/sun/star/drawing/HomogenMatrix3.hpp>
# include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
# include <com/sun/star/drawing/PolyPolygonShape3D.hpp>
# include <com/sun/star/drawing/Position3D.hpp>
# include <com/sun/star/drawing/ProjectionMode.hpp>
# include <com/sun/star/drawing/ShadeMode.hpp>
# include <com/sun/star/drawing/XControlShape.hpp>
# include <com/sun/star/drawing/XCustomShapeEngine.hpp>
# include <com/sun/star/drawing/XGluePointsSupplier.hpp>
# include <com/sun/star/embed/ElementModes.hpp>
# include <com/sun/star/embed/XTransactedObject.hpp>
# 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/io/XSeekableInputStream.hpp>
# include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
# include <com/sun/star/lang/XMultiServiceFactory.hpp>
# include <com/sun/star/media/ZoomLevel.hpp>
# include <com/sun/star/presentation/AnimationSpeed.hpp>
# include <com/sun/star/presentation/ClickAction.hpp>
# include <com/sun/star/style/XStyle.hpp>
2008-03-12 09:35:17 +00:00
# include <com/sun/star/table/XColumnRowRange.hpp>
2013-10-13 14:36:21 +03:00
# include <com/sun/star/text/XText.hpp>
2014-04-02 11:59:42 +02:00
# include <com/sun/star/document/XStorageBasedDocument.hpp>
2001-02-08 13:45:43 +00:00
2013-04-19 18:08:13 -04:00
# include <comphelper/classids.hxx>
2013-10-13 14:36:21 +03:00
# include <comphelper/processfactory.hxx>
# include <comphelper/storagehelper.hxx>
# include <rtl/math.hxx>
# include <rtl/ustrbuf.hxx>
# include <sax/tools/converter.hxx>
# include <tools/debug.hxx>
2001-07-31 09:47:14 +00:00
# include <tools/globname.hxx>
2013-10-13 14:36:21 +03:00
# include <tools/helpers.hxx>
2014-04-02 11:59:42 +02:00
# include <tools/urlobj.hxx>
2002-11-06 09:35:40 +00:00
2013-10-13 14:36:21 +03:00
# include <xmloff/contextid.hxx>
# include <xmloff/families.hxx>
# include <xmloff/nmspmap.hxx>
# include <xmloff/shapeexport.hxx>
# include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
# include <xmloff/xmlexp.hxx>
# include <xmloff/xmlnmspe.hxx>
# include <xmloff/xmltoken.hxx>
# include <xmloff/xmluconv.hxx>
2005-04-12 15:46:04 +00:00
2013-10-13 14:36:21 +03:00
# include "anim.hxx"
# include "EnhancedCustomShapeToken.hxx"
# include "PropertySetMerger.hxx"
# include "sdpropls.hxx"
# include "sdxmlexp_impl.hxx"
# include "xexptran.hxx"
# include "XMLBase64Export.hxx"
# include "XMLImageMapExport.hxx"
2014-02-26 17:20:31 +09:00
# include <boost/scoped_ptr.hpp>
2000-11-26 18:48:02 +00:00
2000-09-18 16:07:07 +00:00
using namespace : : com : : sun : : star ;
2013-10-13 14:36:21 +03:00
using namespace : : xmloff : : EnhancedCustomShapeToken ;
2001-06-15 09:37:08 +00:00
using namespace : : xmloff : : token ;
2000-09-18 16:07:07 +00:00
2000-11-07 12:33:09 +00:00
XMLShapeExport : : XMLShapeExport ( SvXMLExport & rExp ,
SvXMLExportPropertyMapper * pExtMapper )
2006-06-19 17:12:03 +00:00
: mrExport ( rExp ) ,
2009-12-31 15:49:52 +01:00
maShapesInfos ( ) ,
maCurrentShapesIter ( maShapesInfos . end ( ) ) ,
2014-03-28 11:15:14 +02:00
mbExportLayer ( false ) ,
2010-11-10 13:50:33 +08:00
// #88546# init to sal_False
2014-03-28 11:15:14 +02:00
mbHandleProgressBar ( false ) ,
2012-06-02 08:58:21 -05:00
msZIndex ( " ZOrder " ) ,
msPrintable ( " Printable " ) ,
msVisible ( " Visible " ) ,
msEmptyPres ( " IsEmptyPresentationObject " ) ,
msModel ( " Model " ) ,
msStartShape ( " StartShape " ) ,
msEndShape ( " EndShape " ) ,
msOnClick ( " OnClick " ) ,
msEventType ( " EventType " ) ,
msPresentation ( " Presentation " ) ,
msMacroName ( " MacroName " ) ,
msScript ( " Script " ) ,
msLibrary ( " Library " ) ,
msClickAction ( " ClickAction " ) ,
msBookmark ( " Bookmark " ) ,
msEffect ( " Effect " ) ,
msPlayFull ( " PlayFull " ) ,
msVerb ( " Verb " ) ,
msSoundURL ( " SoundURL " ) ,
msSpeed ( " Speed " ) ,
msStarBasic ( " StarBasic " )
2000-09-18 16:07:07 +00:00
{
// construct PropertyHandlerFactory
2006-06-19 17:12:03 +00:00
mxSdPropHdlFactory = new XMLSdPropHdlFactory ( mrExport . GetModel ( ) , rExp ) ;
2000-09-18 16:07:07 +00:00
// construct PropertySetMapper
2006-06-19 17:12:03 +00:00
mxPropertySetMapper = CreateShapePropMapper ( mrExport ) ;
2000-11-07 12:33:09 +00:00
if ( pExtMapper )
{
UniReference < SvXMLExportPropertyMapper > xExtMapper ( pExtMapper ) ;
2006-06-19 17:12:03 +00:00
mxPropertySetMapper - > ChainExportMapper ( xExtMapper ) ;
2000-11-07 12:33:09 +00:00
}
2000-09-18 16:07:07 +00:00
2001-06-01 11:32:48 +00:00
/*
2000-12-05 22:31:17 +00:00
// chain text attributes
2001-02-27 15:09:08 +00:00
xPropertySetMapper - > ChainExportMapper ( XMLTextParagraphExport : : CreateParaExtPropMapper ( rExp ) ) ;
2001-06-01 11:32:48 +00:00
*/
2000-12-05 22:31:17 +00:00
2006-06-19 17:12:03 +00:00
mrExport . GetAutoStylePool ( ) - > AddFamily (
2000-09-18 16:07:07 +00:00
XML_STYLE_FAMILY_SD_GRAPHICS_ID ,
2012-06-02 08:58:21 -05:00
OUString ( XML_STYLE_FAMILY_SD_GRAPHICS_NAME ) ,
2000-09-18 16:07:07 +00:00
GetPropertySetMapper ( ) ,
2012-06-02 08:58:21 -05:00
OUString ( XML_STYLE_FAMILY_SD_GRAPHICS_PREFIX ) ) ;
2006-06-19 17:12:03 +00:00
mrExport . GetAutoStylePool ( ) - > AddFamily (
2000-09-18 16:07:07 +00:00
XML_STYLE_FAMILY_SD_PRESENTATION_ID ,
2012-06-02 08:58:21 -05:00
OUString ( XML_STYLE_FAMILY_SD_PRESENTATION_NAME ) ,
2000-09-18 16:07:07 +00:00
GetPropertySetMapper ( ) ,
2012-06-02 08:58:21 -05:00
OUString ( XML_STYLE_FAMILY_SD_PRESENTATION_PREFIX ) ) ;
2001-02-02 10:14:37 +00:00
maCurrentInfo = maShapeInfos . end ( ) ;
2008-03-12 09:35:17 +00:00
// create table export helper and let him add his families in time
GetShapeTableExport ( ) ;
2000-09-18 16:07:07 +00:00
}
XMLShapeExport : : ~ XMLShapeExport ( )
{
}
2005-04-12 15:46:04 +00:00
// sj: replacing CustomShapes with standard objects that are also supported in OpenOffice.org format
uno : : Reference < drawing : : XShape > XMLShapeExport : : checkForCustomShapeReplacement ( const uno : : Reference < drawing : : XShape > & xShape )
{
uno : : Reference < drawing : : XShape > xCustomShapeReplacement ;
if ( ( GetExport ( ) . getExportFlags ( ) & EXPORT_OASIS ) = = 0 )
{
2012-11-25 00:33:44 -06:00
OUString aType ( xShape - > getShapeType ( ) ) ;
if ( aType . equalsAscii ( " com.sun.star.drawing.CustomShape " ) )
2005-04-12 15:46:04 +00:00
{
uno : : Reference < beans : : XPropertySet > xSet ( xShape , uno : : UNO_QUERY ) ;
if ( xSet . is ( ) )
{
2012-11-25 00:33:44 -06:00
OUString aEngine ;
2013-06-29 21:24:12 +02:00
xSet - > getPropertyValue ( " CustomShapeEngine " ) > > = aEngine ;
2012-01-25 17:00:07 -02:00
if ( aEngine . isEmpty ( ) )
2012-11-25 00:33:44 -06:00
{
aEngine = " com.sun.star.drawing.EnhancedCustomShapeEngine " ;
}
2013-05-14 13:58:40 +02:00
uno : : Reference < uno : : XComponentContext > xContext ( : : comphelper : : getProcessComponentContext ( ) ) ;
2011-02-17 10:32:07 +01:00
2013-05-14 13:58:40 +02:00
if ( ! aEngine . isEmpty ( ) )
2005-04-12 15:46:04 +00:00
{
uno : : Sequence < uno : : Any > aArgument ( 1 ) ;
uno : : Sequence < beans : : PropertyValue > aPropValues ( 2 ) ;
2013-11-15 11:05:19 +02:00
aPropValues [ 0 ] . Name = " CustomShape " ;
2005-04-12 15:46:04 +00:00
aPropValues [ 0 ] . Value < < = xShape ;
sal_Bool bForceGroupWithText = sal_True ;
2013-11-15 11:05:19 +02:00
aPropValues [ 1 ] . Name = " ForceGroupWithText " ;
2005-04-12 15:46:04 +00:00
aPropValues [ 1 ] . Value < < = bForceGroupWithText ;
aArgument [ 0 ] < < = aPropValues ;
2013-05-14 13:58:40 +02:00
uno : : Reference < uno : : XInterface > xInterface (
xContext - > getServiceManager ( ) - > createInstanceWithArgumentsAndContext ( aEngine , aArgument , xContext ) ) ;
2005-04-12 15:46:04 +00:00
if ( xInterface . is ( ) )
{
uno : : Reference < drawing : : XCustomShapeEngine > xCustomShapeEngine (
uno : : Reference < drawing : : XCustomShapeEngine > ( xInterface , uno : : UNO_QUERY ) ) ;
if ( xCustomShapeEngine . is ( ) )
xCustomShapeReplacement = xCustomShapeEngine - > render ( ) ;
}
}
}
}
}
return xCustomShapeReplacement ;
}
2000-09-18 16:07:07 +00:00
// This method collects all automatic styles for the given XShape
2005-04-12 15:46:04 +00:00
void XMLShapeExport : : collectShapeAutoStyles ( const uno : : Reference < drawing : : XShape > & xShape )
2000-09-18 16:07:07 +00:00
{
2001-03-08 13:33:34 +00:00
if ( maCurrentShapesIter = = maShapesInfos . end ( ) )
{
2011-03-01 19:07:44 +01:00
OSL_FAIL ( " XMLShapeExport::collectShapeAutoStyles(): no call to seekShapes()! " ) ;
2001-03-08 13:33:34 +00:00
return ;
}
sal_Int32 nZIndex = 0 ;
uno : : Reference < beans : : XPropertySet > xSet ( xShape , uno : : UNO_QUERY ) ;
if ( xSet . is ( ) )
xSet - > getPropertyValue ( msZIndex ) > > = nZIndex ;
2002-04-17 10:42:15 +00:00
ImplXMLShapeExportInfoVector & aShapeInfoVector = ( * maCurrentShapesIter ) . second ;
2004-11-26 18:33:11 +00:00
if ( ( sal_Int32 ) aShapeInfoVector . size ( ) < = nZIndex )
2002-04-17 10:42:15 +00:00
{
2011-03-01 19:07:44 +01:00
OSL_FAIL ( " XMLShapeExport::collectShapeAutoStyles(): no shape info allocated for a given shape " ) ;
2002-04-17 10:42:15 +00:00
return ;
}
ImplXMLShapeExportInfo & aShapeInfo = aShapeInfoVector [ nZIndex ] ;
2001-02-02 10:14:37 +00:00
2005-04-12 15:46:04 +00:00
uno : : Reference < drawing : : XShape > xCustomShapeReplacement = checkForCustomShapeReplacement ( xShape ) ;
if ( xCustomShapeReplacement . is ( ) )
aShapeInfo . xCustomShapeReplacement = xCustomShapeReplacement ;
2001-07-27 09:16:23 +00:00
// first compute the shapes type
ImpCalcShapeType ( xShape , aShapeInfo . meShapeType ) ;
2012-11-12 17:21:24 +00:00
// #i118485# enabled XmlShapeTypeDrawChartShape and XmlShapeTypeDrawOLE2Shape
// to have text
2002-11-04 11:38:51 +00:00
const bool bObjSupportsText =
2001-06-01 11:32:48 +00:00
aShapeInfo . meShapeType ! = XmlShapeTypePresChartShape & &
aShapeInfo . meShapeType ! = XmlShapeTypePresOLE2Shape & &
2008-03-12 09:35:17 +00:00
aShapeInfo . meShapeType ! = XmlShapeTypeDrawSheetShape & &
aShapeInfo . meShapeType ! = XmlShapeTypePresSheetShape & &
2001-06-01 11:32:48 +00:00
aShapeInfo . meShapeType ! = XmlShapeTypeDraw3DSceneObject & &
aShapeInfo . meShapeType ! = XmlShapeTypeDraw3DCubeObject & &
aShapeInfo . meShapeType ! = XmlShapeTypeDraw3DSphereObject & &
aShapeInfo . meShapeType ! = XmlShapeTypeDraw3DLatheObject & &
2002-11-04 11:38:51 +00:00
aShapeInfo . meShapeType ! = XmlShapeTypeDraw3DExtrudeObject & &
aShapeInfo . meShapeType ! = XmlShapeTypeDrawPageShape & &
aShapeInfo . meShapeType ! = XmlShapeTypePresPageShape & &
aShapeInfo . meShapeType ! = XmlShapeTypeDrawGroupShape ;
const bool bObjSupportsStyle =
aShapeInfo . meShapeType ! = XmlShapeTypeDrawGroupShape ;
2001-06-01 11:32:48 +00:00
2001-06-27 14:23:12 +00:00
sal_Bool bIsEmptyPresObj = sal_False ;
uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
2005-04-12 15:46:04 +00:00
if ( aShapeInfo . xCustomShapeReplacement . is ( ) )
xPropSet . clear ( ) ;
2001-06-27 14:23:12 +00:00
// prep text styles
if ( xPropSet . is ( ) & & bObjSupportsText )
{
uno : : Reference < text : : XText > xText ( xShape , uno : : UNO_QUERY ) ;
2012-01-25 17:00:07 -02:00
if ( xText . is ( ) & & ! xText - > getString ( ) . isEmpty ( ) )
2001-06-27 14:23:12 +00:00
{
uno : : Reference < beans : : XPropertySetInfo > xPropSetInfo ( xPropSet - > getPropertySetInfo ( ) ) ;
if ( xPropSetInfo . is ( ) & & xPropSetInfo - > hasPropertyByName ( msEmptyPres ) )
{
uno : : Any aAny = xPropSet - > getPropertyValue ( msEmptyPres ) ;
aAny > > = bIsEmptyPresObj ;
}
if ( ! bIsEmptyPresObj )
{
GetExport ( ) . GetTextParagraphExport ( ) - > collectTextAutoStyles ( xText ) ;
}
}
}
2001-02-02 10:14:37 +00:00
// compute the shape parent style
2003-03-27 17:21:03 +00:00
if ( xPropSet . is ( ) )
2000-09-18 16:07:07 +00:00
{
2006-06-19 17:12:03 +00:00
uno : : Reference < beans : : XPropertySetInfo > xPropertySetInfo ( xPropSet - > getPropertySetInfo ( ) ) ;
2001-02-02 10:14:37 +00:00
OUString aParentName ;
uno : : Reference < style : : XStyle > xStyle ;
2003-03-27 17:21:03 +00:00
if ( bObjSupportsStyle )
2001-02-02 10:14:37 +00:00
{
2013-06-29 21:24:12 +02:00
if ( xPropertySetInfo . is ( ) & & xPropertySetInfo - > hasPropertyByName ( " Style " ) )
xPropSet - > getPropertyValue ( " Style " ) > > = xStyle ;
2001-02-02 10:14:37 +00:00
2003-03-27 17:21:03 +00:00
if ( xStyle . is ( ) )
2001-02-02 10:14:37 +00:00
{
2003-03-27 17:21:03 +00:00
// get family ID
uno : : Reference < beans : : XPropertySet > xStylePropSet ( xStyle , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xStylePropSet . is ( ) , " style without a XPropertySet? " ) ;
2005-05-13 06:56:46 +00:00
try
2003-03-27 17:21:03 +00:00
{
2005-05-13 06:56:46 +00:00
if ( xStylePropSet . is ( ) )
{
OUString aFamilyName ;
2013-06-29 21:24:12 +02:00
xStylePropSet - > getPropertyValue ( " Family " ) > > = aFamilyName ;
2012-04-06 14:09:04 +02:00
if ( ! aFamilyName . isEmpty ( ) & & aFamilyName ! = " graphics " )
2005-05-13 06:56:46 +00:00
aShapeInfo . mnFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID ;
}
}
2011-06-16 00:26:29 +01:00
catch ( const beans : : UnknownPropertyException & )
2005-05-13 06:56:46 +00:00
{
// Ignored.
DBG_ASSERT ( false ,
" XMLShapeExport::collectShapeAutoStyles: style has no 'Family' property " ) ;
2003-03-27 17:21:03 +00:00
}
// get parent-style name
if ( XML_STYLE_FAMILY_SD_PRESENTATION_ID = = aShapeInfo . mnFamily )
{
aParentName = msPresentationStylePrefix ;
}
aParentName + = xStyle - > getName ( ) ;
2001-02-02 10:14:37 +00:00
}
}
2000-09-18 16:07:07 +00:00
// filter propset
2001-06-27 14:23:12 +00:00
std : : vector < XMLPropertyState > xPropStates ;
2000-09-18 16:07:07 +00:00
2001-06-27 14:23:12 +00:00
sal_Int32 nCount = 0 ;
2002-07-19 11:50:55 +00:00
if ( ( ! bIsEmptyPresObj | | ( aShapeInfo . meShapeType ! = XmlShapeTypePresPageShape ) ) )
2001-05-28 14:13:43 +00:00
{
2001-06-27 14:23:12 +00:00
xPropStates = GetPropertySetMapper ( ) - > Filter ( xPropSet ) ;
2001-05-28 14:13:43 +00:00
2001-06-27 14:23:12 +00:00
if ( XmlShapeTypeDrawControlShape = = aShapeInfo . meShapeType )
{
// for control shapes, we additionally need the number format style (if any)
uno : : Reference < drawing : : XControlShape > xControl ( xShape , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xControl . is ( ) , " XMLShapeExport::collectShapeAutoStyles: ShapeType control, but no XControlShape! " ) ;
if ( xControl . is ( ) )
2001-05-28 14:13:43 +00:00
{
2001-06-27 14:23:12 +00:00
uno : : Reference < beans : : XPropertySet > xControlModel ( xControl - > getControl ( ) , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xControlModel . is ( ) , " XMLShapeExport::collectShapeAutoStyles: no control model on the control shape! " ) ;
2013-04-07 12:06:47 +02:00
OUString sNumberStyle = mrExport . GetFormExport ( ) - > getControlNumberStyle ( xControlModel ) ;
2012-01-25 17:00:07 -02:00
if ( ! sNumberStyle . isEmpty ( ) )
2001-06-27 14:23:12 +00:00
{
sal_Int32 nIndex = GetPropertySetMapper ( ) - > getPropertySetMapper ( ) - > FindEntryIndex ( CTF_SD_CONTROL_SHAPE_DATA_STYLE ) ;
2008-12-16 13:30:53 +00:00
// TODO : this retrieval of the index could be moved into the ctor, holding the index
2001-06-27 14:23:12 +00:00
// as member, thus saving time.
DBG_ASSERT ( - 1 ! = nIndex , " XMLShapeExport::collectShapeAutoStyles: could not obtain the index for our context id! " ) ;
XMLPropertyState aNewState ( nIndex , uno : : makeAny ( sNumberStyle ) ) ;
xPropStates . push_back ( aNewState ) ;
}
2001-05-28 14:13:43 +00:00
}
}
2001-06-27 14:23:12 +00:00
std : : vector < XMLPropertyState > : : iterator aIter = xPropStates . begin ( ) ;
std : : vector < XMLPropertyState > : : iterator aEnd = xPropStates . end ( ) ;
while ( aIter ! = aEnd )
{
if ( aIter - > mnIndex ! = - 1 )
nCount + + ;
2010-12-23 15:05:01 +00:00
+ + aIter ;
2001-06-27 14:23:12 +00:00
}
2001-02-02 10:14:37 +00:00
}
if ( nCount = = 0 )
{
// no hard attributes, use parent style name for export
aShapeInfo . msStyleName = aParentName ;
}
else
2000-09-18 16:07:07 +00:00
{
// there are filtered properties -> hard attributes
// try to find this style in AutoStylePool
2006-06-19 17:12:03 +00:00
aShapeInfo . msStyleName = mrExport . GetAutoStylePool ( ) - > Find ( aShapeInfo . mnFamily , aParentName , xPropStates ) ;
2000-09-18 16:07:07 +00:00
2012-01-25 17:00:07 -02:00
if ( aShapeInfo . msStyleName . isEmpty ( ) )
2000-09-18 16:07:07 +00:00
{
// Style did not exist, add it to AutoStalePool
2006-06-19 17:12:03 +00:00
aShapeInfo . msStyleName = mrExport . GetAutoStylePool ( ) - > Add ( aShapeInfo . mnFamily , aParentName , xPropStates ) ;
2000-09-18 16:07:07 +00:00
}
}
2001-06-01 11:32:48 +00:00
// optionaly generate auto style for text attributes
2001-11-30 13:12:36 +00:00
if ( ( ! bIsEmptyPresObj | | ( aShapeInfo . meShapeType ! = XmlShapeTypePresPageShape ) ) & & bObjSupportsText )
2001-06-01 11:32:48 +00:00
{
xPropStates = GetExport ( ) . GetTextParagraphExport ( ) - > GetParagraphPropertyMapper ( ) - > Filter ( xPropSet ) ;
2002-11-06 09:35:40 +00:00
// yet more additionally, we need to care for the ParaAdjust property
if ( XmlShapeTypeDrawControlShape = = aShapeInfo . meShapeType )
{
uno : : Reference < beans : : XPropertySetInfo > xPropSetInfo ( xPropSet - > getPropertySetInfo ( ) ) ;
2005-01-21 15:49:08 +00:00
uno : : Reference < beans : : XPropertyState > xPropState ( xPropSet , uno : : UNO_QUERY ) ;
if ( xPropSetInfo . is ( ) & & xPropState . is ( ) )
2002-11-06 09:35:40 +00:00
{
2005-01-21 15:49:08 +00:00
// this is because:
// * if controls shapes have a ParaAdjust property, then this is the Align property of the control model
// * control models are allowed to have an Align of "void"
// * the Default for control model's Align is TextAlign_LEFT
// * defaults for style properties are not written, but we need to write the "left",
// because we need to distiguish this "left" from the case where not align attribute
// is present which means "void"
2013-04-07 12:06:47 +02:00
static const OUString s_sParaAdjustPropertyName ( " ParaAdjust " ) ;
2005-01-21 15:49:08 +00:00
if ( xPropSetInfo - > hasPropertyByName ( s_sParaAdjustPropertyName )
& & ( beans : : PropertyState_DEFAULT_VALUE = = xPropState - > getPropertyState ( s_sParaAdjustPropertyName ) )
)
2002-11-06 09:35:40 +00:00
{
sal_Int32 nIndex = GetExport ( ) . GetTextParagraphExport ( ) - > GetParagraphPropertyMapper ( ) - > getPropertySetMapper ( ) - > FindEntryIndex ( CTF_SD_SHAPE_PARA_ADJUST ) ;
// TODO : this retrieval of the index should be moved into the ctor, holding the index
// as member, thus saving time.
DBG_ASSERT ( - 1 ! = nIndex , " XMLShapeExport::collectShapeAutoStyles: could not obtain the index for the ParaAdjust context id! " ) ;
uno : : Any aParaAdjustValue = xPropSet - > getPropertyValue ( s_sParaAdjustPropertyName ) ;
XMLPropertyState aAlignDefaultState ( nIndex , aParaAdjustValue ) ;
xPropStates . push_back ( aAlignDefaultState ) ;
}
}
}
2001-06-01 11:32:48 +00:00
nCount = 0 ;
2001-06-27 14:23:12 +00:00
std : : vector < XMLPropertyState > : : iterator aIter = xPropStates . begin ( ) ;
std : : vector < XMLPropertyState > : : iterator aEnd = xPropStates . end ( ) ;
2001-06-01 11:32:48 +00:00
while ( aIter ! = aEnd )
{
if ( aIter - > mnIndex ! = - 1 )
nCount + + ;
2010-12-23 15:05:01 +00:00
+ + aIter ;
2001-06-01 11:32:48 +00:00
}
if ( nCount )
{
const OUString aEmpty ;
2006-06-19 17:12:03 +00:00
aShapeInfo . msTextStyleName = mrExport . GetAutoStylePool ( ) - > Find ( XML_STYLE_FAMILY_TEXT_PARAGRAPH , aEmpty , xPropStates ) ;
2012-01-25 17:00:07 -02:00
if ( aShapeInfo . msTextStyleName . isEmpty ( ) )
2001-06-01 11:32:48 +00:00
{
// Style did not exist, add it to AutoStalePool
2006-06-19 17:12:03 +00:00
aShapeInfo . msTextStyleName = mrExport . GetAutoStylePool ( ) - > Add ( XML_STYLE_FAMILY_TEXT_PARAGRAPH , aEmpty , xPropStates ) ;
2001-06-01 11:32:48 +00:00
}
}
}
2000-09-18 16:07:07 +00:00
}
2013-02-28 18:11:24 -04:00
// prepare animation information if needed
2002-06-17 13:14:39 +00:00
if ( mxAnimationsExporter . is ( ) )
2006-06-19 17:12:03 +00:00
mxAnimationsExporter - > prepare ( xShape , mrExport ) ;
2002-06-17 13:14:39 +00:00
2008-03-12 09:35:17 +00:00
// check for special shapes
switch ( aShapeInfo . meShapeType )
2000-11-26 18:48:02 +00:00
{
2008-03-12 09:35:17 +00:00
case XmlShapeTypeDrawConnectorShape :
{
uno : : Reference < uno : : XInterface > xConnection ;
2000-11-26 18:48:02 +00:00
2008-03-12 09:35:17 +00:00
// create shape ids for export later
xPropSet - > getPropertyValue ( msStartShape ) > > = xConnection ;
if ( xConnection . is ( ) )
mrExport . getInterfaceToIdentifierMapper ( ) . registerReference ( xConnection ) ;
2004-11-26 18:33:11 +00:00
2008-03-12 09:35:17 +00:00
xPropSet - > getPropertyValue ( msEndShape ) > > = xConnection ;
if ( xConnection . is ( ) )
mrExport . getInterfaceToIdentifierMapper ( ) . registerReference ( xConnection ) ;
break ;
}
2010-02-24 13:11:19 +01:00
case XmlShapeTypePresTableShape :
2008-03-12 09:35:17 +00:00
case XmlShapeTypeDrawTableShape :
{
try
{
uno : : Reference < table : : XColumnRowRange > xRange ( xSet - > getPropertyValue ( msModel ) , uno : : UNO_QUERY_THROW ) ;
GetShapeTableExport ( ) - > collectTableAutoStyles ( xRange ) ;
}
2011-06-16 00:26:29 +01:00
catch ( const uno : : Exception & )
2008-03-12 09:35:17 +00:00
{
2011-03-01 19:07:44 +01:00
OSL_FAIL ( " XMLShapeExport::collectShapeAutoStyles(): exception caught while collection auto styles for a table! " ) ;
2008-03-12 09:35:17 +00:00
}
break ;
}
default :
break ;
2000-11-26 18:48:02 +00:00
}
2001-02-02 10:14:37 +00:00
maShapeInfos . push_back ( aShapeInfo ) ;
maCurrentInfo = maShapeInfos . begin ( ) ;
// check for shape collections (group shape or 3d scene)
// and collect contained shapes style infos
2005-04-12 15:46:04 +00:00
const uno : : Reference < drawing : : XShape > & xCollection = aShapeInfo . xCustomShapeReplacement . is ( )
? aShapeInfo . xCustomShapeReplacement : xShape ;
2001-02-02 10:14:37 +00:00
{
2005-04-12 15:46:04 +00:00
uno : : Reference < drawing : : XShapes > xShapes ( xCollection , uno : : UNO_QUERY ) ;
2001-02-02 10:14:37 +00:00
if ( xShapes . is ( ) )
{
collectShapesAutoStyles ( xShapes ) ;
}
}
2000-09-18 16:07:07 +00:00
}
2008-06-13 08:18:48 +00:00
namespace
{
class NewTextListsHelper
{
public :
NewTextListsHelper ( SvXMLExport & rExp )
: mrExport ( rExp )
{
mrExport . GetTextParagraphExport ( ) - > PushNewTextListsHelper ( ) ;
}
~ NewTextListsHelper ( )
{
mrExport . GetTextParagraphExport ( ) - > PopTextListsHelper ( ) ;
}
private :
SvXMLExport & mrExport ;
} ;
}
2000-09-18 16:07:07 +00:00
// This method exports the given XShape
2000-11-06 11:58:31 +00:00
void XMLShapeExport : : exportShape ( const uno : : Reference < drawing : : XShape > & xShape ,
sal_Int32 nFeatures /* = SEF_DEFAULT */ ,
2004-11-09 11:15:51 +00:00
com : : sun : : star : : awt : : Point * pRefPoint /* = NULL */ ,
SvXMLAttributeList * pAttrList /* = NULL */ )
2000-09-18 16:07:07 +00:00
{
2013-01-09 04:45:22 +01:00
SAL_WARN ( " xmloff " , xShape - > getShapeType ( ) ) ;
2001-03-08 13:33:34 +00:00
if ( maCurrentShapesIter = = maShapesInfos . end ( ) )
2000-09-18 16:07:07 +00:00
{
2013-01-09 04:45:22 +01:00
SAL_WARN ( " xmloff " , " XMLShapeExport::exportShape(): no auto styles where collected before export " ) ;
2001-02-02 10:14:37 +00:00
return ;
}
2001-03-08 13:33:34 +00:00
sal_Int32 nZIndex = 0 ;
uno : : Reference < beans : : XPropertySet > xSet ( xShape , uno : : UNO_QUERY ) ;
2010-02-22 18:27:09 +01:00
2014-02-26 17:20:31 +09:00
boost : : scoped_ptr < SvXMLElementExport > mpHyperlinkElement ;
2010-02-22 18:27:09 +01:00
// export hyperlinks with <a><shape/></a>. Currently only in draw since draw
// does not support document events
if ( xSet . is ( ) & & ( GetExport ( ) . GetModelType ( ) = = SvtModuleOptions : : E_DRAW ) ) try
{
presentation : : ClickAction eAction = presentation : : ClickAction_NONE ;
2013-06-29 21:24:12 +02:00
xSet - > getPropertyValue ( " OnClick " ) > > = eAction ;
2010-02-22 18:27:09 +01:00
if ( ( eAction = = presentation : : ClickAction_DOCUMENT ) | |
( eAction = = presentation : : ClickAction_BOOKMARK ) )
{
OUString sURL ;
xSet - > getPropertyValue ( msBookmark ) > > = sURL ;
2012-01-25 17:00:07 -02:00
if ( ! sURL . isEmpty ( ) )
2010-02-22 18:27:09 +01:00
{
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 ) ;
2014-03-28 16:28:51 +02:00
mpHyperlinkElement . reset ( new SvXMLElementExport ( mrExport , XML_NAMESPACE_DRAW , XML_A , true , true ) ) ;
2010-02-22 18:27:09 +01:00
}
}
}
2011-06-16 00:26:29 +01:00
catch ( const uno : : Exception & )
2010-02-22 18:27:09 +01:00
{
2013-01-09 04:45:22 +01:00
SAL_WARN ( " xmloff " , " XMLShapeExport::exportShape(): exception during hyperlink export " ) ;
2010-02-22 18:27:09 +01:00
}
2001-03-08 13:33:34 +00:00
if ( xSet . is ( ) )
xSet - > getPropertyValue ( msZIndex ) > > = nZIndex ;
2002-04-17 10:42:15 +00:00
ImplXMLShapeExportInfoVector & aShapeInfoVector = ( * maCurrentShapesIter ) . second ;
2004-11-26 18:33:11 +00:00
if ( ( sal_Int32 ) aShapeInfoVector . size ( ) < = nZIndex )
2002-04-17 10:42:15 +00:00
{
2013-01-09 04:45:22 +01:00
SAL_WARN ( " xmloff " , " XMLShapeExport::exportShape(): no shape info collected for a given shape " ) ;
2002-04-17 10:42:15 +00:00
return ;
}
2008-06-13 08:18:48 +00:00
NewTextListsHelper aNewTextListsHelper ( mrExport ) ;
2002-04-17 10:42:15 +00:00
const ImplXMLShapeExportInfo & aShapeInfo = aShapeInfoVector [ nZIndex ] ;
2001-03-08 13:33:34 +00:00
2009-07-10 14:03:42 +02:00
# ifdef DBG_UTIL
2001-03-08 13:33:34 +00:00
// check if this is the correct ShapesInfo
uno : : Reference < container : : XChild > xChild ( xShape , uno : : UNO_QUERY ) ;
if ( xChild . is ( ) )
{
uno : : Reference < drawing : : XShapes > xParent ( xChild - > getParent ( ) , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xParent . is ( ) & & xParent . get ( ) = = ( * maCurrentShapesIter ) . first . get ( ) , " XMLShapeExport::exportShape(): Wrong call to XMLShapeExport::seekShapes() " ) ;
}
2000-09-18 16:07:07 +00:00
2001-02-02 10:14:37 +00:00
// first compute the shapes type
{
2000-09-18 16:07:07 +00:00
XmlShapeType eShapeType ( XmlShapeTypeNotYetSet ) ;
2001-02-02 10:14:37 +00:00
ImpCalcShapeType ( xShape , eShapeType ) ;
2000-11-26 18:48:02 +00:00
2013-01-09 04:45:22 +01:00
SAL_WARN_IF ( eShapeType ! = aShapeInfo . meShapeType , " xmloff " , " exportShape callings do not correspond to collectShapeAutoStyles calls!: " < < xShape - > getShapeType ( ) ) ;
2001-02-02 10:14:37 +00:00
}
# endif
2013-02-28 18:11:24 -04:00
// collect animation information if needed
2001-02-02 11:21:59 +00:00
if ( mxAnimationsExporter . is ( ) )
2006-06-19 17:12:03 +00:00
mxAnimationsExporter - > collect ( xShape , mrExport ) ;
2001-02-02 11:21:59 +00:00
2010-11-09 01:42:14 +05:00
/* Export shapes name if he has one (#i51726#)
Export of the shape name for text documents only if the OpenDocument
file format is written - exceptions are group shapes .
Note : Writer documents in OpenOffice . org file format doesn ' t contain
any names for shapes , except for group shapes .
*/
2001-02-02 10:14:37 +00:00
{
2006-03-27 09:04:25 +00:00
if ( ( GetExport ( ) . GetModelType ( ) ! = SvtModuleOptions : : E_WRITER & &
GetExport ( ) . GetModelType ( ) ! = SvtModuleOptions : : E_WRITERWEB & &
GetExport ( ) . GetModelType ( ) ! = SvtModuleOptions : : E_WRITERGLOBAL ) | |
( GetExport ( ) . getExportFlags ( ) & EXPORT_OASIS ) ! = 0 | |
aShapeInfo . meShapeType = = XmlShapeTypeDrawGroupShape | |
( aShapeInfo . meShapeType = = XmlShapeTypeDrawCustomShape & &
aShapeInfo . xCustomShapeReplacement . is ( ) ) )
2000-12-07 17:45:57 +00:00
{
2006-03-27 09:04:25 +00:00
uno : : Reference < container : : XNamed > xNamed ( xShape , uno : : UNO_QUERY ) ;
if ( xNamed . is ( ) )
{
const OUString aName ( xNamed - > getName ( ) ) ;
2012-01-25 17:00:07 -02:00
if ( ! aName . isEmpty ( ) )
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_NAME , aName ) ;
2006-03-27 09:04:25 +00:00
}
2000-12-07 17:45:57 +00:00
}
2001-02-02 10:14:37 +00:00
}
// export style name
2012-01-25 17:00:07 -02:00
if ( ! aShapeInfo . msStyleName . isEmpty ( ) )
2001-02-02 10:14:37 +00:00
{
if ( XML_STYLE_FAMILY_SD_GRAPHICS_ID = = aShapeInfo . mnFamily )
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_STYLE_NAME , mrExport . EncodeStyleName ( aShapeInfo . msStyleName ) ) ;
2000-12-07 17:45:57 +00:00
else
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_STYLE_NAME , mrExport . EncodeStyleName ( aShapeInfo . msStyleName ) ) ;
2001-02-02 10:14:37 +00:00
}
2001-06-01 11:32:48 +00:00
// export text style name
2012-01-25 17:00:07 -02:00
if ( ! aShapeInfo . msTextStyleName . isEmpty ( ) )
2001-06-01 11:32:48 +00:00
{
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_TEXT_STYLE_NAME , aShapeInfo . msTextStyleName ) ;
2001-06-01 11:32:48 +00:00
}
2001-02-02 10:14:37 +00:00
// export shapes id if needed
{
2004-11-26 18:33:11 +00:00
uno : : Reference < uno : : XInterface > xRef ( xShape , uno : : UNO_QUERY ) ;
2006-06-19 17:12:03 +00:00
const OUString & rShapeId = mrExport . getInterfaceToIdentifierMapper ( ) . getIdentifier ( xRef ) ;
2012-01-25 17:00:07 -02:00
if ( ! rShapeId . isEmpty ( ) )
2010-04-19 18:27:16 +02:00
{
mrExport . AddAttributeIdLegacy ( XML_NAMESPACE_DRAW , rShapeId ) ;
}
2001-02-02 10:14:37 +00:00
}
// export layer information
if ( IsLayerExportEnabled ( ) )
{
2001-05-28 12:32:20 +00:00
// check for group or scene shape and not export layer if this is one
uno : : Reference < drawing : : XShapes > xShapes ( xShape , uno : : UNO_QUERY ) ;
if ( ! xShapes . is ( ) )
2001-02-02 10:14:37 +00:00
{
2001-05-28 12:32:20 +00:00
try
{
uno : : Reference < beans : : XPropertySet > xProps ( xShape , uno : : UNO_QUERY ) ;
OUString aLayerName ;
2013-06-29 21:24:12 +02:00
xProps - > getPropertyValue ( " LayerName " ) > > = aLayerName ;
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_LAYER , aLayerName ) ;
2001-02-02 10:14:37 +00:00
2001-05-28 12:32:20 +00:00
}
2011-08-11 09:42:02 +01:00
catch ( const uno : : Exception & )
2001-05-28 12:32:20 +00:00
{
2011-03-01 19:07:44 +01:00
OSL_FAIL ( " could not export layer name for shape! " ) ;
2001-05-28 12:32:20 +00:00
}
2001-02-02 10:14:37 +00:00
}
}
2010-03-02 19:50:13 +01:00
// export draw:display (do not export in ODF 1.2 or older)
if ( xSet . is ( ) & & ( mrExport . getDefaultVersion ( ) > SvtSaveOptions : : ODFVER_012 ) )
{
2010-03-04 16:38:48 +01:00
if ( aShapeInfo . meShapeType ! = XmlShapeTypeDrawPageShape & & aShapeInfo . meShapeType ! = XmlShapeTypePresPageShape & &
2011-01-07 17:09:35 +01:00
aShapeInfo . meShapeType ! = XmlShapeTypeHandoutShape & & aShapeInfo . meShapeType ! = XmlShapeTypeDrawChartShape )
2010-03-04 16:38:48 +01:00
2010-03-02 19:50:13 +01:00
try
{
sal_Bool bVisible = sal_True ;
sal_Bool bPrintable = sal_True ;
xSet - > getPropertyValue ( msVisible ) > > = bVisible ;
xSet - > getPropertyValue ( msPrintable ) > > = bPrintable ;
XMLTokenEnum eDisplayToken = XML_TOKEN_INVALID ;
2010-03-04 16:38:48 +01:00
const unsigned short nDisplay = ( bVisible ? 2 : 0 ) | ( bPrintable ? 1 : 0 ) ;
switch ( nDisplay )
2010-03-02 19:50:13 +01:00
{
case 0 : eDisplayToken = XML_NONE ; break ;
case 1 : eDisplayToken = XML_PRINTER ; break ;
case 2 : eDisplayToken = XML_SCREEN ; break ;
// case 3: eDisplayToken = XML_ALWAYS break; this is the default
}
if ( eDisplayToken ! = XML_TOKEN_INVALID )
mrExport . AddAttribute ( XML_NAMESPACE_DRAW_EXT , XML_DISPLAY , eDisplayToken ) ;
}
2011-06-16 00:26:29 +01:00
catch ( const uno : : Exception & )
2010-03-02 19:50:13 +01:00
{
2011-03-01 19:07:44 +01:00
OSL_FAIL ( " XMLShapeExport::exportShape(), exception caught! " ) ;
2010-03-02 19:50:13 +01:00
}
}
2001-05-14 13:43:26 +00:00
// #82003# test export count
2001-10-01 10:44:14 +00:00
// #91587# ALWAYS increment since now ALL to be exported shapes are counted.
2006-06-19 17:12:03 +00:00
if ( mrExport . GetShapeExport ( ) - > IsHandleProgressBarEnabled ( ) )
2001-05-14 13:43:26 +00:00
{
2006-06-19 17:12:03 +00:00
mrExport . GetProgressBarHelper ( ) - > Increment ( ) ;
2001-05-14 13:43:26 +00:00
}
2002-05-28 08:28:05 +00:00
onExport ( xShape ) ;
2001-02-02 10:14:37 +00:00
// export shape element
switch ( aShapeInfo . meShapeType )
{
case XmlShapeTypeDrawRectangleShape :
{
ImpExportRectangleShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawEllipseShape :
{
ImpExportEllipseShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawLineShape :
{
ImpExportLineShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawPolyPolygonShape : // closed PolyPolygon
case XmlShapeTypeDrawPolyLineShape : // open PolyPolygon
case XmlShapeTypeDrawClosedBezierShape : // closed PolyPolygon containing curves
case XmlShapeTypeDrawOpenBezierShape : // open PolyPolygon containing curves
{
ImpExportPolygonShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawTextShape :
case XmlShapeTypePresTitleTextShape :
case XmlShapeTypePresOutlinerShape :
case XmlShapeTypePresSubtitleShape :
case XmlShapeTypePresNotesShape :
2004-03-30 15:15:01 +00:00
case XmlShapeTypePresHeaderShape :
case XmlShapeTypePresFooterShape :
case XmlShapeTypePresSlideNumberShape :
case XmlShapeTypePresDateTimeShape :
2001-02-02 10:14:37 +00:00
{
ImpExportTextBoxShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawGraphicObjectShape :
case XmlShapeTypePresGraphicObjectShape :
{
ImpExportGraphicObjectShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawChartShape :
case XmlShapeTypePresChartShape :
{
2004-11-09 11:15:51 +00:00
ImpExportChartShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint , pAttrList ) ;
2001-02-02 10:14:37 +00:00
break ;
}
case XmlShapeTypeDrawControlShape :
{
ImpExportControlShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawConnectorShape :
{
ImpExportConnectorShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawMeasureShape :
{
ImpExportMeasureShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawOLE2Shape :
case XmlShapeTypePresOLE2Shape :
2008-03-12 09:35:17 +00:00
case XmlShapeTypeDrawSheetShape :
case XmlShapeTypePresSheetShape :
2001-02-02 10:14:37 +00:00
{
ImpExportOLE2Shape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
2010-02-23 00:23:09 +01:00
case XmlShapeTypePresTableShape :
2008-03-12 09:35:17 +00:00
case XmlShapeTypeDrawTableShape :
{
ImpExportTableShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
2001-02-02 10:14:37 +00:00
case XmlShapeTypeDrawPageShape :
case XmlShapeTypePresPageShape :
2001-05-28 12:32:20 +00:00
case XmlShapeTypeHandoutShape :
2001-02-02 10:14:37 +00:00
{
ImpExportPageShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawCaptionShape :
{
ImpExportCaptionShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDraw3DCubeObject :
case XmlShapeTypeDraw3DSphereObject :
case XmlShapeTypeDraw3DLatheObject :
case XmlShapeTypeDraw3DExtrudeObject :
{
ImpExport3DShape ( xShape , aShapeInfo . meShapeType ) ;
break ;
}
case XmlShapeTypeDraw3DSceneObject :
2000-12-07 17:45:57 +00:00
{
2001-02-02 10:14:37 +00:00
ImpExport3DSceneShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
2000-12-07 17:45:57 +00:00
}
2001-02-02 10:14:37 +00:00
case XmlShapeTypeDrawGroupShape :
{
// empty group
ImpExportGroupShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawFrameShape :
2001-04-30 08:02:17 +00:00
{
ImpExportFrameShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawAppletShape :
{
ImpExportAppletShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
case XmlShapeTypeDrawPluginShape :
{
ImpExportPluginShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
2004-04-02 12:53:00 +00:00
case XmlShapeTypeDrawCustomShape :
{
2005-04-12 15:46:04 +00:00
if ( aShapeInfo . xCustomShapeReplacement . is ( ) )
ImpExportGroupShape ( aShapeInfo . xCustomShapeReplacement , XmlShapeTypeDrawGroupShape , nFeatures , pRefPoint ) ;
else
ImpExportCustomShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
2004-04-02 12:53:00 +00:00
break ;
}
2010-02-23 00:23:09 +01:00
case XmlShapeTypePresMediaShape :
2004-08-12 07:50:03 +00:00
case XmlShapeTypeDrawMediaShape :
{
ImpExportMediaShape ( xShape , aShapeInfo . meShapeType , nFeatures , pRefPoint ) ;
break ;
}
2001-04-30 08:02:17 +00:00
case XmlShapeTypePresOrgChartShape :
2001-02-02 10:14:37 +00:00
case XmlShapeTypeUnknown :
case XmlShapeTypeNotYetSet :
default :
{
// this should never happen and is an error
2011-03-01 19:07:44 +01:00
OSL_FAIL ( " XMLEXP: WriteShape: unknown or unexpected type of shape in export! " ) ;
2001-02-02 10:14:37 +00:00
break ;
}
}
2002-02-14 06:13:57 +00:00
2010-02-22 18:27:09 +01:00
mpHyperlinkElement . reset ( ) ;
2002-02-14 06:13:57 +00:00
// #97489# #97111#
// if there was an error and no element for the shape was exported
// we need to clear the attribute list or the attributes will be
// set on the next exported element, which can result in corrupt
// xml files due to duplicate attributes
2006-06-19 17:12:03 +00:00
mrExport . CheckAttrList ( ) ; // asserts in non pro if we have attributes left
mrExport . ClearAttrList ( ) ; // clears the attributes
2001-02-02 10:14:37 +00:00
}
// This method collects all automatic styles for the shapes inside the given XShapes collection
void XMLShapeExport : : collectShapesAutoStyles ( const uno : : Reference < drawing : : XShapes > & xShapes )
{
2001-03-08 13:33:34 +00:00
ShapesInfos : : iterator aOldCurrentShapesIter = maCurrentShapesIter ;
seekShapes ( xShapes ) ;
2001-02-02 10:14:37 +00:00
uno : : Reference < drawing : : XShape > xShape ;
const sal_Int32 nShapeCount ( xShapes - > getCount ( ) ) ;
for ( sal_Int32 nShapeId = 0 ; nShapeId < nShapeCount ; nShapeId + + )
{
xShapes - > getByIndex ( nShapeId ) > > = xShape ;
2013-01-09 04:45:22 +01:00
SAL_WARN_IF ( ! xShape . is ( ) , " xmloff " , " Shape without a XShape? " ) ;
2001-02-02 10:14:37 +00:00
if ( ! xShape . is ( ) )
continue ;
collectShapeAutoStyles ( xShape ) ;
2000-09-18 16:07:07 +00:00
}
2001-03-08 13:33:34 +00:00
maCurrentShapesIter = aOldCurrentShapesIter ;
2000-09-18 16:07:07 +00:00
}
2001-02-02 10:14:37 +00:00
// This method exports all XShape inside the given XShapes collection
void XMLShapeExport : : exportShapes ( const uno : : Reference < drawing : : XShapes > & xShapes , sal_Int32 nFeatures /* = SEF_DEFAULT */ , awt : : Point * pRefPoint /* = NULL */ )
{
2001-03-08 13:33:34 +00:00
ShapesInfos : : iterator aOldCurrentShapesIter = maCurrentShapesIter ;
seekShapes ( xShapes ) ;
2001-02-02 10:14:37 +00:00
uno : : Reference < drawing : : XShape > xShape ;
const sal_Int32 nShapeCount ( xShapes - > getCount ( ) ) ;
for ( sal_Int32 nShapeId = 0 ; nShapeId < nShapeCount ; nShapeId + + )
{
xShapes - > getByIndex ( nShapeId ) > > = xShape ;
2013-01-09 04:45:22 +01:00
SAL_WARN_IF ( ! xShape . is ( ) , " xmloff " , " Shape without a XShape? " ) ;
2001-02-02 10:14:37 +00:00
if ( ! xShape . is ( ) )
continue ;
exportShape ( xShape , nFeatures , pRefPoint ) ;
}
2001-03-08 13:33:34 +00:00
maCurrentShapesIter = aOldCurrentShapesIter ;
}
void XMLShapeExport : : seekShapes ( const uno : : Reference < drawing : : XShapes > & xShapes ) throw ( )
{
if ( xShapes . is ( ) )
{
maCurrentShapesIter = maShapesInfos . find ( xShapes ) ;
if ( maCurrentShapesIter = = maShapesInfos . end ( ) )
{
ImplXMLShapeExportInfoVector aNewInfoVector ;
aNewInfoVector . resize ( ( ShapesInfos : : size_type ) xShapes - > getCount ( ) ) ;
maShapesInfos [ xShapes ] = aNewInfoVector ;
maCurrentShapesIter = maShapesInfos . find ( xShapes ) ;
DBG_ASSERT ( maCurrentShapesIter ! = maShapesInfos . end ( ) , " XMLShapeExport::seekShapes(): insert into stl::map failed " ) ;
}
DBG_ASSERT ( ( * maCurrentShapesIter ) . second . size ( ) = = ( ShapesInfos : : size_type ) xShapes - > getCount ( ) , " XMLShapeExport::seekShapes(): XShapes size varied between calls " ) ;
}
else
{
maCurrentShapesIter = maShapesInfos . end ( ) ;
}
2001-02-02 10:14:37 +00:00
}
2000-09-18 16:07:07 +00:00
void XMLShapeExport : : exportAutoStyles ( )
{
// export all autostyle infos
// ...for graphic
{
GetExport ( ) . GetAutoStylePool ( ) - > exportXML (
2001-10-25 19:57:03 +00:00
XML_STYLE_FAMILY_SD_GRAPHICS_ID
, GetExport ( ) . GetDocHandler ( ) ,
2000-09-18 16:07:07 +00:00
GetExport ( ) . GetMM100UnitConverter ( ) ,
2001-10-25 19:57:03 +00:00
GetExport ( ) . GetNamespaceMap ( )
) ;
2000-09-18 16:07:07 +00:00
}
// ...for presentation
{
GetExport ( ) . GetAutoStylePool ( ) - > exportXML (
2001-10-25 19:57:03 +00:00
XML_STYLE_FAMILY_SD_PRESENTATION_ID
, GetExport ( ) . GetDocHandler ( ) ,
2000-09-18 16:07:07 +00:00
GetExport ( ) . GetMM100UnitConverter ( ) ,
2001-10-25 19:57:03 +00:00
GetExport ( ) . GetNamespaceMap ( )
) ;
2000-09-18 16:07:07 +00:00
}
2008-03-12 09:35:17 +00:00
if ( mxShapeTableExport . is ( ) )
mxShapeTableExport - > exportAutoStyles ( ) ;
2000-09-18 16:07:07 +00:00
}
2001-01-11 15:29:06 +00:00
/// returns the export property mapper for external chaining
SvXMLExportPropertyMapper * XMLShapeExport : : CreateShapePropMapper (
SvXMLExport & rExport )
{
2005-09-05 13:54:30 +00:00
UniReference < XMLPropertyHandlerFactory > xFactory = new XMLSdPropHdlFactory ( rExport . GetModel ( ) , rExport ) ;
2013-12-20 03:17:14 +01:00
UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper ( xFactory , true ) ;
2013-03-18 10:53:00 +00:00
rExport . GetTextParagraphExport ( ) ; // get or create text paragraph export
2001-01-17 13:46:32 +00:00
SvXMLExportPropertyMapper * pResult =
2012-08-15 16:18:53 +02:00
new XMLShapeExportPropertyMapper ( xMapper , rExport ) ;
2001-01-17 13:46:32 +00:00
// chain text attributes
return pResult ;
2001-01-11 15:29:06 +00:00
}
2001-02-02 10:14:37 +00:00
void XMLShapeExport : : ImpCalcShapeType ( const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType & eShapeType )
{
// set in every case, so init here
eShapeType = XmlShapeTypeUnknown ;
uno : : Reference < drawing : : XShapeDescriptor > xShapeDescriptor ( xShape , uno : : UNO_QUERY ) ;
if ( xShapeDescriptor . is ( ) )
{
2012-11-25 00:33:44 -06:00
OUString aType ( xShapeDescriptor - > getShapeType ( ) ) ;
2001-02-02 10:14:37 +00:00
2012-11-25 00:33:44 -06:00
if ( aType . match ( " com.sun.star. " ) )
2001-02-02 10:14:37 +00:00
{
2012-11-25 00:33:44 -06:00
if ( aType . match ( " drawing. " , 13 ) )
2001-02-02 10:14:37 +00:00
{
// drawing shapes
2012-11-25 00:33:44 -06:00
if ( aType . match ( " Rectangle " , 21 ) ) { eShapeType = XmlShapeTypeDrawRectangleShape ; }
2006-12-12 14:49:10 +00:00
// #i72177# Note: Correcting CustomShape, CustomShape->Custom, len from 9 (was wrong anyways) to 6.
// As can be seen at the other compares, the appendix "Shape" is left out of the comparison.
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " Custom " , 21 ) ) { eShapeType = XmlShapeTypeDrawCustomShape ; }
2006-12-12 14:49:10 +00:00
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " Ellipse " , 21 ) ) { eShapeType = XmlShapeTypeDrawEllipseShape ; }
else if ( aType . match ( " Control " , 21 ) ) { eShapeType = XmlShapeTypeDrawControlShape ; }
else if ( aType . match ( " Connector " , 21 ) ) { eShapeType = XmlShapeTypeDrawConnectorShape ; }
2013-05-03 17:50:22 +02:00
else if ( aType . match ( " Measure " , 21 ) ) { eShapeType = XmlShapeTypeDrawMeasureShape ; }
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " Line " , 21 ) ) { eShapeType = XmlShapeTypeDrawLineShape ; }
2006-12-12 14:49:10 +00:00
// #i72177# Note: This covers two types by purpose, PolyPolygonShape and PolyPolygonPathShape
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " PolyPolygon " , 21 ) ) { eShapeType = XmlShapeTypeDrawPolyPolygonShape ; }
2006-12-12 14:49:10 +00:00
// #i72177# Note: This covers two types by purpose, PolyLineShape and PolyLinePathShape
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " PolyLine " , 21 ) ) { eShapeType = XmlShapeTypeDrawPolyLineShape ; }
2006-12-12 14:49:10 +00:00
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " OpenBezier " , 21 ) ) { eShapeType = XmlShapeTypeDrawOpenBezierShape ; }
else if ( aType . match ( " ClosedBezier " , 21 ) ) { eShapeType = XmlShapeTypeDrawClosedBezierShape ; }
2006-12-12 14:49:10 +00:00
// #i72177# FreeHand (opened and closed) now supports the types OpenFreeHandShape and
// ClosedFreeHandShape respectively. Represent them as bezier shapes
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " OpenFreeHand " , 21 ) ) { eShapeType = XmlShapeTypeDrawOpenBezierShape ; }
else if ( aType . match ( " ClosedFreeHand " , 21 ) ) { eShapeType = XmlShapeTypeDrawClosedBezierShape ; }
2006-12-12 14:49:10 +00:00
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " GraphicObject " , 21 ) ) { eShapeType = XmlShapeTypeDrawGraphicObjectShape ; }
else if ( aType . match ( " Group " , 21 ) ) { eShapeType = XmlShapeTypeDrawGroupShape ; }
else if ( aType . match ( " Text " , 21 ) ) { eShapeType = XmlShapeTypeDrawTextShape ; }
else if ( aType . match ( " OLE2 " , 21 ) )
2001-02-02 10:14:37 +00:00
{
eShapeType = XmlShapeTypeDrawOLE2Shape ;
// get info about presentation shape
uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
2013-04-07 12:06:47 +02:00
OUString sCLSID ;
2013-06-29 21:24:12 +02:00
if ( xPropSet - > getPropertyValue ( " CLSID " ) > > = sCLSID )
2001-07-31 09:47:14 +00:00
{
2013-05-03 18:09:15 +02:00
if ( sCLSID . equals ( mrExport . GetChartExport ( ) - > getChartCLSID ( ) ) | |
sCLSID . equals ( OUString ( SvGlobalName ( SO3_RPTCH_CLASSID ) . GetHexName ( ) ) ) )
2001-07-31 09:47:14 +00:00
{
eShapeType = XmlShapeTypeDrawChartShape ;
}
2013-04-07 12:06:47 +02:00
else if ( sCLSID . equals ( OUString ( SvGlobalName ( SO3_SC_CLASSID ) . GetHexName ( ) ) ) )
2001-07-31 09:47:14 +00:00
{
2008-03-12 09:35:17 +00:00
eShapeType = XmlShapeTypeDrawSheetShape ;
2001-07-31 09:47:14 +00:00
}
else
{
// general OLE2 Object
}
}
2001-02-02 10:14:37 +00:00
}
}
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " Page " , 21 ) ) { eShapeType = XmlShapeTypeDrawPageShape ; }
else if ( aType . match ( " Frame " , 21 ) ) { eShapeType = XmlShapeTypeDrawFrameShape ; }
else if ( aType . match ( " Caption " , 21 ) ) { eShapeType = XmlShapeTypeDrawCaptionShape ; }
else if ( aType . match ( " Plugin " , 21 ) ) { eShapeType = XmlShapeTypeDrawPluginShape ; }
else if ( aType . match ( " Applet " , 21 ) ) { eShapeType = XmlShapeTypeDrawAppletShape ; }
else if ( aType . match ( " MediaShape " , 21 ) ) { eShapeType = XmlShapeTypeDrawMediaShape ; }
else if ( aType . match ( " TableShape " , 21 ) ) { eShapeType = XmlShapeTypeDrawTableShape ; }
2001-02-02 10:14:37 +00:00
// 3D shapes
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " Scene " , 21 + 7 ) ) { eShapeType = XmlShapeTypeDraw3DSceneObject ; }
else if ( aType . match ( " Cube " , 21 + 7 ) ) { eShapeType = XmlShapeTypeDraw3DCubeObject ; }
else if ( aType . match ( " Sphere " , 21 + 7 ) ) { eShapeType = XmlShapeTypeDraw3DSphereObject ; }
else if ( aType . match ( " Lathe " , 21 + 7 ) ) { eShapeType = XmlShapeTypeDraw3DLatheObject ; }
else if ( aType . match ( " Extrude " , 21 + 7 ) ) { eShapeType = XmlShapeTypeDraw3DExtrudeObject ; }
2001-02-02 10:14:37 +00:00
}
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " presentation. " , 13 ) )
2001-02-02 10:14:37 +00:00
{
// presentation shapes
2012-11-25 00:33:44 -06:00
if ( aType . match ( " TitleText " , 26 ) ) { eShapeType = XmlShapeTypePresTitleTextShape ; }
else if ( aType . match ( " Outliner " , 26 ) ) { eShapeType = XmlShapeTypePresOutlinerShape ; }
else if ( aType . match ( " Subtitle " , 26 ) ) { eShapeType = XmlShapeTypePresSubtitleShape ; }
else if ( aType . match ( " GraphicObject " , 26 ) ) { eShapeType = XmlShapeTypePresGraphicObjectShape ; }
else if ( aType . match ( " Page " , 26 ) ) { eShapeType = XmlShapeTypePresPageShape ; }
else if ( aType . match ( " OLE2 " , 26 ) )
2008-03-12 09:35:17 +00:00
{
eShapeType = XmlShapeTypePresOLE2Shape ;
// get info about presentation shape
uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
2010-02-23 00:23:09 +01:00
if ( xPropSet . is ( ) ) try
2008-03-12 09:35:17 +00:00
{
2013-04-07 12:06:47 +02:00
OUString sCLSID ;
2013-06-29 21:24:12 +02:00
if ( xPropSet - > getPropertyValue ( " CLSID " ) > > = sCLSID )
2008-03-12 09:35:17 +00:00
{
2013-03-03 19:28:46 +01:00
if ( sCLSID . equals ( OUString ( SvGlobalName ( SO3_SC_CLASSID ) . GetHexName ( ) ) ) )
2008-03-12 09:35:17 +00:00
{
eShapeType = XmlShapeTypePresSheetShape ;
}
}
}
2011-06-16 00:26:29 +01:00
catch ( const uno : : Exception & )
2010-02-23 00:23:09 +01:00
{
2013-01-09 04:45:22 +01:00
SAL_WARN ( " xmloff " , " XMLShapeExport::ImpCalcShapeType(), expected ole shape to have the CLSID property? " ) ;
2010-02-23 00:23:09 +01:00
}
2008-03-12 09:35:17 +00:00
}
2012-11-25 00:33:44 -06:00
else if ( aType . match ( " Chart " , 26 ) ) { eShapeType = XmlShapeTypePresChartShape ; }
else if ( aType . match ( " OrgChart " , 26 ) ) { eShapeType = XmlShapeTypePresOrgChartShape ; }
else if ( aType . match ( " CalcShape " , 26 ) ) { eShapeType = XmlShapeTypePresSheetShape ; }
else if ( aType . match ( " TableShape " , 26 ) ) { eShapeType = XmlShapeTypePresTableShape ; }
else if ( aType . match ( " Notes " , 26 ) ) { eShapeType = XmlShapeTypePresNotesShape ; }
else if ( aType . match ( " HandoutShape " , 26 ) ) { eShapeType = XmlShapeTypeHandoutShape ; }
else if ( aType . match ( " HeaderShape " , 26 ) ) { eShapeType = XmlShapeTypePresHeaderShape ; }
else if ( aType . match ( " FooterShape " , 26 ) ) { eShapeType = XmlShapeTypePresFooterShape ; }
else if ( aType . match ( " SlideNumberShape " , 26 ) ) { eShapeType = XmlShapeTypePresSlideNumberShape ; }
else if ( aType . match ( " DateTimeShape " , 26 ) ) { eShapeType = XmlShapeTypePresDateTimeShape ; }
else if ( aType . match ( " MediaShape " , 26 ) ) { eShapeType = XmlShapeTypePresMediaShape ; }
2001-02-02 10:14:37 +00:00
}
}
}
}
2001-07-24 16:06:10 +00:00
extern SvXMLEnumMapEntry aXML_GlueAlignment_EnumMap [ ] ;
extern SvXMLEnumMapEntry aXML_GlueEscapeDirection_EnumMap [ ] ;
2001-05-31 10:18:38 +00:00
/** exports all user defined glue points */
void XMLShapeExport : : ImpExportGluePoints ( const uno : : Reference < drawing : : XShape > & xShape )
{
uno : : Reference < drawing : : XGluePointsSupplier > xSupplier ( xShape , uno : : UNO_QUERY ) ;
if ( ! xSupplier . is ( ) )
return ;
2001-06-11 13:01:00 +00:00
uno : : Reference < container : : XIdentifierAccess > xGluePoints ( xSupplier - > getGluePoints ( ) , uno : : UNO_QUERY ) ;
2001-05-31 10:18:38 +00:00
if ( ! xGluePoints . is ( ) )
return ;
drawing : : GluePoint2 aGluePoint ;
2001-06-11 13:01:00 +00:00
uno : : Sequence < sal_Int32 > aIdSequence ( xGluePoints - > getIdentifiers ( ) ) ;
const sal_Int32 nCount = aIdSequence . getLength ( ) ;
2001-05-31 10:18:38 +00:00
for ( sal_Int32 nIndex = 0 ; nIndex < nCount ; nIndex + + )
{
2001-06-11 13:01:00 +00:00
const sal_Int32 nIdentifier = aIdSequence [ nIndex ] ;
if ( ( xGluePoints - > getByIdentifier ( nIdentifier ) > > = aGluePoint ) & & aGluePoint . IsUserDefined )
2001-05-31 10:18:38 +00:00
{
// export only user defined glue points
2013-08-21 15:07:31 +02:00
const OUString sId ( OUString : : number ( nIdentifier ) ) ;
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_ID , sId ) ;
2001-05-31 10:18:38 +00:00
2011-10-11 14:19:09 +02:00
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( msBuffer ,
aGluePoint . Position . X ) ;
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_X , msBuffer . makeStringAndClear ( ) ) ;
2001-05-31 10:18:38 +00:00
2011-10-11 14:19:09 +02:00
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( msBuffer ,
aGluePoint . Position . Y ) ;
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_Y , msBuffer . makeStringAndClear ( ) ) ;
2001-05-31 10:18:38 +00:00
if ( ! aGluePoint . IsRelative )
{
SvXMLUnitConverter : : convertEnum ( msBuffer , aGluePoint . PositionAlignment , aXML_GlueAlignment_EnumMap ) ;
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_ALIGN , msBuffer . makeStringAndClear ( ) ) ;
2001-05-31 10:18:38 +00:00
}
if ( aGluePoint . Escape ! = drawing : : EscapeDirection_SMART )
{
SvXMLUnitConverter : : convertEnum ( msBuffer , aGluePoint . Escape , aXML_GlueEscapeDirection_EnumMap ) ;
2006-06-19 17:12:03 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_ESCAPE_DIRECTION , msBuffer . makeStringAndClear ( ) ) ;
2001-05-31 10:18:38 +00:00
}
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventsElemt ( mrExport , XML_NAMESPACE_DRAW , XML_GLUE_POINT , true , true ) ;
2001-05-31 10:18:38 +00:00
}
}
}
2001-11-27 13:14:16 +00:00
void XMLShapeExport : : ExportGraphicDefaults ( )
{
2006-06-19 17:12:03 +00:00
XMLStyleExport aStEx ( mrExport , OUString ( ) , mrExport . GetAutoStylePool ( ) . get ( ) ) ;
2001-11-27 13:14:16 +00:00
// construct PropertySetMapper
2006-06-19 17:12:03 +00:00
UniReference < SvXMLExportPropertyMapper > xPropertySetMapper ( CreateShapePropMapper ( mrExport ) ) ;
2002-01-11 11:18:09 +00:00
( ( XMLShapeExportPropertyMapper * ) xPropertySetMapper . get ( ) ) - > SetAutoStyles ( sal_False ) ;
2001-11-27 13:14:16 +00:00
// chain text attributes
2006-06-19 17:12:03 +00:00
xPropertySetMapper - > ChainExportMapper ( XMLTextParagraphExport : : CreateParaExtPropMapper ( mrExport ) ) ;
2005-01-27 10:26:13 +00:00
// chain special Writer/text frame default attributes
2006-06-19 17:12:03 +00:00
xPropertySetMapper - > ChainExportMapper ( XMLTextParagraphExport : : CreateParaDefaultExtPropMapper ( mrExport ) ) ;
2001-11-27 13:14:16 +00:00
// write graphic family default style
2006-06-19 17:12:03 +00:00
uno : : Reference < lang : : XMultiServiceFactory > xFact ( mrExport . GetModel ( ) , uno : : UNO_QUERY ) ;
2001-11-27 13:14:16 +00:00
if ( xFact . is ( ) )
{
try
{
2013-06-29 21:24:12 +02:00
uno : : Reference < beans : : XPropertySet > xDefaults ( xFact - > createInstance ( " com.sun.star.drawing.Defaults " ) , uno : : UNO_QUERY ) ;
2001-11-27 13:14:16 +00:00
if ( xDefaults . is ( ) )
{
2012-06-02 08:58:21 -05:00
aStEx . exportDefaultStyle ( xDefaults , OUString ( XML_STYLE_FAMILY_SD_GRAPHICS_NAME ) , xPropertySetMapper ) ;
2001-11-27 13:14:16 +00:00
// write graphic family styles
2014-03-28 11:15:14 +02:00
aStEx . exportStyleFamily ( " graphics " , OUString ( XML_STYLE_FAMILY_SD_GRAPHICS_NAME ) , xPropertySetMapper , false , XML_STYLE_FAMILY_SD_GRAPHICS_ID ) ;
2001-11-27 13:14:16 +00:00
}
}
2011-06-16 00:26:29 +01:00
catch ( const lang : : ServiceNotRegisteredException & )
2001-11-27 13:14:16 +00:00
{
}
}
2002-05-28 08:28:05 +00:00
}
2006-06-19 17:12:03 +00:00
void XMLShapeExport : : onExport ( const com : : sun : : star : : uno : : Reference < com : : sun : : star : : drawing : : XShape > & )
2002-05-28 08:28:05 +00:00
{
}
2008-03-12 09:35:17 +00:00
const rtl : : Reference < XMLTableExport > & XMLShapeExport : : GetShapeTableExport ( )
{
if ( ! mxShapeTableExport . is ( ) )
{
rtl : : Reference < XMLPropertyHandlerFactory > xFactory ( new XMLSdPropHdlFactory ( mrExport . GetModel ( ) , mrExport ) ) ;
2013-12-20 03:17:14 +01:00
UniReference < XMLPropertySetMapper > xMapper ( new XMLShapePropertySetMapper ( xFactory . get ( ) , true ) ) ;
2013-03-18 10:53:00 +00:00
mrExport . GetTextParagraphExport ( ) ; // get or create text paragraph export
2012-08-15 16:18:53 +02:00
rtl : : Reference < SvXMLExportPropertyMapper > xPropertySetMapper ( new XMLShapeExportPropertyMapper ( xMapper , mrExport ) ) ;
2008-03-12 09:35:17 +00:00
mxShapeTableExport = new XMLTableExport ( mrExport , xPropertySetMapper , xFactory ) ;
}
return mxShapeTableExport ;
}
2010-10-12 15:53:47 +02:00
2013-10-13 14:36:21 +03:00
void XMLShapeExport : : ImpExportNewTrans ( const uno : : Reference < beans : : XPropertySet > & xPropSet ,
sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
// get matrix
: : basegfx : : B2DHomMatrix aMatrix ;
ImpExportNewTrans_GetB2DHomMatrix ( aMatrix , xPropSet ) ;
// decompose and correct abour pRefPoint
: : basegfx : : B2DTuple aTRScale ;
double fTRShear ( 0.0 ) ;
double fTRRotate ( 0.0 ) ;
: : basegfx : : B2DTuple aTRTranslate ;
ImpExportNewTrans_DecomposeAndRefPoint ( aMatrix , aTRScale , fTRShear , fTRRotate , aTRTranslate , pRefPoint ) ;
// use features and write
ImpExportNewTrans_FeaturesAndWrite ( aTRScale , fTRShear , fTRRotate , aTRTranslate , nFeatures ) ;
}
void XMLShapeExport : : ImpExportNewTrans_GetB2DHomMatrix ( : : basegfx : : B2DHomMatrix & rMatrix ,
const uno : : Reference < beans : : XPropertySet > & xPropSet )
{
/* Get <TransformationInHoriL2R>, if it exist
and if the document is exported into the OpenOffice . org file format .
This property only exists at service com : : sun : : star : : text : : Shape - the
Writer UNO service for shapes .
This code is needed , because the positioning attributes in the
OpenOffice . org file format are given in horizontal left - to - right layout
regardless the layout direction the shape is in . In the OASIS Open Office
file format the positioning attributes are correctly given in the layout
direction the shape is in . Thus , this code provides the conversion from
the OASIS Open Office file format to the OpenOffice . org file format . ( # i28749 # )
*/
uno : : Any aAny ;
if ( ( GetExport ( ) . getExportFlags ( ) & EXPORT_OASIS ) = = 0 & &
xPropSet - > getPropertySetInfo ( ) - > hasPropertyByName (
OUString ( " TransformationInHoriL2R " ) ) )
{
aAny = xPropSet - > getPropertyValue ( " TransformationInHoriL2R " ) ;
}
else
{
aAny = xPropSet - > getPropertyValue ( " Transformation " ) ;
}
drawing : : HomogenMatrix3 aMatrix ;
aAny > > = aMatrix ;
rMatrix . set ( 0 , 0 , aMatrix . Line1 . Column1 ) ;
rMatrix . set ( 0 , 1 , aMatrix . Line1 . Column2 ) ;
rMatrix . set ( 0 , 2 , aMatrix . Line1 . Column3 ) ;
rMatrix . set ( 1 , 0 , aMatrix . Line2 . Column1 ) ;
rMatrix . set ( 1 , 1 , aMatrix . Line2 . Column2 ) ;
rMatrix . set ( 1 , 2 , aMatrix . Line2 . Column3 ) ;
rMatrix . set ( 2 , 0 , aMatrix . Line3 . Column1 ) ;
rMatrix . set ( 2 , 1 , aMatrix . Line3 . Column2 ) ;
rMatrix . set ( 2 , 2 , aMatrix . Line3 . Column3 ) ;
}
void XMLShapeExport : : ImpExportNewTrans_DecomposeAndRefPoint ( const : : basegfx : : B2DHomMatrix & rMatrix , : : basegfx : : B2DTuple & rTRScale ,
double & fTRShear , double & fTRRotate , : : basegfx : : B2DTuple & rTRTranslate , com : : sun : : star : : awt : : Point * pRefPoint )
{
// decompose matrix
rMatrix . decompose ( rTRScale , rTRTranslate , fTRRotate , fTRShear ) ;
// correct translation about pRefPoint
if ( pRefPoint )
{
rTRTranslate - = : : basegfx : : B2DTuple ( pRefPoint - > X , pRefPoint - > Y ) ;
}
}
void XMLShapeExport : : ImpExportNewTrans_FeaturesAndWrite ( : : basegfx : : B2DTuple & rTRScale , double fTRShear ,
double fTRRotate , : : basegfx : : B2DTuple & rTRTranslate , const sal_Int32 nFeatures )
{
// always write Size (rTRScale) since this statement carries the union
// of the object
OUString aStr ;
OUStringBuffer sStringBuffer ;
: : basegfx : : B2DTuple aTRScale ( rTRScale ) ;
// svg: width
if ( ! ( nFeatures & SEF_EXPORT_WIDTH ) )
{
aTRScale . setX ( 1.0 ) ;
}
else
{
if ( aTRScale . getX ( ) > 0.0 )
aTRScale . setX ( aTRScale . getX ( ) - 1.0 ) ;
else if ( aTRScale . getX ( ) < 0.0 )
aTRScale . setX ( aTRScale . getX ( ) + 1.0 ) ;
}
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
FRound ( aTRScale . getX ( ) ) ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_WIDTH , aStr ) ;
// svg: height
if ( ! ( nFeatures & SEF_EXPORT_HEIGHT ) )
{
aTRScale . setY ( 1.0 ) ;
}
else
{
if ( aTRScale . getY ( ) > 0.0 )
aTRScale . setY ( aTRScale . getY ( ) - 1.0 ) ;
else if ( aTRScale . getY ( ) < 0.0 )
aTRScale . setY ( aTRScale . getY ( ) + 1.0 ) ;
}
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
FRound ( aTRScale . getY ( ) ) ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_HEIGHT , aStr ) ;
// decide if transformation is necessary
2013-12-20 11:25:37 +01:00
sal_Bool bTransformationIsNecessary ( fTRShear ! = 0.0 | | fTRRotate ! = 0.0 ) ;
2013-10-13 14:36:21 +03:00
2013-12-20 11:25:37 +01:00
if ( bTransformationIsNecessary )
2013-10-13 14:36:21 +03:00
{
// write transformation, but WITHOUT scale which is exported as size above
SdXMLImExTransform2D aTransform ;
aTransform . AddSkewX ( atan ( fTRShear ) ) ;
// #i78696#
// fTRRotate is mathematically correct, but due to the error
// we export/import it mirrored. Since the API implementation is fixed and
// uses the correctly oriented angle, it is necessary for compatibility to
// mirror the angle here to stay at the old behaviour. There is a follow-up
// task (#i78698#) to fix this in the next ODF FileFormat version
aTransform . AddRotate ( - fTRRotate ) ;
aTransform . AddTranslate ( rTRTranslate ) ;
// does transformation need to be exported?
if ( aTransform . NeedsAction ( ) )
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_TRANSFORM , aTransform . GetExportString ( mrExport . GetMM100UnitConverter ( ) ) ) ;
}
else
{
// no shear, no rotate; just add object position to export and we are done
if ( nFeatures & SEF_EXPORT_X )
{
// svg: x
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
FRound ( rTRTranslate . getX ( ) ) ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_X , aStr ) ;
}
if ( nFeatures & SEF_EXPORT_Y )
{
// svg: y
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
FRound ( rTRTranslate . getY ( ) ) ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_Y , aStr ) ;
}
}
}
2014-03-28 11:15:14 +02:00
bool XMLShapeExport : : ImpExportPresentationAttributes ( const uno : : Reference < beans : : XPropertySet > & xPropSet , const OUString & rClass )
2013-10-13 14:36:21 +03:00
{
2014-03-28 11:15:14 +02:00
bool bIsEmpty = false ;
2013-10-13 14:36:21 +03:00
// write presentation class entry
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_CLASS , rClass ) ;
if ( xPropSet . is ( ) )
{
uno : : Reference < beans : : XPropertySetInfo > xPropSetInfo ( xPropSet - > getPropertySetInfo ( ) ) ;
sal_Bool bTemp = false ;
// is empty pes shape?
if ( xPropSetInfo . is ( ) & & xPropSetInfo - > hasPropertyByName ( " IsEmptyPresentationObject " ) )
{
xPropSet - > getPropertyValue ( " IsEmptyPresentationObject " ) > > = bIsEmpty ;
if ( bIsEmpty )
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_PLACEHOLDER , XML_TRUE ) ;
}
// is user-transformed?
if ( xPropSetInfo . is ( ) & & xPropSetInfo - > hasPropertyByName ( " IsPlaceholderDependent " ) )
{
xPropSet - > getPropertyValue ( " IsPlaceholderDependent " ) > > = bTemp ;
if ( ! bTemp )
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_USER_TRANSFORMED , XML_TRUE ) ;
}
}
return bIsEmpty ;
}
void XMLShapeExport : : ImpExportText ( const uno : : Reference < drawing : : XShape > & xShape )
{
uno : : Reference < text : : XText > xText ( xShape , uno : : UNO_QUERY ) ;
if ( xText . is ( ) )
{
uno : : Reference < container : : XEnumerationAccess > xEnumAccess ( xShape , uno : : UNO_QUERY ) ;
if ( xEnumAccess . is ( ) & & xEnumAccess - > hasElements ( ) )
mrExport . GetTextParagraphExport ( ) - > exportText ( xText ) ;
}
}
namespace {
const sal_Int32 FOUND_CLICKACTION = 0x00000001 ;
const sal_Int32 FOUND_BOOKMARK = 0x00000002 ;
const sal_Int32 FOUND_EFFECT = 0x00000004 ;
const sal_Int32 FOUND_PLAYFULL = 0x00000008 ;
const sal_Int32 FOUND_VERB = 0x00000010 ;
const sal_Int32 FOUND_SOUNDURL = 0x00000020 ;
const sal_Int32 FOUND_SPEED = 0x00000040 ;
const sal_Int32 FOUND_CLICKEVENTTYPE = 0x00000080 ;
const sal_Int32 FOUND_MACRO = 0x00000100 ;
const sal_Int32 FOUND_LIBRARY = 0x00000200 ;
} // namespace
void XMLShapeExport : : ImpExportEvents ( const uno : : Reference < drawing : : XShape > & xShape )
{
uno : : Reference < document : : XEventsSupplier > xEventsSupplier ( xShape , uno : : UNO_QUERY ) ;
if ( ! xEventsSupplier . is ( ) )
return ;
uno : : Reference < container : : XNameAccess > xEvents ( xEventsSupplier - > getEvents ( ) , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xEvents . is ( ) , " XEventsSupplier::getEvents() returned NULL " ) ;
if ( ! xEvents . is ( ) )
return ;
sal_Int32 nFound = 0 ;
OUString aClickEventType ;
presentation : : ClickAction eClickAction = presentation : : ClickAction_NONE ;
presentation : : AnimationEffect eEffect = presentation : : AnimationEffect_NONE ;
presentation : : AnimationSpeed eSpeed = presentation : : AnimationSpeed_SLOW ;
OUString aStrSoundURL ;
sal_Bool bPlayFull = false ;
sal_Int32 nVerb = 0 ;
OUString aStrMacro ;
OUString aStrLibrary ;
OUString aStrBookmark ;
uno : : Sequence < beans : : PropertyValue > aClickProperties ;
if ( xEvents - > hasByName ( msOnClick ) & & ( xEvents - > getByName ( msOnClick ) > > = aClickProperties ) )
{
const beans : : PropertyValue * pProperty = aClickProperties . getConstArray ( ) ;
const beans : : PropertyValue * pPropertyEnd = pProperty + aClickProperties . getLength ( ) ;
for ( ; pProperty ! = pPropertyEnd ; + + pProperty )
{
if ( ( ( nFound & FOUND_CLICKEVENTTYPE ) = = 0 ) & & pProperty - > Name = = msEventType )
{
if ( pProperty - > Value > > = aClickEventType )
nFound | = FOUND_CLICKEVENTTYPE ;
}
else if ( ( ( nFound & FOUND_CLICKACTION ) = = 0 ) & & pProperty - > Name = = msClickAction )
{
if ( pProperty - > Value > > = eClickAction )
nFound | = FOUND_CLICKACTION ;
}
else if ( ( ( nFound & FOUND_MACRO ) = = 0 ) & & ( pProperty - > Name = = msMacroName | | pProperty - > Name = = msScript ) )
{
if ( pProperty - > Value > > = aStrMacro )
nFound | = FOUND_MACRO ;
}
else if ( ( ( nFound & FOUND_LIBRARY ) = = 0 ) & & pProperty - > Name = = msLibrary )
{
if ( pProperty - > Value > > = aStrLibrary )
nFound | = FOUND_LIBRARY ;
}
else if ( ( ( nFound & FOUND_EFFECT ) = = 0 ) & & pProperty - > Name = = msEffect )
{
if ( pProperty - > Value > > = eEffect )
nFound | = FOUND_EFFECT ;
}
else if ( ( ( nFound & FOUND_BOOKMARK ) = = 0 ) & & pProperty - > Name = = msBookmark )
{
if ( pProperty - > Value > > = aStrBookmark )
nFound | = FOUND_BOOKMARK ;
}
else if ( ( ( nFound & FOUND_SPEED ) = = 0 ) & & pProperty - > Name = = msSpeed )
{
if ( pProperty - > Value > > = eSpeed )
nFound | = FOUND_SPEED ;
}
else if ( ( ( nFound & FOUND_SOUNDURL ) = = 0 ) & & pProperty - > Name = = msSoundURL )
{
if ( pProperty - > Value > > = aStrSoundURL )
nFound | = FOUND_SOUNDURL ;
}
else if ( ( ( nFound & FOUND_PLAYFULL ) = = 0 ) & & pProperty - > Name = = msPlayFull )
{
if ( pProperty - > Value > > = bPlayFull )
nFound | = FOUND_PLAYFULL ;
}
else if ( ( ( nFound & FOUND_VERB ) = = 0 ) & & pProperty - > Name = = msVerb )
{
if ( pProperty - > Value > > = nVerb )
nFound | = FOUND_VERB ;
}
}
}
// create the XML elements
if ( aClickEventType = = msPresentation )
{
if ( ( ( nFound & FOUND_CLICKACTION ) = = 0 ) | | ( eClickAction = = presentation : : ClickAction_NONE ) )
return ;
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventsElemt ( mrExport , XML_NAMESPACE_OFFICE , XML_EVENT_LISTENERS , true , true ) ;
2013-10-13 14:36:21 +03:00
enum XMLTokenEnum eStrAction ;
switch ( eClickAction )
{
case presentation : : ClickAction_PREVPAGE : eStrAction = XML_PREVIOUS_PAGE ; break ;
case presentation : : ClickAction_NEXTPAGE : eStrAction = XML_NEXT_PAGE ; break ;
case presentation : : ClickAction_FIRSTPAGE : eStrAction = XML_FIRST_PAGE ; break ;
case presentation : : ClickAction_LASTPAGE : eStrAction = XML_LAST_PAGE ; break ;
case presentation : : ClickAction_INVISIBLE : eStrAction = XML_HIDE ; break ;
case presentation : : ClickAction_STOPPRESENTATION : eStrAction = XML_STOP ; break ;
case presentation : : ClickAction_PROGRAM : eStrAction = XML_EXECUTE ; break ;
case presentation : : ClickAction_BOOKMARK : eStrAction = XML_SHOW ; break ;
case presentation : : ClickAction_DOCUMENT : eStrAction = XML_SHOW ; break ;
case presentation : : ClickAction_MACRO : eStrAction = XML_EXECUTE_MACRO ; break ;
case presentation : : ClickAction_VERB : eStrAction = XML_VERB ; break ;
case presentation : : ClickAction_VANISH : eStrAction = XML_FADE_OUT ; break ;
case presentation : : ClickAction_SOUND : eStrAction = XML_SOUND ; break ;
default :
OSL_FAIL ( " unknown presentation::ClickAction found! " ) ;
eStrAction = XML_UNKNOWN ;
}
OUString aEventQName (
mrExport . GetNamespaceMap ( ) . GetQNameByKey (
XML_NAMESPACE_DOM , OUString ( " click " ) ) ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SCRIPT , XML_EVENT_NAME , aEventQName ) ;
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_ACTION , eStrAction ) ;
if ( eClickAction = = presentation : : ClickAction_VANISH )
{
if ( nFound & FOUND_EFFECT )
{
XMLEffect eKind ;
XMLEffectDirection eDirection ;
sal_Int16 nStartScale ;
bool bIn ;
SdXMLImplSetEffect ( eEffect , eKind , eDirection , nStartScale , bIn ) ;
if ( eKind ! = EK_none )
{
SvXMLUnitConverter : : convertEnum ( msBuffer , eKind , aXML_AnimationEffect_EnumMap ) ;
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_EFFECT , msBuffer . makeStringAndClear ( ) ) ;
}
if ( eDirection ! = ED_none )
{
SvXMLUnitConverter : : convertEnum ( msBuffer , eDirection , aXML_AnimationDirection_EnumMap ) ;
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_DIRECTION , msBuffer . makeStringAndClear ( ) ) ;
}
if ( nStartScale ! = - 1 )
{
: : sax : : Converter : : convertPercent ( msBuffer , nStartScale ) ;
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_START_SCALE , msBuffer . makeStringAndClear ( ) ) ;
}
}
if ( nFound & FOUND_SPEED & & eEffect ! = presentation : : AnimationEffect_NONE )
{
if ( eSpeed ! = presentation : : AnimationSpeed_MEDIUM )
{
SvXMLUnitConverter : : convertEnum ( msBuffer , eSpeed , aXML_AnimationSpeed_EnumMap ) ;
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_SPEED , msBuffer . makeStringAndClear ( ) ) ;
}
}
}
if ( eClickAction = = presentation : : ClickAction_PROGRAM | |
eClickAction = = presentation : : ClickAction_BOOKMARK | |
eClickAction = = presentation : : ClickAction_DOCUMENT )
{
if ( eClickAction = = presentation : : ClickAction_BOOKMARK )
2013-11-13 12:10:31 +02:00
msBuffer . append ( ' # ' ) ;
2013-10-13 14:36:21 +03:00
msBuffer . append ( aStrBookmark ) ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , GetExport ( ) . GetRelativeReference ( msBuffer . makeStringAndClear ( ) ) ) ;
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_ONREQUEST ) ;
}
if ( ( nFound & FOUND_VERB ) & & eClickAction = = presentation : : ClickAction_VERB )
{
msBuffer . append ( nVerb ) ;
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_VERB , msBuffer . makeStringAndClear ( ) ) ;
}
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventElemt ( mrExport , XML_NAMESPACE_PRESENTATION , XML_EVENT_LISTENER , true , true ) ;
2013-10-13 14:36:21 +03:00
if ( eClickAction = = presentation : : ClickAction_VANISH | | eClickAction = = presentation : : ClickAction_SOUND )
{
if ( ( nFound & FOUND_SOUNDURL ) & & ! aStrSoundURL . isEmpty ( ) )
{
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , GetExport ( ) . GetRelativeReference ( aStrSoundURL ) ) ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_TYPE , XML_SIMPLE ) ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_SHOW , XML_NEW ) ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_ACTUATE , XML_ONREQUEST ) ;
if ( nFound & FOUND_PLAYFULL & & bPlayFull )
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_PLAY_FULL , XML_TRUE ) ;
2014-03-28 16:28:51 +02:00
SvXMLElementExport aElem ( mrExport , XML_NAMESPACE_PRESENTATION , XML_SOUND , true , true ) ;
2013-10-13 14:36:21 +03:00
}
}
}
else if ( aClickEventType = = msStarBasic )
{
if ( nFound & FOUND_MACRO )
{
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventsElemt ( mrExport , XML_NAMESPACE_OFFICE , XML_EVENT_LISTENERS , true , true ) ;
2013-10-13 14:36:21 +03:00
mrExport . AddAttribute ( XML_NAMESPACE_SCRIPT , XML_LANGUAGE ,
mrExport . GetNamespaceMap ( ) . GetQNameByKey (
XML_NAMESPACE_OOO ,
OUString ( " starbasic " ) ) ) ;
OUString aEventQName (
mrExport . GetNamespaceMap ( ) . GetQNameByKey (
XML_NAMESPACE_DOM , OUString ( " click " ) ) ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SCRIPT , XML_EVENT_NAME , aEventQName ) ;
if ( nFound & FOUND_LIBRARY )
{
OUString sLocation ( GetXMLToken (
( aStrLibrary . equalsIgnoreAsciiCase ( " StarOffice " ) | |
aStrLibrary . equalsIgnoreAsciiCase ( " application " ) ) ? XML_APPLICATION
: XML_DOCUMENT ) ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SCRIPT , XML_MACRO_NAME ,
sLocation + " : " + aStrMacro ) ;
}
else
{
mrExport . AddAttribute ( XML_NAMESPACE_SCRIPT , XML_MACRO_NAME , aStrMacro ) ;
}
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventElemt ( mrExport , XML_NAMESPACE_SCRIPT , XML_EVENT_LISTENER , true , true ) ;
2013-10-13 14:36:21 +03:00
}
}
else if ( aClickEventType = = msScript )
{
if ( nFound & FOUND_MACRO )
{
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventsElemt ( mrExport , XML_NAMESPACE_OFFICE , XML_EVENT_LISTENERS , true , true ) ;
2013-10-13 14:36:21 +03:00
if ( nFound & FOUND_MACRO )
{
mrExport . AddAttribute ( XML_NAMESPACE_SCRIPT , XML_LANGUAGE , mrExport . GetNamespaceMap ( ) . GetQNameByKey (
XML_NAMESPACE_OOO , GetXMLToken ( XML_SCRIPT ) ) ) ;
OUString aEventQName (
mrExport . GetNamespaceMap ( ) . GetQNameByKey (
XML_NAMESPACE_DOM , OUString ( " click " ) ) ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SCRIPT , XML_EVENT_NAME , aEventQName ) ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , aStrMacro ) ;
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventElemt ( mrExport , XML_NAMESPACE_SCRIPT , XML_EVENT_LISTENER , true , true ) ;
2013-10-13 14:36:21 +03:00
}
}
}
}
/** #i68101# export shape Title and Description */
void XMLShapeExport : : ImpExportDescription ( const uno : : Reference < drawing : : XShape > & xShape )
{
try
{
OUString aTitle ;
OUString aDescription ;
uno : : Reference < beans : : XPropertySet > xProps ( xShape , uno : : UNO_QUERY_THROW ) ;
xProps - > getPropertyValue ( " Title " ) > > = aTitle ;
xProps - > getPropertyValue ( " Description " ) > > = aDescription ;
if ( ! aTitle . isEmpty ( ) )
{
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventElemt ( mrExport , XML_NAMESPACE_SVG , XML_TITLE , true , false ) ;
2013-10-13 14:36:21 +03:00
mrExport . Characters ( aTitle ) ;
}
if ( ! aDescription . isEmpty ( ) )
{
2014-03-28 16:28:51 +02:00
SvXMLElementExport aEventElemt ( mrExport , XML_NAMESPACE_SVG , XML_DESC , true , false ) ;
2013-10-13 14:36:21 +03:00
mrExport . Characters ( aDescription ) ;
}
}
catch ( uno : : Exception & )
{
OSL_FAIL ( " could not export Title and/or Description for shape! " ) ;
}
}
void XMLShapeExport : : ImpExportGroupShape ( const uno : : Reference < drawing : : XShape > & xShape , XmlShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
uno : : Reference < drawing : : XShapes > xShapes ( xShape , uno : : UNO_QUERY ) ;
if ( xShapes . is ( ) & & xShapes - > getCount ( ) )
{
// write group shape
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
SvXMLElementExport aPGR ( mrExport , XML_NAMESPACE_DRAW , XML_G , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
// #89764# if export of position is supressed for group shape,
// positions of contained objects should be written relative to
// the upper left edge of the group.
awt : : Point aUpperLeft ;
if ( ! ( nFeatures & SEF_EXPORT_POSITION ) )
{
nFeatures | = SEF_EXPORT_POSITION ;
aUpperLeft = xShape - > getPosition ( ) ;
pRefPoint = & aUpperLeft ;
}
// write members
exportShapes ( xShapes , nFeatures , pRefPoint ) ;
}
}
void XMLShapeExport : : ImpExportTextBoxShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType eShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
uno : : Reference < beans : : XPropertySetInfo > xPropSetInfo ( xPropSet - > getPropertySetInfo ( ) ) ;
// presentation attribute (if presentation)
sal_Bool bIsPresShape ( sal_False ) ;
sal_Bool bIsEmptyPresObj ( sal_False ) ;
OUString aStr ;
switch ( eShapeType )
{
case XmlShapeTypePresSubtitleShape :
{
aStr = GetXMLToken ( XML_PRESENTATION_SUBTITLE ) ;
bIsPresShape = sal_True ;
break ;
}
case XmlShapeTypePresTitleTextShape :
{
aStr = GetXMLToken ( XML_PRESENTATION_TITLE ) ;
bIsPresShape = sal_True ;
break ;
}
case XmlShapeTypePresOutlinerShape :
{
aStr = GetXMLToken ( XML_PRESENTATION_OUTLINE ) ;
bIsPresShape = sal_True ;
break ;
}
case XmlShapeTypePresNotesShape :
{
aStr = GetXMLToken ( XML_PRESENTATION_NOTES ) ;
bIsPresShape = sal_True ;
break ;
}
case XmlShapeTypePresHeaderShape :
{
aStr = GetXMLToken ( XML_HEADER ) ;
bIsPresShape = sal_True ;
break ;
}
case XmlShapeTypePresFooterShape :
{
aStr = GetXMLToken ( XML_FOOTER ) ;
bIsPresShape = sal_True ;
break ;
}
case XmlShapeTypePresSlideNumberShape :
{
aStr = GetXMLToken ( XML_PAGE_NUMBER ) ;
bIsPresShape = sal_True ;
break ;
}
case XmlShapeTypePresDateTimeShape :
{
aStr = GetXMLToken ( XML_DATE_TIME ) ;
bIsPresShape = sal_True ;
break ;
}
default :
break ;
}
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
if ( bIsPresShape )
bIsEmptyPresObj = ImpExportPresentationAttributes ( xPropSet , aStr ) ;
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
SvXMLElementExport aElem ( mrExport , XML_NAMESPACE_DRAW ,
2014-03-28 16:28:51 +02:00
XML_FRAME , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
// evtl. corner radius?
sal_Int32 nCornerRadius ( 0L ) ;
xPropSet - > getPropertyValue ( " CornerRadius " ) > > = nCornerRadius ;
if ( nCornerRadius )
{
OUStringBuffer sStringBuffer ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
nCornerRadius ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_CORNER_RADIUS , sStringBuffer . makeStringAndClear ( ) ) ;
}
{
// write text-box
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_TEXT_BOX , true , true ) ;
2013-10-13 14:36:21 +03:00
if ( ! bIsEmptyPresObj )
ImpExportText ( xShape ) ;
}
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
}
}
void XMLShapeExport : : ImpExportRectangleShape (
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 ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
// evtl. corner radius?
sal_Int32 nCornerRadius ( 0L ) ;
xPropSet - > getPropertyValue ( " CornerRadius " ) > > = nCornerRadius ;
if ( nCornerRadius )
{
OUStringBuffer sStringBuffer ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
nCornerRadius ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_CORNER_RADIUS , sStringBuffer . makeStringAndClear ( ) ) ;
}
// write rectangle
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_RECT , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
ImpExportText ( xShape ) ;
}
}
void XMLShapeExport : : ImpExportLineShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
OUString aStr ;
OUStringBuffer sStringBuffer ;
awt : : Point aStart ( 0 , 0 ) ;
awt : : Point aEnd ( 1 , 1 ) ;
// #85920# use 'Geometry' to get the points of the line
// since this slot take anchor pos into account.
// get matrix
: : basegfx : : B2DHomMatrix aMatrix ;
ImpExportNewTrans_GetB2DHomMatrix ( aMatrix , xPropSet ) ;
// decompose and correct about pRefPoint
: : basegfx : : B2DTuple aTRScale ;
double fTRShear ( 0.0 ) ;
double fTRRotate ( 0.0 ) ;
: : basegfx : : B2DTuple aTRTranslate ;
ImpExportNewTrans_DecomposeAndRefPoint ( aMatrix , aTRScale , fTRShear , fTRRotate , aTRTranslate , pRefPoint ) ;
// create base position
awt : : Point aBasePosition ( FRound ( aTRTranslate . getX ( ) ) , FRound ( aTRTranslate . getY ( ) ) ) ;
// get the two points
uno : : Any aAny ( xPropSet - > getPropertyValue ( " Geometry " ) ) ;
drawing : : PointSequenceSequence * pSourcePolyPolygon = ( drawing : : PointSequenceSequence * ) aAny . getValue ( ) ;
if ( pSourcePolyPolygon )
{
drawing : : PointSequence * pOuterSequence = pSourcePolyPolygon - > getArray ( ) ;
if ( pOuterSequence )
{
drawing : : PointSequence * pInnerSequence = pOuterSequence + + ;
if ( pInnerSequence )
{
awt : : Point * pArray = pInnerSequence - > getArray ( ) ;
if ( pArray )
{
if ( pInnerSequence - > getLength ( ) > 0 )
{
aStart = awt : : Point (
pArray - > X + aBasePosition . X ,
pArray - > Y + aBasePosition . Y ) ;
pArray + + ;
}
if ( pInnerSequence - > getLength ( ) > 1 )
{
aEnd = awt : : Point (
pArray - > X + aBasePosition . X ,
pArray - > Y + aBasePosition . Y ) ;
}
}
}
}
}
if ( nFeatures & SEF_EXPORT_X )
{
// svg: x1
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
aStart . X ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_X1 , aStr ) ;
}
else
{
aEnd . X - = aStart . X ;
}
if ( nFeatures & SEF_EXPORT_Y )
{
// svg: y1
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
aStart . Y ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_Y1 , aStr ) ;
}
else
{
aEnd . Y - = aStart . Y ;
}
// svg: x2
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
aEnd . X ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_X2 , aStr ) ;
// svg: y2
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
aEnd . Y ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_Y2 , aStr ) ;
// write line
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_LINE , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
ImpExportText ( xShape ) ;
}
}
void XMLShapeExport : : ImpExportEllipseShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
// get size to decide between Circle and Ellipse
awt : : Size aSize = xShape - > getSize ( ) ;
sal_Int32 nRx ( ( aSize . Width + 1 ) / 2 ) ;
sal_Int32 nRy ( ( aSize . Height + 1 ) / 2 ) ;
sal_Bool bCircle ( nRx = = nRy ) ;
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
drawing : : CircleKind eKind = drawing : : CircleKind_FULL ;
xPropSet - > getPropertyValue ( " CircleKind " ) > > = eKind ;
if ( eKind ! = drawing : : CircleKind_FULL )
{
OUStringBuffer sStringBuffer ;
sal_Int32 nStartAngle = 0 ;
sal_Int32 nEndAngle = 0 ;
xPropSet - > getPropertyValue ( " CircleStartAngle " ) > > = nStartAngle ;
xPropSet - > getPropertyValue ( " CircleEndAngle " ) > > = nEndAngle ;
const double dStartAngle = nStartAngle / 100.0 ;
const double dEndAngle = nEndAngle / 100.0 ;
// export circle kind
SvXMLUnitConverter : : convertEnum ( sStringBuffer , ( sal_uInt16 ) eKind , aXML_CircleKind_EnumMap ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_KIND , sStringBuffer . makeStringAndClear ( ) ) ;
// export start angle
: : sax : : Converter : : convertDouble ( sStringBuffer , dStartAngle ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_START_ANGLE , sStringBuffer . makeStringAndClear ( ) ) ;
// export end angle
: : sax : : Converter : : convertDouble ( sStringBuffer , dEndAngle ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_END_ANGLE , sStringBuffer . makeStringAndClear ( ) ) ;
}
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
2013-10-30 12:52:12 +00:00
// write ellipse or circle
2014-03-24 23:57:38 +01:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW ,
bCircle ? XML_CIRCLE : XML_ELLIPSE ,
2014-03-28 16:28:51 +02:00
bCreateNewline , true ) ;
2013-10-30 12:52:12 +00:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
ImpExportText ( xShape ) ;
2013-10-13 14:36:21 +03:00
}
}
void XMLShapeExport : : ImpExportPolygonShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType eShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
sal_Bool bBezier ( eShapeType = = XmlShapeTypeDrawClosedBezierShape
| | eShapeType = = XmlShapeTypeDrawOpenBezierShape ) ;
// get matrix
: : basegfx : : B2DHomMatrix aMatrix ;
ImpExportNewTrans_GetB2DHomMatrix ( aMatrix , xPropSet ) ;
// decompose and correct abour pRefPoint
: : basegfx : : B2DTuple aTRScale ;
double fTRShear ( 0.0 ) ;
double fTRRotate ( 0.0 ) ;
: : basegfx : : B2DTuple aTRTranslate ;
ImpExportNewTrans_DecomposeAndRefPoint ( aMatrix , aTRScale , fTRShear , fTRRotate , aTRTranslate , pRefPoint ) ;
// use features and write
ImpExportNewTrans_FeaturesAndWrite ( aTRScale , fTRShear , fTRRotate , aTRTranslate , nFeatures ) ;
// create and export ViewBox
awt : : Point aPoint ( 0 , 0 ) ;
awt : : Size aSize ( FRound ( aTRScale . getX ( ) ) , FRound ( aTRScale . getY ( ) ) ) ;
SdXMLImExViewBox aViewBox ( 0 , 0 , aSize . Width , aSize . Height ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_VIEWBOX , aViewBox . GetExportString ( ) ) ;
sal_Bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-30 12:52:12 +00:00
// prepare name (with most used)
enum : : xmloff : : token : : XMLTokenEnum eName ( XML_PATH ) ;
2013-10-13 14:36:21 +03:00
if ( bBezier )
{
// get PolygonBezier
uno : : Any aAny ( xPropSet - > getPropertyValue ( " Geometry " ) ) ;
2013-10-29 14:11:45 +00:00
const basegfx : : B2DPolyPolygon aPolyPolygon (
basegfx : : tools : : UnoPolyPolygonBezierCoordsToB2DPolyPolygon ( * ( drawing : : PolyPolygonBezierCoords * ) aAny . getValue ( ) ) ) ;
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
if ( aPolyPolygon . count ( ) )
2013-10-13 14:36:21 +03:00
{
2013-10-29 14:11:45 +00:00
// complex polygon shape, write as svg:d
const OUString aPolygonString (
basegfx : : tools : : exportToSvgD (
aPolyPolygon ,
true , // bUseRelativeCoordinates
false , // bDetectQuadraticBeziers: not used in old, but maybe activated now
true ) ) ; // bHandleRelativeNextPointCompatible
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
// write point array
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_D , aPolygonString ) ;
2013-10-13 14:36:21 +03:00
}
}
else
{
// get non-bezier polygon
uno : : Any aAny ( xPropSet - > getPropertyValue ( " Geometry " ) ) ;
2013-10-29 14:11:45 +00:00
const basegfx : : B2DPolyPolygon aPolyPolygon (
basegfx : : tools : : UnoPointSequenceSequenceToB2DPolyPolygon ( * ( drawing : : PointSequenceSequence * ) aAny . getValue ( ) ) ) ;
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
if ( ! aPolyPolygon . areControlPointsUsed ( ) & & 1 = = aPolyPolygon . count ( ) )
2013-10-13 14:36:21 +03:00
{
2013-10-29 14:11:45 +00:00
// simple polygon shape, can be written as svg:points sequence
const basegfx : : B2DPolygon aPolygon ( aPolyPolygon . getB2DPolygon ( 0 ) ) ;
const OUString aPointString ( basegfx : : tools : : exportToSvgPoints ( aPolygon ) ) ;
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
// write point array
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_POINTS , aPointString ) ;
2013-10-13 14:36:21 +03:00
2013-10-30 12:52:12 +00:00
// set name
eName = aPolygon . isClosed ( ) ? XML_POLYGON : XML_POLYLINE ;
2013-10-29 14:11:45 +00:00
}
else
{
// complex polygon shape, write as svg:d
const OUString aPolygonString (
basegfx : : tools : : exportToSvgD (
aPolyPolygon ,
true , // bUseRelativeCoordinates
false , // bDetectQuadraticBeziers: not used in old, but maybe activated now
true ) ) ; // bHandleRelativeNextPointCompatible
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
// write point array
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_D , aPolygonString ) ;
2013-10-13 14:36:21 +03:00
}
}
2013-10-29 14:11:45 +00:00
2013-10-30 14:41:25 +00:00
// write object, but after attributes are added since this call will
// consume all of these added attributes and the destructor will close the
// scope. Also before text is added; this may add sub-scopes as needed
2013-10-30 12:52:12 +00:00
SvXMLElementExport aOBJ (
mrExport ,
XML_NAMESPACE_DRAW ,
eName ,
bCreateNewline ,
2014-03-28 16:28:51 +02:00
true ) ;
2013-10-30 12:52:12 +00:00
2013-10-29 14:11:45 +00:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
ImpExportText ( xShape ) ;
2013-10-13 14:36:21 +03:00
}
}
void XMLShapeExport : : ImpExportGraphicObjectShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType eShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
sal_Bool bIsEmptyPresObj = sal_False ;
uno : : Reference < beans : : XPropertySetInfo > xPropSetInfo ( xPropSet - > getPropertySetInfo ( ) ) ;
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
OUString sImageURL ;
if ( eShapeType = = XmlShapeTypePresGraphicObjectShape )
bIsEmptyPresObj = ImpExportPresentationAttributes ( xPropSet , GetXMLToken ( XML_PRESENTATION_GRAPHIC ) ) ;
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
SvXMLElementExport aElem ( mrExport , XML_NAMESPACE_DRAW ,
2014-03-28 16:28:51 +02:00
XML_FRAME , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
const bool bSaveBackwardsCompatible = ( mrExport . getExportFlags ( ) & EXPORT_SAVEBACKWARDCOMPATIBLE ) ;
if ( ! bIsEmptyPresObj | | bSaveBackwardsCompatible )
{
if ( ! bIsEmptyPresObj )
{
OUString aStreamURL ;
OUString aStr ;
xPropSet - > getPropertyValue ( " GraphicStreamURL " ) > > = aStreamURL ;
xPropSet - > getPropertyValue ( " GraphicURL " ) > > = sImageURL ;
OUString aResolveURL ( sImageURL ) ;
const OUString sPackageURL ( " vnd.sun.star.Package: " ) ;
// sj: trying to preserve the filename
if ( aStreamURL . match ( sPackageURL , 0 ) )
{
OUString sRequestedName ( aStreamURL . copy ( sPackageURL . getLength ( ) , aStreamURL . getLength ( ) - sPackageURL . getLength ( ) ) ) ;
sal_Int32 nLastIndex = sRequestedName . lastIndexOf ( ' / ' ) + 1 ;
if ( ( nLastIndex > 0 ) & & ( nLastIndex < sRequestedName . getLength ( ) ) )
sRequestedName = sRequestedName . copy ( nLastIndex , sRequestedName . getLength ( ) - nLastIndex ) ;
nLastIndex = sRequestedName . lastIndexOf ( ' . ' ) ;
if ( nLastIndex > = 0 )
sRequestedName = sRequestedName . copy ( 0 , nLastIndex ) ;
if ( ! sRequestedName . isEmpty ( ) )
{
aResolveURL = aResolveURL . concat ( OUString ( " ?requestedName= " ) ) ;
aResolveURL = aResolveURL . concat ( sRequestedName ) ;
}
}
aStr = mrExport . AddEmbeddedGraphicObject ( aResolveURL ) ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , aStr ) ;
if ( ! aStr . isEmpty ( ) )
{
if ( aStr [ 0 ] = = ' # ' )
{
aStreamURL = sPackageURL ;
aStreamURL = aStreamURL . concat ( aStr . copy ( 1 , aStr . getLength ( ) - 1 ) ) ;
}
// update stream URL for load on demand
uno : : Any aAny ;
aAny < < = aStreamURL ;
xPropSet - > setPropertyValue ( " GraphicStreamURL " , aAny ) ;
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 ) ;
}
}
else
{
OUString aStr ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , aStr ) ;
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 ) ;
}
{
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_IMAGE , true , true ) ;
2013-10-13 14:36:21 +03:00
if ( ! sImageURL . isEmpty ( ) )
{
// optional office:binary-data
mrExport . AddEmbeddedGraphicObjectAsBase64 ( sImageURL ) ;
}
if ( ! bIsEmptyPresObj )
ImpExportText ( xShape ) ;
}
2013-11-15 15:29:02 +00:00
//Resolves: fdo#62461 put preferred image first above, followed by
//fallback here
if ( ! bIsEmptyPresObj )
{
OUString aReplacementUrl ;
xPropSet - > getPropertyValue ( " ReplacementGraphicURL " ) > > = aReplacementUrl ;
// If there is no url, then then graphic is empty
if ( ! aReplacementUrl . isEmpty ( ) )
{
const OUString aStr = mrExport . AddEmbeddedGraphicObject ( aReplacementUrl ) ;
if ( aStr . getLength ( ) )
{
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , aStr ) ;
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 ) ;
// xlink:href for replacement, only written for Svg content
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_IMAGE , true , true ) ;
2013-11-15 15:29:02 +00:00
// optional office:binary-data
mrExport . AddEmbeddedGraphicObjectAsBase64 ( aReplacementUrl ) ;
}
}
}
2013-10-13 14:36:21 +03:00
}
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
// image map
GetExport ( ) . GetImageMapExport ( ) . Export ( xPropSet ) ;
ImpExportDescription ( xShape ) ; // #i68101#
}
}
void XMLShapeExport : : ImpExportChartShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType eShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint ,
SvXMLAttributeList * pAttrList )
{
ImpExportOLE2Shape ( xShape , eShapeType , nFeatures , pRefPoint , pAttrList ) ;
}
void XMLShapeExport : : ImpExportControlShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
}
uno : : Reference < drawing : : XControlShape > xControl ( xShape , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xControl . is ( ) , " Control shape is not supporting XControlShape " ) ;
if ( xControl . is ( ) )
{
uno : : Reference < beans : : XPropertySet > xControlModel ( xControl - > getControl ( ) , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xControlModel . is ( ) , " Control shape has not XControlModel " ) ;
if ( xControlModel . is ( ) )
{
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_CONTROL , mrExport . GetFormExport ( ) - > getControlId ( xControlModel ) ) ;
}
}
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_CONTROL , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
ImpExportDescription ( xShape ) ; // #i68101#
}
void XMLShapeExport : : ImpExportConnectorShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType , sal_Int32 nFeatures /* = SEF_DEFAULT */ , awt : : Point * pRefPoint /* = NULL */ )
{
uno : : Reference < beans : : XPropertySet > xProps ( xShape , uno : : UNO_QUERY ) ;
OUString aStr ;
OUStringBuffer sStringBuffer ;
// export connection kind
drawing : : ConnectorType eType = drawing : : ConnectorType_STANDARD ;
uno : : Any aAny = xProps - > getPropertyValue ( " EdgeKind " ) ;
aAny > > = eType ;
if ( eType ! = drawing : : ConnectorType_STANDARD )
{
SvXMLUnitConverter : : convertEnum ( sStringBuffer , ( sal_uInt16 ) eType , aXML_ConnectionKind_EnumMap ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_TYPE , aStr ) ;
}
// export line skew
sal_Int32 nDelta1 = 0 , nDelta2 = 0 , nDelta3 = 0 ;
aAny = xProps - > getPropertyValue ( " EdgeLine1Delta " ) ;
aAny > > = nDelta1 ;
aAny = xProps - > getPropertyValue ( " EdgeLine2Delta " ) ;
aAny > > = nDelta2 ;
aAny = xProps - > getPropertyValue ( " EdgeLine3Delta " ) ;
aAny > > = nDelta3 ;
if ( nDelta1 ! = 0 | | nDelta2 ! = 0 | | nDelta3 ! = 0 )
{
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
nDelta1 ) ;
if ( nDelta2 ! = 0 | | nDelta3 ! = 0 )
{
const char aSpace = ' ' ;
sStringBuffer . appendAscii ( & aSpace , 1 ) ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
nDelta2 ) ;
if ( nDelta3 ! = 0 )
{
sStringBuffer . appendAscii ( & aSpace , 1 ) ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML (
sStringBuffer , nDelta3 ) ;
}
}
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_LINE_SKEW , aStr ) ;
}
// export start and end point
awt : : Point aStart ( 0 , 0 ) ;
awt : : Point aEnd ( 1 , 1 ) ;
/* Get <StartPositionInHoriL2R> and
< EndPositionInHoriL2R > , if they exist and if the document is exported
into the OpenOffice . org file format .
These properties only exist at service com : : sun : : star : : text : : Shape - the
Writer UNO service for shapes .
This code is needed , because the positioning attributes in the
OpenOffice . org file format are given in horizontal left - to - right layout
regardless the layout direction the shape is in . In the OASIS Open Office
file format the positioning attributes are correctly given in the layout
direction the shape is in . Thus , this code provides the conversion from
the OASIS Open Office file format to the OpenOffice . org file format . ( # i36248 # )
*/
if ( ( GetExport ( ) . getExportFlags ( ) & EXPORT_OASIS ) = = 0 & &
xProps - > getPropertySetInfo ( ) - > hasPropertyByName (
OUString ( " StartPositionInHoriL2R " ) ) & &
xProps - > getPropertySetInfo ( ) - > hasPropertyByName (
OUString ( " EndPositionInHoriL2R " ) ) )
{
xProps - > getPropertyValue ( " StartPositionInHoriL2R " ) > > = aStart ;
xProps - > getPropertyValue ( " EndPositionInHoriL2R " ) > > = aEnd ;
}
else
{
xProps - > getPropertyValue ( " StartPosition " ) > > = aStart ;
xProps - > getPropertyValue ( " EndPosition " ) > > = aEnd ;
}
if ( pRefPoint )
{
aStart . X - = pRefPoint - > X ;
aStart . Y - = pRefPoint - > Y ;
aEnd . X - = pRefPoint - > X ;
aEnd . Y - = pRefPoint - > Y ;
}
if ( nFeatures & SEF_EXPORT_X )
{
// svg: x1
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
aStart . X ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_X1 , aStr ) ;
}
else
{
aEnd . X - = aStart . X ;
}
if ( nFeatures & SEF_EXPORT_Y )
{
// svg: y1
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
aStart . Y ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_Y1 , aStr ) ;
}
else
{
aEnd . Y - = aStart . Y ;
}
// svg: x2
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer , aEnd . X ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_X2 , aStr ) ;
// svg: y2
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer , aEnd . Y ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_Y2 , aStr ) ;
// #i39320#
uno : : Reference < uno : : XInterface > xRefS ;
uno : : Reference < uno : : XInterface > xRefE ;
// export start connection
xProps - > getPropertyValue ( " StartShape " ) > > = xRefS ;
if ( xRefS . is ( ) )
{
const OUString & rShapeId = mrExport . getInterfaceToIdentifierMapper ( ) . getIdentifier ( xRefS ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_START_SHAPE , rShapeId ) ;
aAny = xProps - > getPropertyValue ( " StartGluePointIndex " ) ;
sal_Int32 nGluePointId = 0 ;
if ( aAny > > = nGluePointId )
{
if ( nGluePointId ! = - 1 )
{
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_START_GLUE_POINT , OUString : : number ( nGluePointId ) ) ;
}
}
}
// export end connection
xProps - > getPropertyValue ( " EndShape " ) > > = xRefE ;
if ( xRefE . is ( ) )
{
const OUString & rShapeId = mrExport . getInterfaceToIdentifierMapper ( ) . getIdentifier ( xRefE ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_END_SHAPE , rShapeId ) ;
aAny = xProps - > getPropertyValue ( " EndGluePointIndex " ) ;
sal_Int32 nGluePointId = 0 ;
if ( aAny > > = nGluePointId )
{
if ( nGluePointId ! = - 1 )
{
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_END_GLUE_POINT , OUString : : number ( nGluePointId ) ) ;
}
}
}
if ( xProps - > getPropertyValue ( " PolyPolygonBezier " ) > > = aAny )
{
// get PolygonBezier
2013-10-29 14:11:45 +00:00
drawing : : PolyPolygonBezierCoords * pSourcePolyPolygon = ( drawing : : PolyPolygonBezierCoords * ) aAny . getValue ( ) ;
2013-10-13 14:36:21 +03:00
if ( pSourcePolyPolygon & & pSourcePolyPolygon - > Coordinates . getLength ( ) )
{
2013-10-29 14:11:45 +00:00
const basegfx : : B2DPolyPolygon aPolyPolygon (
basegfx : : tools : : UnoPolyPolygonBezierCoordsToB2DPolyPolygon (
* pSourcePolyPolygon ) ) ;
const OUString aPolygonString (
basegfx : : tools : : exportToSvgD (
aPolyPolygon ,
true , // bUseRelativeCoordinates
false , // bDetectQuadraticBeziers: not used in old, but maybe activated now
true ) ) ; // bHandleRelativeNextPointCompatible
2013-10-31 18:51:11 +01:00
// write point array
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_D , aPolygonString ) ;
2013-10-13 14:36:21 +03:00
}
}
// get matrix
: : basegfx : : B2DHomMatrix aMatrix ;
ImpExportNewTrans_GetB2DHomMatrix ( aMatrix , xProps ) ;
// decompose and correct about pRefPoint
: : basegfx : : B2DTuple aTRScale ;
double fTRShear ( 0.0 ) ;
double fTRRotate ( 0.0 ) ;
: : basegfx : : B2DTuple aTRTranslate ;
ImpExportNewTrans_DecomposeAndRefPoint ( aMatrix , aTRScale , fTRShear ,
fTRRotate , aTRTranslate , pRefPoint ) ;
// fdo#49678: create and export ViewBox
awt : : Point aPoint ( 0 , 0 ) ;
awt : : Size aSize ( FRound ( aTRScale . getX ( ) ) , FRound ( aTRScale . getY ( ) ) ) ;
SdXMLImExViewBox aViewBox ( 0 , 0 , aSize . Width , aSize . Height ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_VIEWBOX , aViewBox . GetExportString ( ) ) ;
// write connector shape. Add Export later.
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_CONNECTOR , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
ImpExportText ( xShape ) ;
}
void XMLShapeExport : : ImpExportMeasureShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType , sal_Int32 nFeatures /* = SEF_DEFAULT */ , awt : : Point * pRefPoint /* = NULL */ )
{
uno : : Reference < beans : : XPropertySet > xProps ( xShape , uno : : UNO_QUERY ) ;
OUString aStr ;
OUStringBuffer sStringBuffer ;
// export start and end point
awt : : Point aStart ( 0 , 0 ) ;
awt : : Point aEnd ( 1 , 1 ) ;
/* Get <StartPositionInHoriL2R> and
< EndPositionInHoriL2R > , if they exist and if the document is exported
into the OpenOffice . org file format .
These properties only exist at service com : : sun : : star : : text : : Shape - the
Writer UNO service for shapes .
This code is needed , because the positioning attributes in the
OpenOffice . org file format are given in horizontal left - to - right layout
regardless the layout direction the shape is in . In the OASIS Open Office
file format the positioning attributes are correctly given in the layout
direction the shape is in . Thus , this code provides the conversion from
the OASIS Open Office file format to the OpenOffice . org file format . ( # i36248 # )
*/
if ( ( GetExport ( ) . getExportFlags ( ) & EXPORT_OASIS ) = = 0 & &
xProps - > getPropertySetInfo ( ) - > hasPropertyByName (
OUString ( " StartPositionInHoriL2R " ) ) & &
xProps - > getPropertySetInfo ( ) - > hasPropertyByName (
OUString ( " EndPositionInHoriL2R " ) ) )
{
xProps - > getPropertyValue ( " StartPositionInHoriL2R " ) > > = aStart ;
xProps - > getPropertyValue ( " EndPositionInHoriL2R " ) > > = aEnd ;
}
else
{
xProps - > getPropertyValue ( " StartPosition " ) > > = aStart ;
xProps - > getPropertyValue ( " EndPosition " ) > > = aEnd ;
}
if ( pRefPoint )
{
aStart . X - = pRefPoint - > X ;
aStart . Y - = pRefPoint - > Y ;
aEnd . X - = pRefPoint - > X ;
aEnd . Y - = pRefPoint - > Y ;
}
if ( nFeatures & SEF_EXPORT_X )
{
// svg: x1
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
aStart . X ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_X1 , aStr ) ;
}
else
{
aEnd . X - = aStart . X ;
}
if ( nFeatures & SEF_EXPORT_Y )
{
// svg: y1
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
aStart . Y ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_Y1 , aStr ) ;
}
else
{
aEnd . Y - = aStart . Y ;
}
// svg: x2
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer , aEnd . X ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_X2 , aStr ) ;
// svg: y2
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer , aEnd . Y ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_Y2 , aStr ) ;
// write measure shape
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_MEASURE , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
uno : : Reference < text : : XText > xText ( xShape , uno : : UNO_QUERY ) ;
if ( xText . is ( ) )
mrExport . GetTextParagraphExport ( ) - > exportText ( xText ) ;
}
void XMLShapeExport : : ImpExportOLE2Shape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType eShapeType , sal_Int32 nFeatures /* = SEF_DEFAULT */ , awt : : Point * pRefPoint /* = NULL */ ,
SvXMLAttributeList * pAttrList /* = NULL */ )
{
uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
uno : : Reference < container : : XNamed > xNamed ( xShape , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xPropSet . is ( ) & & xNamed . is ( ) , " ole shape is not implementing needed interfaces " ) ;
if ( xPropSet . is ( ) & & xNamed . is ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
sal_Bool bIsEmptyPresObj = sal_False ;
// presentation settings
if ( eShapeType = = XmlShapeTypePresOLE2Shape )
bIsEmptyPresObj = ImpExportPresentationAttributes ( xPropSet , GetXMLToken ( XML_PRESENTATION_OBJECT ) ) ;
else if ( eShapeType = = XmlShapeTypePresChartShape )
bIsEmptyPresObj = ImpExportPresentationAttributes ( xPropSet , GetXMLToken ( XML_PRESENTATION_CHART ) ) ;
else if ( eShapeType = = XmlShapeTypePresSheetShape )
bIsEmptyPresObj = ImpExportPresentationAttributes ( xPropSet , GetXMLToken ( XML_PRESENTATION_TABLE ) ) ;
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
sal_Bool bExportEmbedded ( 0 ! = ( mrExport . getExportFlags ( ) & EXPORT_EMBEDDED ) ) ;
OUString sPersistName ;
SvXMLElementExport aElement ( mrExport , XML_NAMESPACE_DRAW ,
2014-03-28 16:28:51 +02:00
XML_FRAME , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
const bool bSaveBackwardsCompatible = ( mrExport . getExportFlags ( ) & EXPORT_SAVEBACKWARDCOMPATIBLE ) ;
if ( ! bIsEmptyPresObj | | bSaveBackwardsCompatible )
{
if ( pAttrList )
{
mrExport . AddAttributeList ( pAttrList ) ;
}
OUString sClassId ;
OUString sURL ;
sal_Bool bInternal = false ;
xPropSet - > getPropertyValue ( " IsInternal " ) > > = bInternal ;
if ( ! bIsEmptyPresObj )
{
if ( bInternal )
{
2014-03-29 18:15:35 +01:00
// OOo internal links have no storage persistence, URL is stored in the XML file
2013-10-13 14:36:21 +03:00
// the result LinkURL is empty in case the object is not a link
xPropSet - > getPropertyValue ( " LinkURL " ) > > = sURL ;
}
xPropSet - > getPropertyValue ( " PersistName " ) > > = sPersistName ;
if ( sURL . isEmpty ( ) )
{
if ( ! sPersistName . isEmpty ( ) )
{
2013-11-15 11:05:19 +02:00
sURL = " vnd.sun.star.EmbeddedObject: " + sPersistName ;
2013-10-13 14:36:21 +03:00
}
}
if ( ! bInternal )
xPropSet - > getPropertyValue ( " CLSID " ) > > = sClassId ;
if ( ! sClassId . isEmpty ( ) )
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_CLASS_ID , sClassId ) ;
if ( eShapeType ! = XmlShapeTypePresChartShape & & eShapeType ! = XmlShapeTypeDrawChartShape )
{
// #i118485# Add text export, the draw OLE shape allows text now
// fdo#58571 chart objects don't allow text:p
ImpExportText ( xShape ) ;
}
if ( ! bExportEmbedded )
{
// xlink:href
if ( ! sURL . isEmpty ( ) )
{
// #96717# in theorie, if we don't have a url we shouldn't even
// export this ole shape. But practical its to risky right now
// to change this so we better dispose this on load
sURL = mrExport . AddEmbeddedObject ( sURL ) ;
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 ) ;
}
}
}
else
{
// export empty href for empty placeholders to be valid ODF
OUString sEmptyURL ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , sEmptyURL ) ;
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 ) ;
}
enum XMLTokenEnum eElem = sClassId . isEmpty ( ) ? XML_OBJECT : XML_OBJECT_OLE ;
2014-03-28 16:28:51 +02:00
SvXMLElementExport aElem ( mrExport , XML_NAMESPACE_DRAW , eElem , true , true ) ;
2013-10-13 14:36:21 +03:00
if ( bExportEmbedded & & ! bIsEmptyPresObj )
{
// #100592#
if ( bInternal )
{
// embedded XML
uno : : Reference < lang : : XComponent > xComp ;
xPropSet - > getPropertyValue ( " Model " ) > > = xComp ;
DBG_ASSERT ( xComp . is ( ) , " no xModel for own OLE format " ) ;
mrExport . ExportEmbeddedOwnObject ( xComp ) ;
}
else
{
// embed as Base64
// this is an alien object ( currently MSOLE is the only supported type of such objects )
// in case it is not an OASIS format the object should be asked to store replacement image if possible
OUString sURLRequest ( sURL ) ;
if ( ( mrExport . getExportFlags ( ) & EXPORT_OASIS ) = = 0 )
2013-11-15 11:05:19 +02:00
sURLRequest + = " ?oasis=false " ;
2013-10-13 14:36:21 +03:00
mrExport . AddEmbeddedObjectAsBase64 ( sURLRequest ) ;
}
}
}
if ( ! bIsEmptyPresObj )
{
OUString sURL ( " vnd.sun.star.GraphicObject: " ) ;
sURL + = sPersistName ;
if ( ! bExportEmbedded )
{
sURL = GetExport ( ) . AddEmbeddedObject ( sURL ) ;
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 ,
2014-03-28 16:28:51 +02:00
XML_IMAGE , false , true ) ;
2013-10-13 14:36:21 +03:00
if ( bExportEmbedded )
GetExport ( ) . AddEmbeddedObjectAsBase64 ( sURL ) ;
}
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
ImpExportDescription ( xShape ) ; // #i68101#
}
}
void XMLShapeExport : : ImpExportPageShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType eShapeType , sal_Int32 nFeatures /* = SEF_DEFAULT */ , awt : : Point * pRefPoint /* = NULL */ )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
// #86163# Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
// export page number used for this page
uno : : Reference < beans : : XPropertySetInfo > xPropSetInfo ( xPropSet - > getPropertySetInfo ( ) ) ;
const OUString aPageNumberStr ( " PageNumber " ) ;
if ( xPropSetInfo . is ( ) & & xPropSetInfo - > hasPropertyByName ( aPageNumberStr ) )
{
sal_Int32 nPageNumber = 0 ;
xPropSet - > getPropertyValue ( aPageNumberStr ) > > = nPageNumber ;
if ( nPageNumber )
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_PAGE_NUMBER , OUString : : number ( nPageNumber ) ) ;
}
// a presentation page shape, normally used on notes pages only. If
// it is used not as presentation shape, it may have been created with
// copy-paste exchange between draw and impress (this IS possible...)
if ( eShapeType = = XmlShapeTypePresPageShape )
{
mrExport . AddAttribute ( XML_NAMESPACE_PRESENTATION , XML_CLASS ,
XML_PRESENTATION_PAGE ) ;
}
// write Page shape
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_PAGE_THUMBNAIL , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
}
}
void XMLShapeExport : : ImpExportCaptionShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType , sal_Int32 nFeatures /* = SEF_DEFAULT */ , awt : : Point * pRefPoint /* = NULL */ )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
// evtl. corner radius?
sal_Int32 nCornerRadius ( 0L ) ;
xPropSet - > getPropertyValue ( " CornerRadius " ) > > = nCornerRadius ;
if ( nCornerRadius )
{
OUStringBuffer sStringBuffer ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
nCornerRadius ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_CORNER_RADIUS , sStringBuffer . makeStringAndClear ( ) ) ;
}
awt : : Point aCaptionPoint ;
xPropSet - > getPropertyValue ( " CaptionPoint " ) > > = aCaptionPoint ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( msBuffer ,
aCaptionPoint . X ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_CAPTION_POINT_X , msBuffer . makeStringAndClear ( ) ) ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( msBuffer ,
aCaptionPoint . Y ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_CAPTION_POINT_Y , msBuffer . makeStringAndClear ( ) ) ;
// write Caption shape. Add export later.
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
sal_Bool bAnnotation ( ( nFeatures & SEF_EXPORT_ANNOTATION ) = = SEF_EXPORT_ANNOTATION ) ;
SvXMLElementExport aObj ( mrExport ,
( bAnnotation ? XML_NAMESPACE_OFFICE
: XML_NAMESPACE_DRAW ) ,
( bAnnotation ? XML_ANNOTATION : XML_CAPTION ) ,
2014-03-28 16:28:51 +02:00
bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
ImpExportGluePoints ( xShape ) ;
if ( bAnnotation )
mrExport . exportAnnotationMeta ( xShape ) ;
ImpExportText ( xShape ) ;
}
}
void XMLShapeExport : : ImpExportFrameShape (
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 ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
SvXMLElementExport aElem ( mrExport , XML_NAMESPACE_DRAW ,
2014-03-28 16:28:51 +02:00
XML_FRAME , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
// export frame url
OUString aStr ;
xPropSet - > getPropertyValue ( " FrameURL " ) > > = aStr ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , GetExport ( ) . GetRelativeReference ( aStr ) ) ;
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 ) ;
// export name
xPropSet - > getPropertyValue ( " FrameName " ) > > = aStr ;
if ( ! aStr . isEmpty ( ) )
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_FRAME_NAME , aStr ) ;
// write floating frame
{
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_FLOATING_FRAME , true , true ) ;
2013-10-13 14:36:21 +03:00
}
}
}
void XMLShapeExport : : ImpExportAppletShape (
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 ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
SvXMLElementExport aElement ( mrExport , XML_NAMESPACE_DRAW ,
2014-03-28 16:28:51 +02:00
XML_FRAME , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
// export frame url
OUString aStr ;
xPropSet - > getPropertyValue ( " AppletCodeBase " ) > > = aStr ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , GetExport ( ) . GetRelativeReference ( aStr ) ) ;
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 ) ;
// export draw:applet-name
xPropSet - > getPropertyValue ( " AppletName " ) > > = aStr ;
if ( ! aStr . isEmpty ( ) )
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_APPLET_NAME , aStr ) ;
// export draw:code
xPropSet - > getPropertyValue ( " AppletCode " ) > > = aStr ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_CODE , aStr ) ;
// export draw:may-script
sal_Bool bIsScript = false ;
xPropSet - > getPropertyValue ( " AppletIsScript " ) > > = bIsScript ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_MAY_SCRIPT , bIsScript ? XML_TRUE : XML_FALSE ) ;
{
// write applet
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_APPLET , true , true ) ;
2013-10-13 14:36:21 +03:00
// export parameters
uno : : Sequence < beans : : PropertyValue > aCommands ;
xPropSet - > getPropertyValue ( " AppletCommands " ) > > = aCommands ;
const sal_Int32 nCount = aCommands . getLength ( ) ;
for ( sal_Int32 nIndex = 0 ; nIndex < nCount ; nIndex + + )
{
aCommands [ nIndex ] . Value > > = aStr ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_NAME , aCommands [ nIndex ] . Name ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_VALUE , aStr ) ;
2014-03-28 16:28:51 +02:00
SvXMLElementExport aElem ( mrExport , XML_NAMESPACE_DRAW , XML_PARAM , false , true ) ;
2013-10-13 14:36:21 +03:00
}
}
}
}
void XMLShapeExport : : ImpExportPluginShape (
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 ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
SvXMLElementExport aElement ( mrExport , XML_NAMESPACE_DRAW ,
2014-03-28 16:28:51 +02:00
XML_FRAME , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
// export plugin url
OUString aStr ;
xPropSet - > getPropertyValue ( " PluginURL " ) > > = aStr ;
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , GetExport ( ) . GetRelativeReference ( aStr ) ) ;
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 ) ;
// export mime-type
xPropSet - > getPropertyValue ( " PluginMimeType " ) > > = aStr ;
if ( ! aStr . isEmpty ( ) )
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_MIME_TYPE , aStr ) ;
{
// write plugin
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_PLUGIN , true , true ) ;
2013-10-13 14:36:21 +03:00
// export parameters
uno : : Sequence < beans : : PropertyValue > aCommands ;
xPropSet - > getPropertyValue ( " PluginCommands " ) > > = aCommands ;
const sal_Int32 nCount = aCommands . getLength ( ) ;
for ( sal_Int32 nIndex = 0 ; nIndex < nCount ; nIndex + + )
{
aCommands [ nIndex ] . Value > > = aStr ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_NAME , aCommands [ nIndex ] . Name ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_VALUE , aStr ) ;
2014-03-28 16:28:51 +02:00
SvXMLElementExport aElem ( mrExport , XML_NAMESPACE_DRAW , XML_PARAM , false , true ) ;
2013-10-13 14:36:21 +03:00
}
}
}
}
static void lcl_CopyStream (
uno : : Reference < io : : XInputStream > const & xInStream ,
uno : : Reference < embed : : XStorage > const & xTarget ,
2014-04-04 13:16:02 +02:00
OUString const & rPath , const OUString & rMimeType )
2013-10-13 14:36:21 +03:00
{
: : comphelper : : LifecycleProxy proxy ;
uno : : Reference < io : : XStream > const xStream (
: : comphelper : : OStorageHelper : : GetStreamAtPackageURL ( xTarget , rPath ,
embed : : ElementModes : : WRITE | embed : : ElementModes : : TRUNCATE , proxy ) ) ;
uno : : Reference < io : : XOutputStream > const xOutStream (
( xStream . is ( ) ) ? xStream - > getOutputStream ( ) : 0 ) ;
if ( ! xOutStream . is ( ) )
{
SAL_WARN ( " xmloff " , " no output stream " ) ;
throw uno : : Exception (
OUString ( " no output stream " ) , 0 ) ;
}
uno : : Reference < beans : : XPropertySet > const xStreamProps ( xStream ,
uno : : UNO_QUERY ) ;
if ( xStreamProps . is ( ) ) { // this is NOT supported in FileSystemStorage
xStreamProps - > setPropertyValue (
OUString ( " MediaType " ) ,
2014-04-04 13:16:02 +02:00
uno : : makeAny ( rMimeType ) ) ;
2013-10-13 14:36:21 +03:00
xStreamProps - > setPropertyValue ( // turn off compression
OUString ( " Compressed " ) ,
uno : : makeAny ( sal_False ) ) ;
}
: : comphelper : : OStorageHelper : : CopyInputToOutput ( xInStream , xOutStream ) ;
xOutStream - > closeOutput ( ) ;
proxy . commitStorages ( ) ;
}
static OUString
lcl_StoreMediaAndGetURL ( SvXMLExport & rExport ,
uno : : Reference < beans : : XPropertySet > const & xPropSet ,
2014-04-04 13:16:02 +02:00
OUString const & rURL , const OUString & rMimeType )
2013-10-13 14:36:21 +03:00
{
2014-03-01 19:16:40 +01:00
OUString urlPath ;
if ( rURL . startsWithIgnoreAsciiCase ( " vnd.sun.star.Package: " , & urlPath ) )
2013-10-13 14:36:21 +03:00
{
try // video is embedded
{
uno : : Reference < embed : : XStorage > const xTarget (
rExport . GetTargetStorage ( ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < io : : XInputStream > xInStream ;
xPropSet - > getPropertyValue (
OUString ( " PrivateStream " ) )
> > = xInStream ;
if ( ! xInStream . is ( ) )
{
SAL_WARN ( " xmloff " , " no input stream " ) ;
return OUString ( ) ;
}
2014-04-04 13:16:02 +02:00
lcl_CopyStream ( xInStream , xTarget , rURL , rMimeType ) ;
2013-10-13 14:36:21 +03:00
return urlPath ;
}
catch ( uno : : Exception const & e )
{
SAL_INFO ( " xmloff " , " exception while storing embedded media: ' "
< < e . Message < < " ' " ) ;
}
return OUString ( ) ;
}
else
{
return rExport . GetRelativeReference ( rURL ) ; // linked
}
}
2014-04-02 11:59:42 +02:00
static void lcl_StoreJsonExternals (
SvXMLExport & rExport , const OUString & rURL )
{
OUString sUrlPath ;
if ( rURL . startsWithIgnoreAsciiCase ( " vnd.sun.star.Package: " , & sUrlPath ) )
{
sUrlPath = sUrlPath . copy ( 0 , sUrlPath . lastIndexOf ( " / " ) ) ;
try
{
// Base storage
uno : : Reference < document : : XStorageBasedDocument > const xSBD (
rExport . GetModel ( ) , uno : : UNO_QUERY_THROW ) ;
const uno : : Reference < embed : : XStorage > xStorage (
xSBD - > getDocumentStorage ( ) , uno : : UNO_QUERY_THROW ) ;
// Model source
: : comphelper : : LifecycleProxy proxy ;
const uno : : Reference < embed : : XStorage > xModelStorage (
: : comphelper : : OStorageHelper : : GetStorageAtPath ( xStorage , sUrlPath ,
embed : : ElementModes : : READ , proxy ) ) ;
// Target storage
uno : : Reference < embed : : XStorage > const xTarget (
rExport . GetTargetStorage ( ) , uno : : UNO_QUERY_THROW ) ;
// Target of all models
const uno : : Reference < embed : : XStorage > xModelsTarget (
xTarget - > openStorageElement ( sUrlPath . copy ( 0 , sUrlPath . lastIndexOf ( " / " ) ) , embed : : ElementModes : : WRITE ) ) ;
// Target of current model
const uno : : Reference < embed : : XStorage > xModelTarget (
xModelsTarget - > openStorageElement ( sUrlPath . copy ( sUrlPath . lastIndexOf ( " / " ) + 1 ) , embed : : ElementModes : : WRITE ) ) ;
xModelStorage - > copyToStorage ( xModelTarget ) ;
uno : : Reference < embed : : XTransactedObject > const xTransaction ( xModelsTarget , uno : : UNO_QUERY ) ;
if ( xTransaction . is ( ) )
{
xTransaction - > commit ( ) ;
}
}
catch ( uno : : Exception const & e )
{
SAL_INFO ( " xmloff " , " exception while storing embedded model: ' " < < e . Message < < " ' " ) ;
}
}
}
2013-10-13 14:36:21 +03:00
void XMLShapeExport : : ImpExportMediaShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType eShapeType , sal_Int32 nFeatures , com : : sun : : star : : awt : : Point * pRefPoint )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
if ( eShapeType = = XmlShapeTypePresMediaShape )
ImpExportPresentationAttributes ( xPropSet , GetXMLToken ( XML_PRESENTATION_OBJECT ) ) ;
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2013-10-13 14:36:21 +03:00
SvXMLElementExport aElem ( mrExport , XML_NAMESPACE_DRAW ,
2014-03-28 16:28:51 +02:00
XML_FRAME , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
// export media url
OUString aMediaURL ;
xPropSet - > getPropertyValue ( " MediaURL " ) > > = aMediaURL ;
2014-04-04 13:16:02 +02:00
OUString sMimeType ;
xPropSet - > getPropertyValue ( " MediaMimeType " ) > > = sMimeType ;
2013-10-13 14:36:21 +03:00
OUString const persistentURL =
2014-04-04 13:16:02 +02:00
lcl_StoreMediaAndGetURL ( GetExport ( ) , xPropSet , aMediaURL , sMimeType ) ;
2014-04-04 13:17:34 +02:00
if ( sMimeType = = " application/vnd.gltf+json " )
2014-04-02 11:59:42 +02:00
lcl_StoreJsonExternals ( GetExport ( ) , aMediaURL ) ;
2013-10-13 14:36:21 +03:00
mrExport . AddAttribute ( XML_NAMESPACE_XLINK , XML_HREF , persistentURL ) ;
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 ) ;
// export mime-type
2014-04-04 13:14:45 +02:00
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_MIME_TYPE , sMimeType ) ;
2013-10-13 14:36:21 +03:00
// write plugin
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_PLUGIN , ! ( nFeatures & SEF_EXPORT_NO_WS ) , true ) ;
2013-10-13 14:36:21 +03:00
// export parameters
const OUString aFalseStr ( " false " ) , aTrueStr ( " true " ) ;
sal_Bool bLoop = false ;
const OUString aLoopStr ( " Loop " ) ;
xPropSet - > getPropertyValue ( aLoopStr ) > > = bLoop ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_NAME , aLoopStr ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_VALUE , bLoop ? aTrueStr : aFalseStr ) ;
2014-03-28 16:28:51 +02:00
delete ( new SvXMLElementExport ( mrExport , XML_NAMESPACE_DRAW , XML_PARAM , false , true ) ) ;
2013-10-13 14:36:21 +03:00
sal_Bool bMute = false ;
const OUString aMuteStr ( " Mute " ) ;
xPropSet - > getPropertyValue ( aMuteStr ) > > = bMute ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_NAME , aMuteStr ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_VALUE , bMute ? aTrueStr : aFalseStr ) ;
2014-03-28 16:28:51 +02:00
delete ( new SvXMLElementExport ( mrExport , XML_NAMESPACE_DRAW , XML_PARAM , false , true ) ) ;
2013-10-13 14:36:21 +03:00
sal_Int16 nVolumeDB = 0 ;
const OUString aVolumeDBStr ( " VolumeDB " ) ;
xPropSet - > getPropertyValue ( " VolumeDB " ) > > = nVolumeDB ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_NAME , aVolumeDBStr ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_VALUE , OUString : : number ( nVolumeDB ) ) ;
2014-03-28 16:28:51 +02:00
delete ( new SvXMLElementExport ( mrExport , XML_NAMESPACE_DRAW , XML_PARAM , false , true ) ) ;
2013-10-13 14:36:21 +03:00
media : : ZoomLevel eZoom ;
const OUString aZoomStr ( " Zoom " ) ;
OUString aZoomValue ;
xPropSet - > getPropertyValue ( " Zoom " ) > > = eZoom ;
switch ( eZoom )
{
2013-11-15 11:05:19 +02:00
case ( media : : ZoomLevel_ZOOM_1_TO_4 ) : aZoomValue = " 25% " ; break ;
case ( media : : ZoomLevel_ZOOM_1_TO_2 ) : aZoomValue = " 50% " ; break ;
case ( media : : ZoomLevel_ORIGINAL ) : aZoomValue = " 100% " ; break ;
case ( media : : ZoomLevel_ZOOM_2_TO_1 ) : aZoomValue = " 200% " ; break ;
case ( media : : ZoomLevel_ZOOM_4_TO_1 ) : aZoomValue = " 400% " ; break ;
case ( media : : ZoomLevel_FIT_TO_WINDOW ) : aZoomValue = " fit " ; break ;
case ( media : : ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT ) : aZoomValue = " fixedfit " ; break ;
case ( media : : ZoomLevel_FULLSCREEN ) : aZoomValue = " fullscreen " ; break ;
2013-10-13 14:36:21 +03:00
default :
break ;
}
if ( ! aZoomValue . isEmpty ( ) )
{
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_NAME , aZoomStr ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_VALUE , aZoomValue ) ;
2014-03-28 16:28:51 +02:00
delete ( new SvXMLElementExport ( mrExport , XML_NAMESPACE_DRAW , XML_PARAM , false , true ) ) ;
2013-10-13 14:36:21 +03:00
}
}
}
void XMLShapeExport : : ImpExport3DSceneShape ( const uno : : Reference < drawing : : XShape > & xShape , XmlShapeType , sal_Int32 nFeatures , awt : : Point * pRefPoint )
{
uno : : Reference < drawing : : XShapes > xShapes ( xShape , uno : : UNO_QUERY ) ;
if ( xShapes . is ( ) & & xShapes - > getCount ( ) )
{
uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
DBG_ASSERT ( xPropSet . is ( ) , " XMLShapeExport::ImpExport3DSceneShape can't export a scene without a propertyset " ) ;
if ( xPropSet . is ( ) )
{
// Transformation
ImpExportNewTrans ( xPropSet , nFeatures , pRefPoint ) ;
// 3d attributes
export3DSceneAttributes ( xPropSet ) ;
// write 3DScene shape
sal_Bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DR3D , XML_SCENE , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
ImpExportDescription ( xShape ) ; // #i68101#
ImpExportEvents ( xShape ) ;
// write 3DSceneLights
export3DLamps ( xPropSet ) ;
// #89764# if export of position is supressed for group shape,
// positions of contained objects should be written relative to
// the upper left edge of the group.
awt : : Point aUpperLeft ;
if ( ! ( nFeatures & SEF_EXPORT_POSITION ) )
{
nFeatures | = SEF_EXPORT_POSITION ;
aUpperLeft = xShape - > getPosition ( ) ;
pRefPoint = & aUpperLeft ;
}
// write members
exportShapes ( xShapes , nFeatures , pRefPoint ) ;
}
}
}
void XMLShapeExport : : ImpExport3DShape (
const uno : : Reference < drawing : : XShape > & xShape ,
XmlShapeType eShapeType , sal_Int32 /* nFeatures = SEF_DEFAULT */ , awt : : Point * /*pRefPoint = NULL */ )
{
const uno : : Reference < beans : : XPropertySet > xPropSet ( xShape , uno : : UNO_QUERY ) ;
if ( xPropSet . is ( ) )
{
OUString aStr ;
OUStringBuffer sStringBuffer ;
// transformation (UNO_NAME_3D_TRANSFORM_MATRIX == "D3DTransformMatrix")
uno : : Any aAny = xPropSet - > getPropertyValue ( " D3DTransformMatrix " ) ;
drawing : : HomogenMatrix xHomMat ;
aAny > > = xHomMat ;
SdXMLImExTransform3D aTransform ;
aTransform . AddHomogenMatrix ( xHomMat ) ;
if ( aTransform . NeedsAction ( ) )
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_TRANSFORM , aTransform . GetExportString ( mrExport . GetMM100UnitConverter ( ) ) ) ;
switch ( eShapeType )
{
case XmlShapeTypeDraw3DCubeObject :
{
// minEdge
aAny = xPropSet - > getPropertyValue ( " D3DPosition " ) ;
drawing : : Position3D aPosition3D ;
aAny > > = aPosition3D ;
: : basegfx : : B3DVector aPos3D ( aPosition3D . PositionX , aPosition3D . PositionY , aPosition3D . PositionZ ) ;
// maxEdge
aAny = xPropSet - > getPropertyValue ( " D3DSize " ) ;
drawing : : Direction3D aDirection3D ;
aAny > > = aDirection3D ;
: : basegfx : : B3DVector aDir3D ( aDirection3D . DirectionX , aDirection3D . DirectionY , aDirection3D . DirectionZ ) ;
// transform maxEdge from distance to pos
aDir3D = aPos3D + aDir3D ;
// write minEdge
if ( aPos3D ! = : : basegfx : : B3DVector ( - 2500.0 , - 2500.0 , - 2500.0 ) ) // write only when not default
{
mrExport . GetMM100UnitConverter ( ) . convertB3DVector ( sStringBuffer , aPos3D ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_MIN_EDGE , aStr ) ;
}
// write maxEdge
if ( aDir3D ! = : : basegfx : : B3DVector ( 2500.0 , 2500.0 , 2500.0 ) ) // write only when not default
{
mrExport . GetMM100UnitConverter ( ) . convertB3DVector ( sStringBuffer , aDir3D ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_MAX_EDGE , aStr ) ;
}
2013-10-30 14:41:25 +00:00
// write 3DCube shape
// #i123542# Do this *after* the attributes are added, else these will be lost since opening
// the scope will clear the global attribute list at the exporter
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DR3D , XML_CUBE , true , true ) ;
2013-10-30 14:41:25 +00:00
2013-10-13 14:36:21 +03:00
break ;
}
case XmlShapeTypeDraw3DSphereObject :
{
// Center
aAny = xPropSet - > getPropertyValue ( " D3DPosition " ) ;
drawing : : Position3D aPosition3D ;
aAny > > = aPosition3D ;
: : basegfx : : B3DVector aPos3D ( aPosition3D . PositionX , aPosition3D . PositionY , aPosition3D . PositionZ ) ;
// Size
aAny = xPropSet - > getPropertyValue ( " D3DSize " ) ;
drawing : : Direction3D aDirection3D ;
aAny > > = aDirection3D ;
: : basegfx : : B3DVector aDir3D ( aDirection3D . DirectionX , aDirection3D . DirectionY , aDirection3D . DirectionZ ) ;
// write Center
if ( aPos3D ! = : : basegfx : : B3DVector ( 0.0 , 0.0 , 0.0 ) ) // write only when not default
{
mrExport . GetMM100UnitConverter ( ) . convertB3DVector ( sStringBuffer , aPos3D ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_CENTER , aStr ) ;
}
// write Size
if ( aDir3D ! = : : basegfx : : B3DVector ( 5000.0 , 5000.0 , 5000.0 ) ) // write only when not default
{
mrExport . GetMM100UnitConverter ( ) . convertB3DVector ( sStringBuffer , aDir3D ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_SIZE , aStr ) ;
}
2013-10-30 14:41:25 +00:00
// write 3DSphere shape
// #i123542# Do this *after* the attributes are added, else these will be lost since opening
// the scope will clear the global attribute list at the exporter
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DR3D , XML_SPHERE , true , true ) ;
2013-10-30 14:41:25 +00:00
2013-10-13 14:36:21 +03:00
break ;
}
case XmlShapeTypeDraw3DLatheObject :
case XmlShapeTypeDraw3DExtrudeObject :
{
2013-10-29 14:11:45 +00:00
// write special 3DLathe/3DExtrude attributes, get 3D PolyPolygon as drawing::PolyPolygonShape3D
2013-10-13 14:36:21 +03:00
aAny = xPropSet - > getPropertyValue ( " D3DPolyPolygon3D " ) ;
drawing : : PolyPolygonShape3D xPolyPolygon3D ;
aAny > > = xPolyPolygon3D ;
2013-10-29 14:11:45 +00:00
// convert to 3D PolyPolygon
const basegfx : : B3DPolyPolygon aPolyPolygon3D (
basegfx : : tools : : UnoPolyPolygonShape3DToB3DPolyPolygon (
xPolyPolygon3D ) ) ;
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
// convert to 2D PolyPolygon using identity 3D transformation (just grep X and Y)
const basegfx : : B3DHomMatrix aB3DHomMatrixFor2DConversion ;
const basegfx : : B2DPolyPolygon aPolyPolygon (
basegfx : : tools : : createB2DPolyPolygonFromB3DPolyPolygon (
aPolyPolygon3D ,
aB3DHomMatrixFor2DConversion ) ) ;
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
// get 2D range of it
const basegfx : : B2DRange aPolyPolygonRange ( aPolyPolygon . getB2DRange ( ) ) ;
2013-10-13 14:36:21 +03:00
// export ViewBox
SdXMLImExViewBox aViewBox (
2013-10-29 14:11:45 +00:00
aPolyPolygonRange . getMinX ( ) ,
aPolyPolygonRange . getMinY ( ) ,
aPolyPolygonRange . getWidth ( ) ,
aPolyPolygonRange . getHeight ( ) ) ;
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_VIEWBOX , aViewBox . GetExportString ( ) ) ;
2013-10-13 14:36:21 +03:00
2013-10-29 14:11:45 +00:00
// prepare svg:d string
const OUString aPolygonString (
basegfx : : tools : : exportToSvgD (
aPolyPolygon ,
true , // bUseRelativeCoordinates
false , // bDetectQuadraticBeziers TTTT: not used in old, but maybe activated now
true ) ) ; // bHandleRelativeNextPointCompatible
2013-10-13 14:36:21 +03:00
// write point array
2013-10-29 14:11:45 +00:00
mrExport . AddAttribute ( XML_NAMESPACE_SVG , XML_D , aPolygonString ) ;
2013-10-13 14:36:21 +03:00
if ( eShapeType = = XmlShapeTypeDraw3DLatheObject )
{
// write 3DLathe shape
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DR3D , XML_ROTATE , true , true ) ;
2013-10-13 14:36:21 +03:00
}
else
{
// write 3DExtrude shape
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DR3D , XML_EXTRUDE , true , true ) ;
2013-10-13 14:36:21 +03:00
}
break ;
}
default :
break ;
}
}
}
/** helper for chart that adds all attributes of a 3d scene element to the export */
void XMLShapeExport : : export3DSceneAttributes ( const com : : sun : : star : : uno : : Reference < com : : sun : : star : : beans : : XPropertySet > & xPropSet )
{
OUString aStr ;
OUStringBuffer sStringBuffer ;
// world transformation (UNO_NAME_3D_TRANSFORM_MATRIX == "D3DTransformMatrix")
uno : : Any aAny = xPropSet - > getPropertyValue ( " D3DTransformMatrix " ) ;
drawing : : HomogenMatrix xHomMat ;
aAny > > = xHomMat ;
SdXMLImExTransform3D aTransform ;
aTransform . AddHomogenMatrix ( xHomMat ) ;
if ( aTransform . NeedsAction ( ) )
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_TRANSFORM , aTransform . GetExportString ( mrExport . GetMM100UnitConverter ( ) ) ) ;
// VRP, VPN, VUP
aAny = xPropSet - > getPropertyValue ( " D3DCameraGeometry " ) ;
drawing : : CameraGeometry aCamGeo ;
aAny > > = aCamGeo ;
: : basegfx : : B3DVector aVRP ( aCamGeo . vrp . PositionX , aCamGeo . vrp . PositionY , aCamGeo . vrp . PositionZ ) ;
if ( aVRP ! = : : basegfx : : B3DVector ( 0.0 , 0.0 , 1.0 ) ) // write only when not default
{
mrExport . GetMM100UnitConverter ( ) . convertB3DVector ( sStringBuffer , aVRP ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_VRP , aStr ) ;
}
: : basegfx : : B3DVector aVPN ( aCamGeo . vpn . DirectionX , aCamGeo . vpn . DirectionY , aCamGeo . vpn . DirectionZ ) ;
if ( aVPN ! = : : basegfx : : B3DVector ( 0.0 , 0.0 , 1.0 ) ) // write only when not default
{
mrExport . GetMM100UnitConverter ( ) . convertB3DVector ( sStringBuffer , aVPN ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_VPN , aStr ) ;
}
: : basegfx : : B3DVector aVUP ( aCamGeo . vup . DirectionX , aCamGeo . vup . DirectionY , aCamGeo . vup . DirectionZ ) ;
if ( aVUP ! = : : basegfx : : B3DVector ( 0.0 , 1.0 , 0.0 ) ) // write only when not default
{
mrExport . GetMM100UnitConverter ( ) . convertB3DVector ( sStringBuffer , aVUP ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_VUP , aStr ) ;
}
// projection "D3DScenePerspective" drawing::ProjectionMode
aAny = xPropSet - > getPropertyValue ( " D3DScenePerspective " ) ;
drawing : : ProjectionMode xPrjMode ;
aAny > > = xPrjMode ;
if ( xPrjMode = = drawing : : ProjectionMode_PARALLEL )
aStr = GetXMLToken ( XML_PARALLEL ) ;
else
aStr = GetXMLToken ( XML_PERSPECTIVE ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_PROJECTION , aStr ) ;
// distance
aAny = xPropSet - > getPropertyValue ( " D3DSceneDistance " ) ;
sal_Int32 nDistance = 0 ;
aAny > > = nDistance ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
nDistance ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_DISTANCE , aStr ) ;
// focalLength
aAny = xPropSet - > getPropertyValue ( " D3DSceneFocalLength " ) ;
sal_Int32 nFocalLength = 0 ;
aAny > > = nFocalLength ;
mrExport . GetMM100UnitConverter ( ) . convertMeasureToXML ( sStringBuffer ,
nFocalLength ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_FOCAL_LENGTH , aStr ) ;
// shadowSlant
aAny = xPropSet - > getPropertyValue ( " D3DSceneShadowSlant " ) ;
sal_Int16 nShadowSlant = 0 ;
aAny > > = nShadowSlant ;
: : sax : : Converter : : convertNumber ( sStringBuffer , ( sal_Int32 ) nShadowSlant ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_SHADOW_SLANT , aStr ) ;
// shadeMode
aAny = xPropSet - > getPropertyValue ( " D3DSceneShadeMode " ) ;
drawing : : ShadeMode xShadeMode ;
if ( aAny > > = xShadeMode )
{
if ( xShadeMode = = drawing : : ShadeMode_FLAT )
aStr = GetXMLToken ( XML_FLAT ) ;
else if ( xShadeMode = = drawing : : ShadeMode_PHONG )
aStr = GetXMLToken ( XML_PHONG ) ;
else if ( xShadeMode = = drawing : : ShadeMode_SMOOTH )
aStr = GetXMLToken ( XML_GOURAUD ) ;
else
aStr = GetXMLToken ( XML_DRAFT ) ;
}
else
{
// ShadeMode enum not there, write default
aStr = GetXMLToken ( XML_GOURAUD ) ;
}
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_SHADE_MODE , aStr ) ;
// ambientColor
aAny = xPropSet - > getPropertyValue ( " D3DSceneAmbientColor " ) ;
sal_Int32 nAmbientColor = 0 ;
aAny > > = nAmbientColor ;
: : sax : : Converter : : convertColor ( sStringBuffer , nAmbientColor ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_AMBIENT_COLOR , aStr ) ;
// lightingMode
aAny = xPropSet - > getPropertyValue ( " D3DSceneTwoSidedLighting " ) ;
sal_Bool bTwoSidedLighting = false ;
aAny > > = bTwoSidedLighting ;
: : sax : : Converter : : convertBool ( sStringBuffer , bTwoSidedLighting ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_LIGHTING_MODE , aStr ) ;
}
/** helper for chart that exports all lamps from the propertyset */
void XMLShapeExport : : export3DLamps ( const com : : sun : : star : : uno : : Reference < com : : sun : : star : : beans : : XPropertySet > & xPropSet )
{
// write lamps 1..8 as content
OUString aStr ;
OUStringBuffer sStringBuffer ;
const OUString aColorPropName ( " D3DSceneLightColor " ) ;
const OUString aDirectionPropName ( " D3DSceneLightDirection " ) ;
const OUString aLightOnPropName ( " D3DSceneLightOn " ) ;
OUString aPropName ;
OUString aIndexStr ;
: : basegfx : : B3DVector aLightDirection ;
drawing : : Direction3D xLightDir ;
sal_Bool bLightOnOff = false ;
for ( sal_Int32 nLamp = 1 ; nLamp < = 8 ; nLamp + + )
{
aIndexStr = OUString : : number ( nLamp ) ;
// lightcolor
aPropName = aColorPropName ;
aPropName + = aIndexStr ;
sal_Int32 nLightColor = 0 ;
xPropSet - > getPropertyValue ( aPropName ) > > = nLightColor ;
: : sax : : Converter : : convertColor ( sStringBuffer , nLightColor ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_DIFFUSE_COLOR , aStr ) ;
// lightdirection
aPropName = aDirectionPropName ;
aPropName + = aIndexStr ;
xPropSet - > getPropertyValue ( aPropName ) > > = xLightDir ;
aLightDirection = : : basegfx : : B3DVector ( xLightDir . DirectionX , xLightDir . DirectionY , xLightDir . DirectionZ ) ;
mrExport . GetMM100UnitConverter ( ) . convertB3DVector ( sStringBuffer , aLightDirection ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_DIRECTION , aStr ) ;
// lighton
aPropName = aLightOnPropName ;
aPropName + = aIndexStr ;
xPropSet - > getPropertyValue ( aPropName ) > > = bLightOnOff ;
: : sax : : Converter : : convertBool ( sStringBuffer , bLightOnOff ) ;
aStr = sStringBuffer . makeStringAndClear ( ) ;
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_ENABLED , aStr ) ;
// specular
mrExport . AddAttribute ( XML_NAMESPACE_DR3D , XML_SPECULAR ,
nLamp = = 1 ? XML_TRUE : XML_FALSE ) ;
// write light entry
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DR3D , XML_LIGHT , true , true ) ;
2013-10-13 14:36:21 +03:00
}
}
// using namespace ::com::sun::star::io;
// using namespace ::xmloff::EnhancedCustomShapeToken;
void ExportParameter ( OUStringBuffer & rStrBuffer , const com : : sun : : star : : drawing : : EnhancedCustomShapeParameter & rParameter )
{
if ( ! rStrBuffer . isEmpty ( ) )
2013-11-13 12:10:31 +02:00
rStrBuffer . append ( ' ' ) ;
2013-10-13 14:36:21 +03:00
if ( rParameter . Value . getValueTypeClass ( ) = = uno : : TypeClass_DOUBLE )
{
double fNumber = 0.0 ;
rParameter . Value > > = fNumber ;
2014-01-28 19:58:40 +01:00
: : rtl : : math : : doubleToUStringBuffer ( rStrBuffer , fNumber , rtl_math_StringFormat_Automatic , rtl_math_DecimalPlaces_Max , ' . ' , true ) ;
2013-10-13 14:36:21 +03:00
}
else
{
sal_Int32 nValue = 0 ;
rParameter . Value > > = nValue ;
switch ( rParameter . Type )
{
case com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : EQUATION :
{
rStrBuffer . append ( " ?f " + OUString : : number ( nValue ) ) ;
}
break ;
case com : : sun : : star : : drawing : : EnhancedCustomShapeParameterType : : ADJUSTMENT :
{
2013-11-13 12:10:31 +02:00
rStrBuffer . append ( ' $ ' ) ;
2013-10-13 14:36:21 +03:00
rStrBuffer . append ( OUString : : number ( 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 : : number ( nValue ) ) ;
}
}
}
void ImpExportEquations ( SvXMLExport & rExport , const uno : : Sequence < OUString > & rEquations )
{
sal_Int32 i ;
for ( i = 0 ; i < rEquations . getLength ( ) ; i + + )
{
2013-11-13 12:10:31 +02:00
OUString aStr ( ' f ' ) ;
2013-10-13 14:36:21 +03:00
aStr + = OUString : : number ( i ) ;
rExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_NAME , aStr ) ;
aStr = rEquations [ i ] ;
sal_Int32 nIndex = 0 ;
do
{
2013-11-13 12:10:31 +02:00
nIndex = aStr . indexOf ( ' ? ' , nIndex ) ;
2013-10-13 14:36:21 +03:00
if ( nIndex ! = - 1 )
{
OUString aNew ( aStr . copy ( 0 , nIndex + 1 ) ) ;
2013-11-13 12:10:31 +02:00
aNew + = OUString ( ' f ' ) ;
2013-10-13 14:36:21 +03:00
aNew + = aStr . copy ( nIndex + 1 , ( aStr . getLength ( ) - nIndex ) - 1 ) ;
aStr = aNew ;
nIndex + + ;
}
} while ( nIndex ! = - 1 ) ;
rExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_FORMULA , aStr ) ;
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( rExport , XML_NAMESPACE_DRAW , XML_EQUATION , true , true ) ;
2013-10-13 14:36:21 +03:00
}
}
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 )
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( rExport , XML_NAMESPACE_DRAW , XML_HANDLE , true , true ) ;
2013-10-13 14:36:21 +03:00
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 ( ) )
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' ' ) ;
2013-10-13 14:36:21 +03:00
sal_Int32 nParameter = 0 ;
switch ( aSegment . Command )
{
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : CLOSESUBPATH :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' Z ' ) ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ENDSUBPATH :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' N ' ) ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : NOFILL :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' F ' ) ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : NOSTROKE :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' S ' ) ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : MOVETO :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' M ' ) ; nParameter = 1 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : LINETO :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' L ' ) ; nParameter = 1 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : CURVETO :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' C ' ) ; nParameter = 3 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ANGLEELLIPSETO :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' T ' ) ; nParameter = 3 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ANGLEELLIPSE :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' U ' ) ; nParameter = 3 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ARCTO :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' A ' ) ; nParameter = 4 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ARC :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' B ' ) ; nParameter = 4 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : CLOCKWISEARCTO :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' W ' ) ; nParameter = 4 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : CLOCKWISEARC :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' V ' ) ; nParameter = 4 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ELLIPTICALQUADRANTX :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' X ' ) ; nParameter = 1 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ELLIPTICALQUADRANTY :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' Y ' ) ; nParameter = 1 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : QUADRATICCURVETO :
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' Q ' ) ; nParameter = 2 ; break ;
2013-10-13 14:36:21 +03:00
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : ARCANGLETO :
if ( bExtended ) {
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' G ' ) ;
2013-10-13 14:36:21 +03:00
nParameter = 2 ;
} else {
aStrBuffer . setLength ( aStrBuffer . getLength ( ) - 1 ) ;
bNeedExtended = true ;
i + = 2 ;
}
break ;
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : DARKEN :
if ( bExtended )
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' H ' ) ;
2013-10-13 14:36:21 +03:00
else
bNeedExtended = true ;
break ;
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : DARKENLESS :
if ( bExtended )
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' I ' ) ;
2013-10-13 14:36:21 +03:00
else
bNeedExtended = true ;
break ;
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : LIGHTEN :
if ( bExtended )
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' J ' ) ;
2013-10-13 14:36:21 +03:00
else
bNeedExtended = true ;
break ;
case com : : sun : : star : : drawing : : EnhancedCustomShapeSegmentCommand : : LIGHTENLESS :
if ( bExtended )
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' K ' ) ;
2013-10-13 14:36:21 +03:00
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 ) ;
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' % ' ) ;
2013-10-13 14:36:21 +03:00
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 )
{
2014-03-31 11:47:05 +02:00
rExport . GetMM100UnitConverter ( ) . convertDouble ( aStrBuffer , fDepth , true ) ;
2013-10-13 14:36:21 +03:00
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 ) ;
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' % ' ) ;
2013-10-13 14:36:21 +03:00
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 : : number ( 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 ) ;
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' % ' ) ;
2013-10-13 14:36:21 +03:00
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 ) ;
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' % ' ) ;
2013-10-13 14:36:21 +03:00
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 ) ;
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' % ' ) ;
2013-10-13 14:36:21 +03:00
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 ) ;
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' % ' ) ;
2013-10-13 14:36:21 +03:00
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 : : number ( nStretchPoint ) ) ;
}
break ;
case EAS_StretchY :
{
sal_Int32 nStretchPoint = 0 ;
if ( rProp . Value > > = nStretchPoint )
rExport . AddAttribute ( XML_NAMESPACE_DRAW , XML_PATH_STRETCHPOINT_Y , OUString : : number ( 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 )
2013-11-13 12:10:31 +02:00
aStrBuffer . append ( ' ' ) ;
2013-10-13 14:36:21 +03:00
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 ) ;
}
}
2014-03-28 16:28:51 +02:00
SvXMLElementExport aOBJ ( rExport , XML_NAMESPACE_DRAW , XML_ENHANCED_GEOMETRY , true , true ) ;
2013-10-13 14:36:21 +03:00
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 ) ;
}
}
2014-03-28 16:28:51 +02:00
bool bCreateNewline ( ( nFeatures & SEF_EXPORT_NO_WS ) = = 0 ) ; // #86116#/#92210#
SvXMLElementExport aOBJ ( mrExport , XML_NAMESPACE_DRAW , XML_CUSTOM_SHAPE , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
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 ) ) ;
2014-03-28 16:28:51 +02:00
SvXMLElementExport aElement ( mrExport , XML_NAMESPACE_DRAW , XML_FRAME , bCreateNewline , true ) ;
2013-10-13 14:36:21 +03:00
// 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 ;
2013-12-13 10:54:12 +02:00
const OUString sAPIPropertyName ( pEntry - > msApiName , pEntry - > nApiNameLength , RTL_TEXTENCODING_ASCII_US ) ;
2013-10-13 14:36:21 +03:00
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
{
uno : : 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 : : UNO_QUERY_THROW ) ;
}
else
{
xStorage . set ( GetExport ( ) . GetTargetStorage ( ) , uno : : 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 : : number ( + + nIndex ) ;
sPictureName + = sSuffix ;
}
while ( xPictureStorage - > hasByName ( sPictureName ) ) ;
xPictureStream . set ( xPictureStorage - > openStreamElement ( sPictureName , : : embed : : ElementModes : : READWRITE ) , uno : : UNO_QUERY_THROW ) ;
}
uno : : Reference < graphic : : XGraphicProvider > xProvider ( graphic : : GraphicProvider : : create ( xContext ) ) ;
uno : : Sequence < beans : : PropertyValue > aArgs ( 2 ) ;
2013-11-15 11:05:19 +02:00
aArgs [ 0 ] . Name = " MimeType " ;
2013-10-13 14:36:21 +03:00
aArgs [ 0 ] . Value < < = OUString ( " image/x-vclgraphic " ) ;
2013-11-15 11:05:19 +02:00
aArgs [ 1 ] . Name = " OutputStream " ;
2013-10-13 14:36:21 +03:00
aArgs [ 1 ] . Value < < = xPictureStream - > getOutputStream ( ) ;
xProvider - > storeGraphic ( xGraphic , aArgs ) ;
if ( xPictureStorage . is ( ) )
{
uno : : Reference < embed : : XTransactedObject > xTrans ( xPictureStorage , uno : : 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 ) ;
}
2014-03-28 16:28:51 +02:00
SvXMLElementExport aElem ( GetExport ( ) , XML_NAMESPACE_DRAW , XML_IMAGE , false , true ) ;
2013-10-13 14:36:21 +03:00
if ( bExportEmbedded )
{
uno : : Reference < io : : XSeekableInputStream > xSeekable ( xPictureStream , uno : : UNO_QUERY_THROW ) ;
xSeekable - > seek ( 0 ) ;
XMLBase64Export aBase64Exp ( GetExport ( ) ) ;
aBase64Exp . exportOfficeBinaryDataElement ( uno : : Reference < io : : XInputStream > ( xPictureStream , uno : : 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: */
2010-10-12 15:53:47 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */