summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-12-21 11:12:40 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-12-21 19:13:47 +0100
commit44ea0b3a2550a79148fb86f3e7175fffe77674b4 (patch)
tree5c0207c67758e888f6a4ce8a49c62f1285600da8 /writerfilter
parent8870e068cc7368ffa14a6938836b370d2a188b64 (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.hxx8
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx17
-rw-r--r--writerfilter/source/dmapper/DomainMapper.hxx2
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx2
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx2
-rw-r--r--writerfilter/source/dmapper/GraphicHelpers.cxx40
-rw-r--r--writerfilter/source/dmapper/GraphicHelpers.hxx7
-rw-r--r--writerfilter/source/dmapper/GraphicImport.cxx11
-rw-r--r--writerfilter/source/dmapper/GraphicImport.hxx1
-rw-r--r--writerfilter/source/dmapper/LoggedResources.cxx15
-rw-r--r--writerfilter/source/dmapper/LoggedResources.hxx3
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.cxx16
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx20
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);