diff options
author | Patrick Jaap <patrick.jaap@tu-dresden.de> | 2019-02-14 10:08:58 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2019-04-05 15:33:48 +0200 |
commit | 2d6f8c36126effc66ea35af2e65da6609fcfe013 (patch) | |
tree | 6e200700f82194c9c112f598c4846b0dd0e7f8b8 /sw | |
parent | 22d79472b6f395a2b4de74dc360bf8e61b1028e3 (diff) |
FIX: DOCX export: use all updated attributes during table export
In a previous commit only x/y coordinate were considered.
For better overview make use of the OOXML converter for orients and relations.
Change-Id: I9792ccfbc2ebb58fd768c14278cdfd9b54efe62f
Reviewed-on: https://gerrit.libreoffice.org/69523
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/uiwriter/data2/floating-table-position.docx | bin | 0 -> 13236 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter2.cxx | 41 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 197 |
3 files changed, 164 insertions, 74 deletions
diff --git a/sw/qa/extras/uiwriter/data2/floating-table-position.docx b/sw/qa/extras/uiwriter/data2/floating-table-position.docx Binary files differnew file mode 100644 index 000000000000..de7a467aac1b --- /dev/null +++ b/sw/qa/extras/uiwriter/data2/floating-table-position.docx diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index 9655d1e9b80c..ddebd9a1a662 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -71,6 +71,7 @@ public: void testDropDownFormFieldInsertion(); void testMixedFormFieldInsertion(); void testTdf124261(); + void testDocxAttributeTableExport(); CPPUNIT_TEST_SUITE(SwUiWriterTest2); CPPUNIT_TEST(testRedlineMoveInsertInDelete); @@ -100,6 +101,7 @@ public: CPPUNIT_TEST(testDropDownFormFieldInsertion); CPPUNIT_TEST(testMixedFormFieldInsertion); CPPUNIT_TEST(testTdf124261); + CPPUNIT_TEST(testDocxAttributeTableExport); CPPUNIT_TEST_SUITE_END(); virtual std::unique_ptr<Resetter> preTest(const char* filename) override @@ -1158,6 +1160,45 @@ void SwUiWriterTest2::testTdf124261() #endif } +void SwUiWriterTest2::testDocxAttributeTableExport() +{ + createDoc("floating-table-position.docx"); + + // get the table frame, set new values and dismiss the references + { + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDrawPage(xDrawPageSupplier->getDrawPage(), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + + // change the properties + // 8133 -> 8000 + xShape->setPropertyValue("VertOrientPosition", uno::makeAny(static_cast<sal_Int32>(8000))); + // 5964 -> 5000 + xShape->setPropertyValue("HoriOrientPosition", uno::makeAny(static_cast<sal_Int32>(5000))); + // 0 (frame) -> 8 (page print area) + xShape->setPropertyValue("VertOrientRelation", uno::makeAny(static_cast<sal_Int16>(8))); + // 8 (page print area) -> 0 (frame) + xShape->setPropertyValue("HoriOrientRelation", uno::makeAny(static_cast<sal_Int16>(0))); + } + // save it to docx + reload("Office Open XML Text", "floating-table-position.docx"); + + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDrawPage(xDrawPageSupplier->getDrawPage(), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + + // test the new values + sal_Int32 nValue = getProperty<sal_Int32>(xShape, "VertOrientPosition"); + CPPUNIT_ASSERT(sal_Int32(7999) <= nValue && nValue <= sal_Int32(8001)); + nValue = getProperty<sal_Int32>(xShape, "HoriOrientPosition"); + CPPUNIT_ASSERT(sal_Int32(4999) <= nValue && nValue <= sal_Int32(5001)); + + CPPUNIT_ASSERT_EQUAL(sal_Int16(8), getProperty<sal_Int16>(xShape, "VertOrientRelation")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(xShape, "HoriOrientRelation")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest2); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index c1a20445fc09..e4ce85632f08 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -500,8 +500,6 @@ static OString convertToOOXMLVertOrient(sal_Int16 nOrient) { switch( nOrient ) { - case text::VertOrientation::NONE: - return OString(); case text::VertOrientation::CENTER: case text::VertOrientation::LINE_CENTER: return OString( "center" ); @@ -512,8 +510,9 @@ static OString convertToOOXMLVertOrient(sal_Int16 nOrient) case text::VertOrientation::TOP: return OString( "top" ); case text::VertOrientation::LINE_TOP: - default: return OString( "inside" ); + default: + return OString(); } } @@ -521,17 +520,19 @@ static OString convertToOOXMLHoriOrient(sal_Int16 nOrient, bool bIsPosToggle) { switch( nOrient ) { - case text::HoriOrientation::NONE: - return OString(); case text::HoriOrientation::LEFT: return OString( bIsPosToggle ? "inside" : "left" ); + case text::HoriOrientation::INSIDE: + return OString( "inside" ); case text::HoriOrientation::RIGHT: return OString( bIsPosToggle ? "outside" : "right" ); + case text::HoriOrientation::OUTSIDE: + return OString( "outside" ); case text::HoriOrientation::CENTER: - // fall-through intended case text::HoriOrientation::FULL: - default: return OString( "center" ); + default: + return OString(); } } @@ -3845,84 +3846,132 @@ void DocxAttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t uno::Sequence<beans::PropertyValue> aTablePosition = rGrabBagElement.second.get<uno::Sequence<beans::PropertyValue> >(); // look for a surrounding frame and take it's position values const ww8::Frame* pFrame = m_rExport.GetFloatingTableFrame(); - for (sal_Int32 i = 0; i < aTablePosition.getLength(); ++i) + if( pFrame ) { - if (aTablePosition[i].Name == "vertAnchor" && !aTablePosition[i].Value.get<OUString>().isEmpty()) - { - 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" && !aTablePosition[i].Value.get<OUString>().isEmpty()) - { - 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" && !aTablePosition[i].Value.get<OUString>().isEmpty()) - { - 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" && !aTablePosition[i].Value.get<OUString>().isEmpty()) - { - 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") + // we export the values of the surrounding Frame + OString sOrientation; + sal_Int32 nValue; + + // If tblpXSpec or tblpYSpec are present, we do not write tblpX or tblpY! + OString sTblpXSpec = convertToOOXMLHoriOrient( pFrame->GetFrameFormat().GetHoriOrient().GetHoriOrient(), pFrame->GetFrameFormat().GetHoriOrient().IsPosToggle() ); + OString sTblpYSpec = convertToOOXMLVertOrient( pFrame->GetFrameFormat().GetVertOrient().GetVertOrient() ); + + sOrientation = convertToOOXMLVertOrientRel( pFrame->GetFrameFormat().GetVertOrient().GetRelationOrient() ); + if(sOrientation != "page") // do not write default + attrListTablePos->add( FSNS( XML_w, XML_vertAnchor ), sOrientation.getStr() ); + + if( !sTblpYSpec.isEmpty() ) + attrListTablePos->add( FSNS( XML_w, XML_tblpYSpec ), sTblpYSpec.getStr() ); + + sOrientation = convertToOOXMLHoriOrientRel( pFrame->GetFrameFormat().GetHoriOrient().GetRelationOrient() ); + if(sOrientation != "page") // do not wirte default + attrListTablePos->add( FSNS( XML_w, XML_horzAnchor ), sOrientation.getStr() ); + + if( !sTblpXSpec.isEmpty() ) + attrListTablePos->add( FSNS( XML_w, XML_tblpXSpec ), sTblpXSpec.getStr() ); + + nValue = pFrame->GetFrameFormat().GetULSpace().GetLower(); + if( nValue != 0 ) + attrListTablePos->add( FSNS( XML_w, XML_bottomFromText ), OString::number( nValue ) ); + + nValue = pFrame->GetFrameFormat().GetLRSpace().GetLeft(); + if( nValue != 0 ) + attrListTablePos->add( FSNS( XML_w, XML_leftFromText ), OString::number( nValue ) ); + + nValue = pFrame->GetFrameFormat().GetLRSpace().GetRight(); + if( nValue != 0 ) + attrListTablePos->add( FSNS( XML_w, XML_rightFromText ), OString::number( nValue ) ); + + nValue = pFrame->GetFrameFormat().GetULSpace().GetUpper(); + if( nValue != 0 ) + attrListTablePos->add( FSNS( XML_w, XML_topFromText ), OString::number( nValue ) ); + + if( sTblpXSpec.isEmpty() ) // do not write tblpX if tblpXSpec is present { - sal_Int32 nValue = 0; - if (pFrame) + nValue = pFrame->GetFrameFormat().GetHoriOrient().GetPos(); + // we need to revert the additional shift introduced by + // lcl_DecrementHoriOrientPosition() in writerfilter + // 1st: left distance of the table + const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox(); + const SwFrameFormat * pFrameFormat = pTabBox->GetFrameFormat(); + const SvxBoxItem& rBox = pFrameFormat->GetBox( ); + sal_uInt16 nLeftDistance = rBox.GetDistance(SvxBoxItemLine::LEFT); + nValue += nLeftDistance; + + // 2nd: if a left border is given, revert the shift by half the width + // from lcl_DecrementHoriOrientPosition() in writerfilter + if (const editeng::SvxBorderLine* pLeftBorder = rBox.GetLeft()) { - nValue = pFrame->GetFrameFormat().GetHoriOrient().GetPos(); - // we need to revert the additional shift introduced by - // lcl_DecrementHoriOrientPosition() in writerfilter - // 1st: left distance of the table - const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox(); - const SwFrameFormat * pFrameFormat = pTabBox->GetFrameFormat(); - const SvxBoxItem& rBox = pFrameFormat->GetBox( ); - sal_uInt16 nLeftDistance = rBox.GetDistance(SvxBoxItemLine::LEFT); - nValue += nLeftDistance; - - // 2nd: if a left border is given, revert the shift by half the width - // from lcl_DecrementHoriOrientPosition() in writerfilter - if (const editeng::SvxBorderLine* pLeftBorder = rBox.GetLeft()) - { - long nWidth = pLeftBorder->GetWidth(); - nValue += (nWidth / 2); - } + long nWidth = pLeftBorder->GetWidth(); + nValue += (nWidth / 2); } - else - nValue = aTablePosition[i].Value.get<sal_Int32>(); attrListTablePos->add( FSNS( XML_w, XML_tblpX ), OString::number( nValue ) ); } - else if (aTablePosition[i].Name == "tblpY") - { - sal_Int32 nValue = 0; - if (pFrame) - // no additional shift occur (like in the tblpX case) - nValue = pFrame->GetFrameFormat().GetVertOrient().GetPos(); - else - nValue = aTablePosition[i].Value.get<sal_Int32>(); + if( sTblpYSpec.isEmpty() ) // do not write tblpY if tblpYSpec is present + { + nValue = pFrame->GetFrameFormat().GetVertOrient().GetPos(); attrListTablePos->add( FSNS( XML_w, XML_tblpY ), OString::number( nValue ) ); } } + else // ( pFrame = 0 ) + { + // we export the values from the grabBag + for (sal_Int32 i = 0; i < aTablePosition.getLength(); ++i) + { + if (aTablePosition[i].Name == "vertAnchor" && !aTablePosition[i].Value.get<OUString>().isEmpty()) + { + OString sOrientation = OUStringToOString( aTablePosition[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8); + attrListTablePos->add( FSNS( XML_w, XML_vertAnchor ), sOrientation.getStr() ); + } + else if (aTablePosition[i].Name == "tblpYSpec" && !aTablePosition[i].Value.get<OUString>().isEmpty()) + { + OString sOrientation = OUStringToOString( aTablePosition[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8); + attrListTablePos->add( FSNS( XML_w, XML_tblpYSpec ), sOrientation.getStr() ); + } + else if (aTablePosition[i].Name == "horzAnchor" && !aTablePosition[i].Value.get<OUString>().isEmpty()) + { + OString sOrientation = OUStringToOString( aTablePosition[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8); + attrListTablePos->add( FSNS( XML_w, XML_horzAnchor ), sOrientation.getStr() ); + } + else if (aTablePosition[i].Name == "tblpXSpec" && !aTablePosition[i].Value.get<OUString>().isEmpty()) + { + OString sOrientation = OUStringToOString( aTablePosition[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8); + attrListTablePos->add( FSNS( XML_w, XML_tblpXSpec ), sOrientation.getStr() ); + } + else if (aTablePosition[i].Name == "bottomFromText") + { + sal_Int32 nValue = aTablePosition[i].Value.get<sal_Int32>(); + attrListTablePos->add( FSNS( XML_w, XML_bottomFromText ), OString::number( nValue ) ); + } + else if (aTablePosition[i].Name == "leftFromText") + { + sal_Int32 nValue = aTablePosition[i].Value.get<sal_Int32>(); + attrListTablePos->add( FSNS( XML_w, XML_leftFromText ), OString::number( nValue ) ); + } + else if (aTablePosition[i].Name == "rightFromText") + { + sal_Int32 nValue = aTablePosition[i].Value.get<sal_Int32>(); + attrListTablePos->add( FSNS( XML_w, XML_rightFromText ), OString::number( nValue ) ); + } + else if (aTablePosition[i].Name == "topFromText") + { + sal_Int32 nValue = aTablePosition[i].Value.get<sal_Int32>(); + attrListTablePos->add( FSNS( XML_w, XML_topFromText ), OString::number( nValue ) ); + } + else if (aTablePosition[i].Name == "tblpX") + { + sal_Int32 nValue = aTablePosition[i].Value.get<sal_Int32>(); + attrListTablePos->add( FSNS( XML_w, XML_tblpX ), OString::number( nValue ) ); + } + else if (aTablePosition[i].Name == "tblpY") + { + sal_Int32 nValue = aTablePosition[i].Value.get<sal_Int32>(); + attrListTablePos->add( FSNS( XML_w, XML_tblpY ), OString::number( nValue ) ); + } + } + } XFastAttributeListRef xAttrListTablePosRef( attrListTablePos ); |