summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/qa/extras/ooxmlexport/data/fdo77887.docxbin0 -> 39281 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport.cxx17
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx57
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableHandler.cxx65
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.cxx8
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.hxx1
-rw-r--r--writerfilter/source/dmapper/TablePositionHandler.hxx42
7 files changed, 179 insertions, 11 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/fdo77887.docx b/sw/qa/extras/ooxmlexport/data/fdo77887.docx
new file mode 100644
index 000000000000..cb3f4537dd86
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/fdo77887.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index 44b9aa730046..55b08e703b06 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -3174,6 +3174,23 @@ DECLARE_OOXMLEXPORT_TEST(testFDO77117, "fdo77117.docx")
CPPUNIT_ASSERT_EQUAL(11.f, getProperty<float>(xShape, "CharHeight"));
}
+DECLARE_OOXMLEXPORT_TEST(testFloatingTable, "fdo77887.docx")
+{
+ xmlDocPtr pXmlDoc = parseExport("word/document.xml");
+
+ if (!pXmlDoc)
+ return;
+
+ assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:tbl[1]/w:tblPr[1]/w:tblpPr[1]", "horzAnchor", "margin");
+ assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:tbl[1]/w:tblPr[1]/w:tblpPr[1]", "leftFromText", "141");
+ assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:tbl[1]/w:tblPr[1]/w:tblpPr[1]", "rightFromText", "141");
+ assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:tbl[1]/w:tblPr[1]/w:tblpPr[1]", "tblpXSpec", "center");
+ assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:tbl[1]/w:tblPr[1]/w:tblpPr[1]", "tblpY", "2266");
+ assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:tbl[1]/w:tblPr[1]/w:tblpPr[1]", "vertAnchor", "page");
+
+}
+
+
DECLARE_OOXMLEXPORT_TEST(testFDO75431, "fdo75431.docx")
{
xmlDocPtr pXmlDoc = parseExport("word/document.xml");
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 7fd9a37eba7d..66b1b260441a 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -2728,6 +2728,63 @@ void DocxAttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t
m_aTableStyleConf[ BOX_LINE_LEFT ] = aGrabBagElement->second.get<table::BorderLine2>();
else if( aGrabBagElement->first == "TableStyleRightBorder" )
m_aTableStyleConf[ BOX_LINE_RIGHT ] = aGrabBagElement->second.get<table::BorderLine2>();
+ else if (aGrabBagElement->first == "TablePosition" )
+ {
+ FastAttributeList *attrListTablePos = m_pSerializer->createAttrList( );
+ uno::Sequence<beans::PropertyValue> aTablePosition = aGrabBagElement->second.get<uno::Sequence<beans::PropertyValue> >();
+ for (sal_Int32 i = 0; i < aTablePosition.getLength(); ++i)
+ {
+ if (aTablePosition[i].Name == "vertAnchor")
+ {
+ OString strTemp = OUStringToOString(aTablePosition[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8);
+ attrListTablePos->add( FSNS( XML_w, XML_vertAnchor ), strTemp.getStr() );
+ }
+ else if (aTablePosition[i].Name == "tblpYSpec")
+ {
+ OString strTemp = OUStringToOString(aTablePosition[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8);
+ attrListTablePos->add( FSNS( XML_w, XML_tblpYSpec ), strTemp.getStr() );
+ }
+ else if (aTablePosition[i].Name == "horzAnchor")
+ {
+ OString strTemp = OUStringToOString(aTablePosition[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8);
+ attrListTablePos->add( FSNS( XML_w, XML_horzAnchor ), strTemp.getStr() );
+ }
+ else if (aTablePosition[i].Name == "tblpXSpec")
+ {
+ OString strTemp = OUStringToOString(aTablePosition[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8);
+ attrListTablePos->add( FSNS( XML_w, XML_tblpXSpec ), strTemp.getStr() );
+ }
+ else if (aTablePosition[i].Name == "bottomFromText")
+ {
+ attrListTablePos->add( FSNS( XML_w, XML_bottomFromText ), OString::number( aTablePosition[i].Value.get<sal_Int32>() ) );
+ }
+ else if (aTablePosition[i].Name == "leftFromText")
+ {
+ attrListTablePos->add( FSNS( XML_w, XML_leftFromText ), OString::number( aTablePosition[i].Value.get<sal_Int32>() ) );
+ }
+ else if (aTablePosition[i].Name == "rightFromText")
+ {
+ attrListTablePos->add( FSNS( XML_w, XML_rightFromText ), OString::number( aTablePosition[i].Value.get<sal_Int32>() ) );
+ }
+ else if (aTablePosition[i].Name == "topFromText")
+ {
+ attrListTablePos->add( FSNS( XML_w, XML_topFromText ), OString::number( aTablePosition[i].Value.get<sal_Int32>() ) );
+ }
+ else if (aTablePosition[i].Name == "tblpX")
+ {
+ attrListTablePos->add( FSNS( XML_w, XML_tblpX ), OString::number( aTablePosition[i].Value.get<sal_Int32>() ) );
+ }
+ else if (aTablePosition[i].Name == "tblpY")
+ {
+ attrListTablePos->add( FSNS( XML_w, XML_tblpY ), OString::number( aTablePosition[i].Value.get<sal_Int32>() ) );
+ }
+ }
+
+ XFastAttributeListRef xAttrListTablePosRef( attrListTablePos );
+
+ m_pSerializer->singleElementNS( XML_w, XML_tblpPr, xAttrListTablePosRef);
+ attrListTablePos = NULL;
+ }
}
// Output the table alignement
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index a167dd15a7cc..49ea9ac62dc9 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -29,6 +29,7 @@
#include <com/sun/star/text/RelOrientation.hpp>
#include <com/sun/star/text/SizeType.hpp>
#include <dmapperLoggers.hxx>
+#include <TablePositionHandler.hxx>
#ifdef DEBUG_DMAPPER_TABLE_HANDLER
#include <PropertyMapHelper.hxx>
@@ -354,8 +355,50 @@ TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo
PropertyMap::iterator aTableStyleIter =
m_aTableProperties->find(META_PROP_TABLE_STYLE_NAME);
- uno::Sequence< beans::PropertyValue > aGrabBag( 5 );
+ uno::Sequence< beans::PropertyValue > aGrabBag( 6 );
sal_Int32 nGrabBagSize = 0;
+
+ if (0 != m_rDMapper_Impl.getTableManager().getCurrentTableRealPosition())
+ {
+ TablePositionHandler *pTablePositions = m_rDMapper_Impl.getTableManager().getCurrentTableRealPosition();
+
+ uno::Sequence< beans::PropertyValue > aGrabBagTS( 10 );
+
+ aGrabBagTS[0].Name = "bottomFromText";
+ aGrabBagTS[0].Value = uno::makeAny(pTablePositions->getBottomFromText() );
+
+ aGrabBagTS[1].Name = "horzAnchor";
+ aGrabBagTS[1].Value = uno::makeAny( pTablePositions->getHorzAnchor() );
+
+ aGrabBagTS[2].Name = "leftFromText";
+ aGrabBagTS[2].Value = uno::makeAny( pTablePositions->getLeftFromText() );
+
+ aGrabBagTS[3].Name = "rightFromText";
+ aGrabBagTS[3].Value = uno::makeAny( pTablePositions->getRightFromText() );
+
+ aGrabBagTS[4].Name = "tblpX";
+ aGrabBagTS[4].Value = uno::makeAny( pTablePositions->getX() );
+
+ aGrabBagTS[5].Name = "tblpXSpec";
+ aGrabBagTS[5].Value = uno::makeAny( pTablePositions->getXSpec() );
+
+ aGrabBagTS[6].Name = "tblpY";
+ aGrabBagTS[6].Value = uno::makeAny( pTablePositions->getY() );
+
+ aGrabBagTS[7].Name = "tblpYSpec";
+ aGrabBagTS[7].Value = uno::makeAny( pTablePositions->getYSpec() );
+
+ aGrabBagTS[8].Name = "topFromText";
+ aGrabBagTS[8].Value = uno::makeAny( pTablePositions->getTopFromText() );
+
+ aGrabBagTS[9].Name = "vertAnchor";
+ aGrabBagTS[9].Value = uno::makeAny( pTablePositions->getVertAnchor() );
+
+ aGrabBag[nGrabBagSize].Name = "TablePosition";
+ aGrabBag[nGrabBagSize].Value = uno::makeAny( aGrabBagTS );
+ nGrabBagSize++;
+ }
+
if(aTableStyleIter != m_aTableProperties->end())
{
// Apply table style properties recursively
@@ -366,8 +409,8 @@ TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo
pTableStyle = dynamic_cast<TableStyleSheetEntry*>( pStyleSheet.get( ) );
m_aTableProperties->erase( aTableStyleIter );
- aGrabBag[0].Name = "TableStyleName";
- aGrabBag[0].Value = uno::makeAny( sTableStyleName );
+ aGrabBag[nGrabBagSize].Name = "TableStyleName";
+ aGrabBag[nGrabBagSize].Value = uno::makeAny( sTableStyleName );
nGrabBagSize++;
if( pStyleSheet )
@@ -384,26 +427,26 @@ TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo
TableInfo rStyleInfo;
if (lcl_extractTableBorderProperty(pMergedProperties, PROP_TOP_BORDER, rStyleInfo, aBorderLine))
{
- aGrabBag[1].Name = "TableStyleTopBorder";
- aGrabBag[1].Value = uno::makeAny( aBorderLine );
+ aGrabBag[nGrabBagSize].Name = "TableStyleTopBorder";
+ aGrabBag[nGrabBagSize].Value = uno::makeAny( aBorderLine );
nGrabBagSize++;
}
if (lcl_extractTableBorderProperty(pMergedProperties, PROP_BOTTOM_BORDER, rStyleInfo, aBorderLine))
{
- aGrabBag[2].Name = "TableStyleBottomBorder";
- aGrabBag[2].Value = uno::makeAny( aBorderLine );
+ aGrabBag[nGrabBagSize].Name = "TableStyleBottomBorder";
+ aGrabBag[nGrabBagSize].Value = uno::makeAny( aBorderLine );
nGrabBagSize++;
}
if (lcl_extractTableBorderProperty(pMergedProperties, PROP_LEFT_BORDER, rStyleInfo, aBorderLine))
{
- aGrabBag[3].Name = "TableStyleLeftBorder";
- aGrabBag[3].Value = uno::makeAny( aBorderLine );
+ aGrabBag[nGrabBagSize].Name = "TableStyleLeftBorder";
+ aGrabBag[nGrabBagSize].Value = uno::makeAny( aBorderLine );
nGrabBagSize++;
}
if (lcl_extractTableBorderProperty(pMergedProperties, PROP_RIGHT_BORDER, rStyleInfo, aBorderLine))
{
- aGrabBag[4].Name = "TableStyleRightBorder";
- aGrabBag[4].Value = uno::makeAny( aBorderLine );
+ aGrabBag[nGrabBagSize].Name = "TableStyleRightBorder";
+ aGrabBag[nGrabBagSize].Value = uno::makeAny( aBorderLine );
nGrabBagSize++;
}
diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx
index 126cec097c16..3bf3ce3eca34 100644
--- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx
@@ -457,6 +457,14 @@ const uno::Sequence<beans::PropertyValue> DomainMapperTableManager::getCurrentTa
return uno::Sequence< beans::PropertyValue >( 0 );
}
+TablePositionHandler* DomainMapperTableManager::getCurrentTableRealPosition()
+{
+ if ( !m_aTablePositions.empty( ) && m_aTablePositions.back() )
+ return (m_aTablePositions.back( )).get();
+ else
+ return 0;
+}
+
void DomainMapperTableManager::startLevel( )
{
DomainMapperTableManager_Base_t::startLevel( );
diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx
index b229b4de0ff1..29896ae85454 100644
--- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx
+++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx
@@ -94,6 +94,7 @@ public:
const OUString& getTableStyleName() const { return m_sTableStyleName; }
const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> getCurrentTablePosition();
+ TablePositionHandler* getCurrentTableRealPosition();
virtual void cellProps(TablePropertyMapPtr pProps) SAL_OVERRIDE
{
diff --git a/writerfilter/source/dmapper/TablePositionHandler.hxx b/writerfilter/source/dmapper/TablePositionHandler.hxx
index 592b13485c51..6fd28b47f816 100644
--- a/writerfilter/source/dmapper/TablePositionHandler.hxx
+++ b/writerfilter/source/dmapper/TablePositionHandler.hxx
@@ -38,6 +38,48 @@ class TablePositionHandler
virtual void lcl_sprm(Sprm& sprm) SAL_OVERRIDE;
public:
+ int getY()
+ {
+ return m_nY;
+ }
+ int getX()
+ {
+ return m_nX;
+ }
+ int getLeftFromText()
+ {
+ return m_nLeftFromText;
+ }
+ int getRightFromText()
+ {
+ return m_nRightFromText;
+ }
+ int getTopFromText()
+ {
+ return m_nTopFromText;
+ }
+ int getBottomFromText()
+ {
+ return m_nBottomFromText;
+ }
+
+ OUString getVertAnchor()
+ {
+ return m_aVertAnchor;
+ }
+ OUString getYSpec()
+ {
+ return m_aYSpec;
+ }
+ OUString getHorzAnchor()
+ {
+ return m_aHorzAnchor;
+ }
+ OUString getXSpec()
+ {
+ return m_aXSpec;
+ }
+
TablePositionHandler();
virtual ~TablePositionHandler();