fdo#76583 DOCX import: Floating table information is not preserved in RT file.

- Earlier the table width was compared with the text area to decide if the
  fly has to be created for the floating table.
- In most of the cases such floating tables were the ones which did not have
  any text around them and not importing such tables as fly made sense.
- But there are some scenarios where in the floating tables have width
  greater than the text area but are positioned in a way such that they begin
  before left margin and end before the right margin moreover they appear to be
  really floating (unlike in first scenario) as they have text around them since
  there is still room for the text.
- Handled this scenario and added a UT.

Reviewed on:
	https://gerrit.libreoffice.org/8840

Change-Id: I7ea25e04ed7c6315e4e4fe4b67badf451c30cd0c
This commit is contained in:
umeshkadam
2014-04-02 19:50:36 +05:30
committed by Miklos Vajna
parent a8b45a44c2
commit 48dd437039
5 changed files with 30 additions and 4 deletions

Binary file not shown.

View File

@@ -1498,12 +1498,26 @@ DECLARE_OOXMLIMPORT_TEST(testChartProp, "chart-prop.docx")
CPPUNIT_ASSERT_EQUAL(sal_Int32(8890), getProperty<sal_Int32>(xPropertySet, "Height"));
}
void lcl_countTextFrames(com::sun::star::uno::Reference< lang::XComponent >& xComponent,
sal_Int32 nExpected )
{
uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(xComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL( nExpected, xIndexAccess->getCount());
}
DECLARE_OOXMLIMPORT_TEST(testBnc779620, "bnc779620.docx")
{
// The problem was that the floating table was imported as a non-floating one.
uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount());
lcl_countTextFrames( mxComponent, 1 );
}
DECLARE_OOXMLIMPORT_TEST(testfdo76583, "fdo76583.docx")
{
// The problem was that the floating table was imported as a non-floating one.
// floating tables are imported as text frames, therefore the document should
// exactly 1 text frame.
lcl_countTextFrames( mxComponent, 1 );
}
DECLARE_OOXMLIMPORT_TEST(testFdo43093, "fdo43093.docx")

View File

@@ -130,6 +130,14 @@ struct FieldConversion
typedef ::std::map< OUString, FieldConversion>
FieldConversionMap_t;
uno::Any FloatingTableInfo::getPropertyValue(OUString propertyName){
beans::PropertyValue* pFrameProperties = m_aFrameProperties.getArray();
for( int i = 0 ; i < m_aFrameProperties.getLength(); i++ )
if( pFrameProperties[i].Name == propertyName )
return pFrameProperties[i].Value ;
return uno::Any() ;
}
DomainMapper_Impl::DomainMapper_Impl(
DomainMapper& rDMapper,

View File

@@ -286,6 +286,7 @@ struct FloatingTableInfo
m_nTableWidth(nTableWidth)
{
}
uno::Any getPropertyValue(OUString propertyName);
};
class DomainMapper;

View File

@@ -917,7 +917,10 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
// If the table is wider than the text area, then don't create a fly
// for the table: no wrapping will be performed anyway, but multi-page
// tables will be broken.
if (rInfo.m_nTableWidth < nTextAreaWidth)
// If the position is relative to the edge of the page, then we always
// create the fly.
if ( ( rInfo.getPropertyValue("HoriOrientRelation") == text::RelOrientation::PAGE_FRAME ) ||
( rInfo.m_nTableWidth < nTextAreaWidth ) )
xBodyText->convertToTextFrame(rInfo.m_xStart, rInfo.m_xEnd, rInfo.m_aFrameProperties);
}
rPendingFloatingTables.clear();