summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-06-16 00:14:51 +0200
committerMiklos Vajna <vmiklos@suse.cz>2013-06-16 00:37:18 +0200
commit4ab658b56f5c6ff0082d38d8ace1924d11e30e96 (patch)
treec867eabd45322a7985cf7c04777464821eaf4caf /writerfilter
parent2fc088afdf6dcb2defbd462a9e64ba7e53ba5caf (diff)
RTF import: implement support for tables inside text frames
Change-Id: I6088adad20212cdbcc03b193cc079c51a305602a
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx39
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx3
-rw-r--r--writerfilter/source/rtftok/rtfsdrimport.cxx20
-rw-r--r--writerfilter/source/rtftok/rtfsdrimport.hxx5
4 files changed, 54 insertions, 13 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 36067006e9d5..e1bba0436079 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -1450,10 +1450,11 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
case RTF_SHPTXT:
case RTF_DPTXBXTEXT:
m_aStates.top().nDestinationState = DESTINATION_SHAPETEXT;
+ checkFirstRun();
dispatchFlag(RTF_PARD);
m_bNeedPap = true;
- OSL_ENSURE(!m_aShapetextBuffer.size(), "shapetext buffer is not empty");
- m_aStates.top().pCurrentBuffer = &m_aShapetextBuffer;
+ if (nKeyword == RTF_SHPTXT)
+ m_pSdrImport->resolve(m_aStates.top().aShape, false);
break;
case RTF_FORMFIELD:
if (m_aStates.top().nDestinationState == DESTINATION_FIELDINSTRUCTION)
@@ -2236,7 +2237,7 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword)
// Reset everything.
m_aStates.top().aParagraphSprms = m_aDefaultState.aParagraphSprms;
m_aStates.top().aParagraphAttributes = m_aDefaultState.aParagraphAttributes;
- if (m_aStates.top().nDestinationState != DESTINATION_SHAPETEXT)
+ if (m_aStates.top().pCurrentBuffer != &m_aShapetextBuffer)
m_aStates.top().pCurrentBuffer = 0;
}
else
@@ -2557,6 +2558,9 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword)
std::vector<beans::PropertyValue> aDefaults = m_pSdrImport->getTextFrameDefaults(false);
for (size_t i = 0; i < aDefaults.size(); ++i)
m_aStates.top().aDrawingObject.aPendingProperties.push_back(aDefaults[i]);
+ checkFirstRun();
+ Mapper().startShape(m_aStates.top().aDrawingObject.xShape);
+ m_aStates.top().aDrawingObject.bHadShapeText = true;
}
break;
default:
@@ -3872,12 +3876,16 @@ int RTFDocumentImpl::popState()
break;
case DESTINATION_SHAPEPROPERTYVALUE:
if (aState.aShape.aProperties.size())
+ {
aState.aShape.aProperties.back().second = m_aStates.top().aDestinationText.makeStringAndClear();
+ if (m_aStates.top().bHadShapeText)
+ m_pSdrImport->append(aState.aShape.aProperties.back().first, aState.aShape.aProperties.back().second);
+ }
break;
case DESTINATION_PICPROP:
case DESTINATION_SHAPEINSTRUCTION:
- if (!m_bObject && !aState.bInListpicture)
- m_pSdrImport->resolve(m_aStates.top().aShape);
+ if (!m_bObject && !aState.bInListpicture && !m_aStates.top().bHadShapeText)
+ m_pSdrImport->resolve(m_aStates.top().aShape, true);
break;
case DESTINATION_BOOKMARKSTART:
{
@@ -4136,8 +4144,11 @@ int RTFDocumentImpl::popState()
m_pSdrImport->resolveFLine(xPropertySet, rDrawing.nFLine);
- Mapper().startShape(xShape);
- replayShapetext();
+ if (!m_aStates.top().aDrawingObject.bHadShapeText)
+ {
+ Mapper().startShape(xShape);
+ replayShapetext();
+ }
Mapper().endShape();
}
break;
@@ -4581,6 +4592,14 @@ int RTFDocumentImpl::popState()
m_xDocumentProperties->setTitle(aState.aDestinationText.makeStringAndClear());
}
break;
+ case DESTINATION_SHAPETEXT:
+ // If we're leaving the shapetext group (it may have nested ones) and this is a shape, not an old drawingobject.
+ if (m_aStates.top().nDestinationState != DESTINATION_SHAPETEXT && !m_aStates.top().aDrawingObject.bHadShapeText)
+ {
+ m_aStates.top().bHadShapeText = true;
+ m_pSdrImport->close();
+ }
+ break;
default:
{
if (m_aStates.size() && m_aStates.top().nDestinationState == DESTINATION_PICT)
@@ -4713,7 +4732,8 @@ RTFParserState::RTFParserState(RTFDocumentImpl *pDocumentImpl)
pCurrentBuffer(0),
bHasTableStyle(false),
bInListpicture(false),
- bInBackground(false)
+ bInBackground(false),
+ bHadShapeText(false)
{
}
@@ -4767,7 +4787,8 @@ RTFDrawingObject::RTFDrawingObject()
bHasFillColor(false),
nDhgt(0),
nFLine(-1),
- nPolyLineCount(0)
+ nPolyLineCount(0),
+ bHadShapeText(false)
{
}
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index 0ba51b6bfadf..e59fac2e5fb2 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -265,6 +265,7 @@ namespace writerfilter {
sal_Int32 nFLine;
sal_Int32 nPolyLineCount;
uno::Sequence<awt::Point> aPolyLinePoints;
+ bool bHadShapeText;
};
/// Stores the properties of a picture.
@@ -403,6 +404,8 @@ namespace writerfilter {
/// If we're inside a \background group.
bool bInBackground;
+
+ bool bHadShapeText;
};
class RTFTokenizer;
diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx
index 9e0efd8fb244..d0178ff7b785 100644
--- a/writerfilter/source/rtftok/rtfsdrimport.cxx
+++ b/writerfilter/source/rtftok/rtfsdrimport.cxx
@@ -166,7 +166,7 @@ void RTFSdrImport::applyProperty(uno::Reference<drawing::XShape> xShape, OUStrin
xPropertySet->setPropertyValue("VertOrient", uno::makeAny(nVertOrient));
}
-void RTFSdrImport::resolve(RTFShape& rShape)
+void RTFSdrImport::resolve(RTFShape& rShape, bool bClose)
{
int nType = -1;
bool bPib = false;
@@ -204,7 +204,7 @@ void RTFSdrImport::resolve(RTFShape& rShape)
break;
case ESCHER_ShpInst_Rectangle:
case ESCHER_ShpInst_TextBox:
- if (!m_rImport.getShapetextBuffer().empty())
+ if (!bClose)
{
createShape("com.sun.star.text.TextFrame", xShape, xPropertySet);
bTextFrame = true;
@@ -594,10 +594,24 @@ void RTFSdrImport::resolve(RTFShape& rShape)
// Send it to dmapper
m_rImport.Mapper().startShape(xShape);
- m_rImport.replayShapetext();
+ if (bClose)
+ {
+ m_rImport.replayShapetext();
+ m_rImport.Mapper().endShape();
+ }
+ m_xShape = xShape;
+}
+
+void RTFSdrImport::close()
+{
m_rImport.Mapper().endShape();
}
+void RTFSdrImport::append(OUString aKey, OUString aValue)
+{
+ applyProperty(m_xShape, aKey, aValue);
+}
+
} // namespace rtftok
} // namespace writerfilter
diff --git a/writerfilter/source/rtftok/rtfsdrimport.hxx b/writerfilter/source/rtftok/rtfsdrimport.hxx
index e9a93cb20e77..ab3c44c3e8e1 100644
--- a/writerfilter/source/rtftok/rtfsdrimport.hxx
+++ b/writerfilter/source/rtftok/rtfsdrimport.hxx
@@ -21,7 +21,9 @@ namespace writerfilter {
RTFSdrImport(RTFDocumentImpl& rImport, uno::Reference<lang::XComponent> const& xDstDoc);
virtual ~RTFSdrImport();
- void resolve(RTFShape& rShape);
+ void resolve(RTFShape& rShape, bool bClose);
+ void close();
+ void append(OUString aKey, OUString aValue);
void resolveDhgt(uno::Reference<beans::XPropertySet> xPropertySet, sal_Int32 nZOrder);
void resolveFLine(uno::Reference<beans::XPropertySet> xPropertySet, sal_Int32 nFLine);
/**
@@ -36,6 +38,7 @@ namespace writerfilter {
RTFDocumentImpl& m_rImport;
uno::Reference<drawing::XDrawPage> m_xDrawPage;
+ uno::Reference<drawing::XShape> m_xShape;
};
} // namespace rtftok
} // namespace writerfilter