diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-12-21 11:12:40 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-12-21 19:13:47 +0100 |
commit | 44ea0b3a2550a79148fb86f3e7175fffe77674b4 (patch) | |
tree | 5c0207c67758e888f6a4ce8a49c62f1285600da8 /writerfilter | |
parent | 8870e068cc7368ffa14a6938836b370d2a188b64 (diff) |
writerfilter: refactor to get rid of savedPositionOffset{V,H} statics
Which are extremely scary, allowing a shape position from one doc to
appear in an other if two writerfilter import is in progress at the same
time.
This partially reverts 8fa1a0874765ea7db57e496f1d92731b9ab09280 (read
wp:positionOffset, wp:alignV and wp:alignH properly (bnc#513579),
2011-05-04).
Change-Id: I0fcddf88fa56f5f9288e47bcd100c38ee9cf2f13
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/inc/resourcemodel/WW8ResourceModel.hxx | 8 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 17 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.hxx | 2 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 2 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 2 | ||||
-rw-r--r-- | writerfilter/source/dmapper/GraphicHelpers.cxx | 40 | ||||
-rw-r--r-- | writerfilter/source/dmapper/GraphicHelpers.hxx | 7 | ||||
-rw-r--r-- | writerfilter/source/dmapper/GraphicImport.cxx | 11 | ||||
-rw-r--r-- | writerfilter/source/dmapper/GraphicImport.hxx | 1 | ||||
-rw-r--r-- | writerfilter/source/dmapper/LoggedResources.cxx | 15 | ||||
-rw-r--r-- | writerfilter/source/dmapper/LoggedResources.hxx | 3 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 16 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 20 |
13 files changed, 91 insertions, 53 deletions
diff --git a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx index b4254b6a97e2..7bdfeea0130d 100644 --- a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx +++ b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx @@ -240,6 +240,14 @@ public: */ virtual void utext(const sal_uInt8 * data, size_t len) = 0; + /** + * Offset in EMUs for a shape. + * + * Call *before* an ooxml::CT_PosH/V_posOffset sprm is sent. + */ + virtual void positionOffset(const OUString& rText, bool bVertical) = 0; + /// Returns the last set offsets of a shape in HMM. + virtual css::awt::Point getPositionOffset() = 0; virtual void positivePercentage(const OUString& rText) = 0; /** diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index e6cf4fe6437d..eb10e4009b5a 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -28,6 +28,7 @@ #include <i18nlangtag/languagetag.hxx> #include <i18nutil/paper.hxx> #include <oox/token/tokens.hxx> +#include <oox/drawingml/drawingmltypes.hxx> #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> #include <com/sun/star/document/XOOXMLDocumentPropertiesImporter.hpp> #include <com/sun/star/table/ShadowFormat.hpp> @@ -2907,6 +2908,22 @@ void DomainMapper::lcl_text(const sal_uInt8 * data_, size_t len) } } +void DomainMapper::lcl_positionOffset(const OUString& rText, bool bVertical) +{ + if (bVertical) + m_pImpl->m_aPositionOffsets.second = rText; + else + m_pImpl->m_aPositionOffsets.first = rText; +} + +awt::Point DomainMapper::getPositionOffset() +{ + awt::Point aRet; + aRet.X = oox::drawingml::convertEmuToHmm(m_pImpl->m_aPositionOffsets.first.toInt32()); + aRet.Y = oox::drawingml::convertEmuToHmm(m_pImpl->m_aPositionOffsets.second.toInt32()); + return aRet; +} + void DomainMapper::lcl_positivePercentage(const OUString& rText) { m_pImpl->m_aPositivePercentages.push(rText); diff --git a/writerfilter/source/dmapper/DomainMapper.hxx b/writerfilter/source/dmapper/DomainMapper.hxx index 67c16f34b4e7..013fe2d43127 100644 --- a/writerfilter/source/dmapper/DomainMapper.hxx +++ b/writerfilter/source/dmapper/DomainMapper.hxx @@ -145,6 +145,8 @@ private: virtual void lcl_text(const sal_uInt8 * data, size_t len) SAL_OVERRIDE; virtual void lcl_utext(const sal_uInt8 * data, size_t len) SAL_OVERRIDE; + virtual void lcl_positionOffset(const OUString& rText, bool bVertical) SAL_OVERRIDE; + virtual css::awt::Point getPositionOffset() SAL_OVERRIDE; virtual void lcl_positivePercentage(const OUString& rText) SAL_OVERRIDE; virtual void lcl_props(writerfilter::Reference<Properties>::Pointer_t ref) SAL_OVERRIDE; virtual void lcl_table(Id name, diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index a3694bd9e660..4e0835f2099f 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -4557,7 +4557,7 @@ void DomainMapper_Impl::AddAnnotationPosition( GraphicImportPtr DomainMapper_Impl::GetGraphicImport(GraphicImportType eGraphicImportType) { if(!m_pGraphicImport) - m_pGraphicImport.reset( new GraphicImport( m_xComponentContext, m_xTextFactory, m_rDMapper, eGraphicImportType, m_aPositivePercentages ) ); + m_pGraphicImport.reset( new GraphicImport( m_xComponentContext, m_xTextFactory, m_rDMapper, eGraphicImportType, m_aPositionOffsets, m_aPositivePercentages ) ); return m_pGraphicImport; } /*------------------------------------------------------------------------- diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 30fef54df9d7..c2ccf2b4f447 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -826,6 +826,8 @@ public: /// A sub-grabbag of m_aInteropGrabBag, like 'spacing'. std::vector<css::beans::PropertyValue> m_aSubInteropGrabBag; + /// ST_PositionOffset values we received + std::pair<OUString, OUString> m_aPositionOffsets; /// ST_PositivePercentage values we received std::queue<OUString> m_aPositivePercentages; bool isInIndexContext() { return m_bStartIndex;} diff --git a/writerfilter/source/dmapper/GraphicHelpers.cxx b/writerfilter/source/dmapper/GraphicHelpers.cxx index 0dfc80e48b60..53143dd7092d 100644 --- a/writerfilter/source/dmapper/GraphicHelpers.cxx +++ b/writerfilter/source/dmapper/GraphicHelpers.cxx @@ -39,27 +39,22 @@ namespace dmapper { using namespace com::sun::star; -int PositionHandler::savedPositionOffsetV = 0; -int PositionHandler::savedPositionOffsetH = 0; int PositionHandler::savedAlignV = text::VertOrientation::NONE; int PositionHandler::savedAlignH = text::HoriOrientation::NONE; -PositionHandler::PositionHandler( bool vertical ) : -LoggedProperties(dmapper_logger, "PositionHandler") +PositionHandler::PositionHandler( bool vertical, std::pair<OUString, OUString>& rPositionOffsets ) : +LoggedProperties(dmapper_logger, "PositionHandler"), +m_rPositionOffsets(rPositionOffsets) { m_nRelation = text::RelOrientation::FRAME; if( vertical ) { - m_nPosition = savedPositionOffsetV; m_nOrient = savedAlignV; - savedPositionOffsetV = 0; savedAlignV = text::VertOrientation::NONE; } else { - m_nPosition = savedPositionOffsetH; m_nOrient = savedAlignH; - savedPositionOffsetH = 0; savedAlignH = text::HoriOrientation::NONE; } } @@ -133,8 +128,19 @@ void PositionHandler::lcl_attribute( Id aName, Value& rVal ) } } -void PositionHandler::lcl_sprm( Sprm& ) +void PositionHandler::lcl_sprm(Sprm& rSprm) { + sal_uInt32 nSprmId = rSprm.getId(); + + switch (nSprmId) + { + case NS_ooxml::LN_CT_PosH_posOffset: + m_nPosition = oox::drawingml::convertEmuToHmm(m_rPositionOffsets.first.toInt32()); + break; + case NS_ooxml::LN_CT_PosV_posOffset: + m_nPosition = oox::drawingml::convertEmuToHmm(m_rPositionOffsets.second.toInt32()); + break; + } } sal_Int16 PositionHandler::orientation() const @@ -152,22 +158,6 @@ sal_Int16 PositionHandler::orientation() const -void PositionHandler::setPositionOffset(const OUString & sText, bool vertical) -{ - if( vertical ) - savedPositionOffsetV = oox::drawingml::convertEmuToHmm(sText.toInt32()); - else - savedPositionOffsetH = oox::drawingml::convertEmuToHmm(sText.toInt32()); -} - -int PositionHandler::getPositionOffset(bool vertical) -{ - if (vertical) - return savedPositionOffsetV; - else - return savedPositionOffsetH; -} - void PositionHandler::setAlignH(const OUString & sText) { if( sText == "left") diff --git a/writerfilter/source/dmapper/GraphicHelpers.hxx b/writerfilter/source/dmapper/GraphicHelpers.hxx index 545dd9550dac..68eca32177ba 100644 --- a/writerfilter/source/dmapper/GraphicHelpers.hxx +++ b/writerfilter/source/dmapper/GraphicHelpers.hxx @@ -25,6 +25,7 @@ #include <boost/shared_ptr.hpp> #include <map> +#include <utility> namespace writerfilter { namespace dmapper @@ -33,10 +34,8 @@ namespace dmapper class PositionHandler: public LoggedProperties { public: - PositionHandler( bool vertical ); + PositionHandler( bool vertical, std::pair<OUString, OUString>& rPositionOffsets ); virtual ~PositionHandler( ); - static void setPositionOffset(const OUString & sText, bool vertical); - static int getPositionOffset(bool vertical); static void setAlignH(const OUString & sText); static void setAlignV(const OUString & sText); sal_Int16 orientation() const; @@ -48,8 +47,8 @@ public: sal_Int16 m_nOrient; sal_Int16 m_nRelation; sal_Int32 m_nPosition; - static int savedPositionOffsetV, savedPositionOffsetH; static int savedAlignV, savedAlignH; + std::pair<OUString, OUString>& m_rPositionOffsets; }; typedef boost::shared_ptr<PositionHandler> PositionHandlerPtr; diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx index de999affa584..fae9b3d1eb1a 100644 --- a/writerfilter/source/dmapper/GraphicImport.cxx +++ b/writerfilter/source/dmapper/GraphicImport.cxx @@ -261,6 +261,7 @@ public: OUString sName; OUString sAlternativeText; OUString title; + std::pair<OUString, OUString>& m_rPositionOffsets; std::queue<OUString>& m_rPositivePercentages; OUString sAnchorId; comphelper::SequenceAsHashMap m_aInteropGrabBag; @@ -269,7 +270,7 @@ public: boost::optional<sal_Int32> m_oEffectExtentRight; boost::optional<sal_Int32> m_oEffectExtentBottom; - GraphicImport_Impl(GraphicImportType eImportType, DomainMapper& rDMapper, std::queue<OUString>& rPositivePercentages) : + GraphicImport_Impl(GraphicImportType eImportType, DomainMapper& rDMapper, std::pair<OUString, OUString>& rPositionOffsets, std::queue<OUString>& rPositivePercentages) : nXSize(0) ,bXSizeValid(false) ,nYSize(0) @@ -320,6 +321,7 @@ public: ,bSizeProtected(false) ,bPositionProtected(false) ,nShapeOptionType(0) + ,m_rPositionOffsets(rPositionOffsets) ,m_rPositivePercentages(rPositivePercentages) {} @@ -444,11 +446,12 @@ GraphicImport::GraphicImport(uno::Reference<uno::XComponentContext> const& xComp uno::Reference<lang::XMultiServiceFactory> const& xTextFactory, DomainMapper& rDMapper, GraphicImportType eImportType, + std::pair<OUString, OUString>& rPositionOffsets, std::queue<OUString>& rPositivePercentages) : LoggedProperties(dmapper_logger, "GraphicImport") , LoggedTable(dmapper_logger, "GraphicImport") , LoggedStream(dmapper_logger, "GraphicImport") -, m_pImpl(new GraphicImport_Impl(eImportType, rDMapper, rPositivePercentages)) +, m_pImpl(new GraphicImport_Impl(eImportType, rDMapper, rPositionOffsets, rPositivePercentages)) , m_xComponentContext(xComponentContext) , m_xTextFactory(xTextFactory) { @@ -1045,7 +1048,7 @@ void GraphicImport::lcl_sprm(Sprm& rSprm) case NS_ooxml::LN_CT_Anchor_positionH: // 90976; { // Use a special handler for the positionning - PositionHandlerPtr pHandler( new PositionHandler( false )); + PositionHandlerPtr pHandler( new PositionHandler( false, m_pImpl->m_rPositionOffsets )); writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); if( pProperties.get( ) ) { @@ -1071,7 +1074,7 @@ void GraphicImport::lcl_sprm(Sprm& rSprm) case NS_ooxml::LN_CT_Anchor_positionV: // 90977; { // Use a special handler for the positionning - PositionHandlerPtr pHandler( new PositionHandler( true )); + PositionHandlerPtr pHandler( new PositionHandler( true, m_pImpl->m_rPositionOffsets )); writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); if( pProperties.get( ) ) { diff --git a/writerfilter/source/dmapper/GraphicImport.hxx b/writerfilter/source/dmapper/GraphicImport.hxx index 3552d261abc9..89fc5c1575f8 100644 --- a/writerfilter/source/dmapper/GraphicImport.hxx +++ b/writerfilter/source/dmapper/GraphicImport.hxx @@ -83,6 +83,7 @@ public: css::uno::Reference<css::lang::XMultiServiceFactory> const& xTextFactory, DomainMapper& rDomainMapper, GraphicImportType eGraphicImportType, + std::pair<OUString, OUString>& rPositionOffsets, std::queue<OUString>& rPositivePercentages); virtual ~GraphicImport(); diff --git a/writerfilter/source/dmapper/LoggedResources.cxx b/writerfilter/source/dmapper/LoggedResources.cxx index 4d8051e1ceb0..3fafd308dc81 100644 --- a/writerfilter/source/dmapper/LoggedResources.cxx +++ b/writerfilter/source/dmapper/LoggedResources.cxx @@ -204,6 +204,21 @@ void LoggedStream::utext(const sal_uInt8 * data, size_t len) #endif } +void LoggedStream::positionOffset(const OUString& rText, bool bVertical) +{ +#ifdef DEBUG_WRITERFILTER + mHelper.startElement("positionOffset"); + mHelper.attribute("vertical", static_cast<int>(bVertical)); + mHelper.chars(rText); +#endif + + lcl_positionOffset(rText, bVertical); + +#ifdef DEBUG_WRITERFILTER + mHelper.endElement("positionOffset"); +#endif +} + void LoggedStream::positivePercentage(const OUString& rText) { #ifdef DEBUG_WRITERFILTER diff --git a/writerfilter/source/dmapper/LoggedResources.hxx b/writerfilter/source/dmapper/LoggedResources.hxx index 514751188749..2524485109ba 100644 --- a/writerfilter/source/dmapper/LoggedResources.hxx +++ b/writerfilter/source/dmapper/LoggedResources.hxx @@ -63,6 +63,7 @@ public: void endShape() SAL_OVERRIDE; void text(const sal_uInt8 * data, size_t len) SAL_OVERRIDE; void utext(const sal_uInt8 * data, size_t len) SAL_OVERRIDE; + void positionOffset(const OUString& rText, bool bVertical) SAL_OVERRIDE; void positivePercentage(const OUString& rText) SAL_OVERRIDE; void props(writerfilter::Reference<Properties>::Pointer_t ref) SAL_OVERRIDE; void table(Id name, writerfilter::Reference<Table>::Pointer_t ref) SAL_OVERRIDE; @@ -80,6 +81,8 @@ protected: virtual void lcl_endShape() = 0; virtual void lcl_text(const sal_uInt8 * data, size_t len) = 0; virtual void lcl_utext(const sal_uInt8 * data, size_t len) = 0; + virtual void lcl_positionOffset(const OUString& /*rText*/, bool /*bVertical*/) { } + virtual css::awt::Point getPositionOffset() { return css::awt::Point(); } virtual void lcl_positivePercentage(const OUString& /*rText*/) { } virtual void lcl_props(writerfilter::Reference<Properties>::Pointer_t ref) = 0; virtual void lcl_table(Id name, writerfilter::Reference<Table>::Pointer_t ref) = 0; diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index a461ed7089ac..3c7094f94d48 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -656,20 +656,10 @@ void OOXMLFastContextHandler::text(const OUString & sText) sText.getLength()); } -/* - HACK. An ugly hack. The problem with wp:positionOffset, wp:alignV and wp:alignH - is that they do not work in the usual OOXML way of <tag val="value"/> but instead - it's <tag>value</tag>, which is otherwise used only things like <t>. And I really - haven't managed to find out how to make this XML parsing monstrosity to handle this - on its own, so the code is modelled after <t> handling and does it manually in a hackish - way - it reads the value as text and converts itself, moreover the reading of the value - is done sooner than lcl_sprms() actually results in processing the tags it is enclosed - in, so the values are stored in PositionHandler for later use. -*/ -void OOXMLFastContextHandler::positionOffset(const OUString & sText) +void OOXMLFastContextHandler::positionOffset(const OUString& rText) { if (isForwardEvents()) - ::writerfilter::dmapper::PositionHandler::setPositionOffset( sText, inPositionV ); + mpStream->positionOffset(rText, inPositionV); } void OOXMLFastContextHandler::ignore() @@ -1632,7 +1622,7 @@ void OOXMLFastContextHandlerShape::sendShape( Token_t Element ) { if ( mrShapeContext.is() && !m_bShapeSent ) { - awt::Point aPosition(writerfilter::dmapper::PositionHandler::getPositionOffset(false), writerfilter::dmapper::PositionHandler::getPositionOffset(true)); + awt::Point aPosition = mpStream->getPositionOffset(); mrShapeContext->setPosition(aPosition); uno::Reference<drawing::XShape> xShape(mrShapeContext->getShape()); if (xShape.is()) diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 433bbf96b5e6..36ceed1c2f40 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -950,19 +950,27 @@ int RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing::XSh aAnchorSprms.set(NS_ooxml::LN_EG_WrapType_wrapSquare, pAnchorWrapValue); // See OOXMLFastContextHandler::positionOffset(), we can't just put offset values in an RTFValue. + RTFSprms aPoshAttributes; RTFSprms aPoshSprms; if (m_aStates.top().aShape.nHoriOrientRelationToken > 0) - aPoshSprms.set(NS_ooxml::LN_CT_PosH_relativeFrom, RTFValue::Pointer_t(new RTFValue(m_aStates.top().aShape.nHoriOrientRelationToken))); + aPoshAttributes.set(NS_ooxml::LN_CT_PosH_relativeFrom, RTFValue::Pointer_t(new RTFValue(m_aStates.top().aShape.nHoriOrientRelationToken))); if (m_aStates.top().aShape.nLeft != 0) - writerfilter::dmapper::PositionHandler::setPositionOffset(OUString::number(oox::drawingml::convertHmmToEmu(m_aStates.top().aShape.nLeft)), false); - aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionH, RTFValue::Pointer_t(new RTFValue(aPoshSprms))); + { + Mapper().positionOffset(OUString::number(oox::drawingml::convertHmmToEmu(m_aStates.top().aShape.nLeft)), /*bVertical=*/false); + aPoshSprms.set(NS_ooxml::LN_CT_PosH_posOffset, RTFValue::Pointer_t(new RTFValue())); + } + aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionH, RTFValue::Pointer_t(new RTFValue(aPoshAttributes, aPoshSprms))); + RTFSprms aPosvAttributes; RTFSprms aPosvSprms; if (m_aStates.top().aShape.nVertOrientRelationToken > 0) - aPosvSprms.set(NS_ooxml::LN_CT_PosV_relativeFrom, RTFValue::Pointer_t(new RTFValue(m_aStates.top().aShape.nVertOrientRelationToken))); + aPosvAttributes.set(NS_ooxml::LN_CT_PosV_relativeFrom, RTFValue::Pointer_t(new RTFValue(m_aStates.top().aShape.nVertOrientRelationToken))); if (m_aStates.top().aShape.nTop != 0) - writerfilter::dmapper::PositionHandler::setPositionOffset(OUString::number(oox::drawingml::convertHmmToEmu(m_aStates.top().aShape.nTop)), true); - aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionV, RTFValue::Pointer_t(new RTFValue(aPosvSprms))); + { + Mapper().positionOffset(OUString::number(oox::drawingml::convertHmmToEmu(m_aStates.top().aShape.nTop)), /*bVertical=*/true); + aPosvSprms.set(NS_ooxml::LN_CT_PosV_posOffset, RTFValue::Pointer_t(new RTFValue())); + } + aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionV, RTFValue::Pointer_t(new RTFValue(aPosvAttributes, aPosvSprms))); aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_docPr, pDocprValue); aAnchorSprms.set(NS_ooxml::LN_graphic_graphic, pGraphicValue); |