oox/source/vml/vmltextboxcontext.cxx | 17 +++++++++--- sw/qa/extras/ooxmlexport/data/fdo66929.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 16 +++++++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 37 ++++++++++++++++++++++----- 4 files changed, 60 insertions(+), 10 deletions(-)
New commits: commit db610b4a9202a9bb6393b1bcfc7dd56d21bd8112 Author: Miklos Vajna <vmik...@suse.cz> Date: Tue Jul 16 09:43:56 2013 +0200 DocxAttributeOutput: avoid 'a' prefix for double Change-Id: I1601f2d2926ca62aae8e7c48b1b2147ebed01002 diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 768235e..0169cf8 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4966,33 +4966,33 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& rBox ) } // v:textbox's inset attribute: inner margin values for textbox text - write only non-default values - double aDistanceLeftTwips = double(rBox.GetDistance(BOX_LINE_LEFT)); - double aDistanceTopTwips = double(rBox.GetDistance(BOX_LINE_TOP)); - double aDistanceRightTwips = double(rBox.GetDistance(BOX_LINE_RIGHT)); - double aDistanceBottomTwips = double(rBox.GetDistance(BOX_LINE_BOTTOM)); + double fDistanceLeftTwips = double(rBox.GetDistance(BOX_LINE_LEFT)); + double fDistanceTopTwips = double(rBox.GetDistance(BOX_LINE_TOP)); + double fDistanceRightTwips = double(rBox.GetDistance(BOX_LINE_RIGHT)); + double fDistanceBottomTwips = double(rBox.GetDistance(BOX_LINE_BOTTOM)); // Convert 'TWIPS' to 'INCH' (because in Word the default values are in Inches) - double aDistanceLeftInch = aDistanceLeftTwips / 1440; - double aDistanceTopInch = aDistanceTopTwips / 1440; - double aDistanceRightInch = aDistanceRightTwips / 1440; - double aDistanceBottomInch = aDistanceBottomTwips / 1440; + double fDistanceLeftInch = fDistanceLeftTwips / 1440; + double fDistanceTopInch = fDistanceTopTwips / 1440; + double fDistanceRightInch = fDistanceRightTwips / 1440; + double fDistanceBottomInch = fDistanceBottomTwips / 1440; // This code will write ONLY the non-default values. The values are in 'left','top','right','bottom' order. // so 'bottom' is checked if it is default and if it is non-default - all the values will be written // otherwise - 'right' is checked if it is default and if it is non-default - all the values except for 'bottom' will be written // and so on. OStringBuffer aInset; - if(!aInset.isEmpty() || aDistanceBottomInch != double(0.05)) - aInset.insert(0, "," + OString::number(aDistanceBottomInch) + "in"); + if(!aInset.isEmpty() || fDistanceBottomInch != double(0.05)) + aInset.insert(0, "," + OString::number(fDistanceBottomInch) + "in"); - if(!aInset.isEmpty() || aDistanceRightInch != double(0.1)) - aInset.insert(0, "," + OString::number(aDistanceRightInch) + "in"); + if(!aInset.isEmpty() || fDistanceRightInch != double(0.1)) + aInset.insert(0, "," + OString::number(fDistanceRightInch) + "in"); - if(!aInset.isEmpty() || aDistanceTopInch != double(0.05)) - aInset.insert(0, "," + OString::number(aDistanceTopInch) + "in"); + if(!aInset.isEmpty() || fDistanceTopInch != double(0.05)) + aInset.insert(0, "," + OString::number(fDistanceTopInch) + "in"); - if(!aInset.isEmpty() || aDistanceLeftInch != double(0.1)) - aInset.insert(0, OString::number(aDistanceLeftInch) + "in"); + if(!aInset.isEmpty() || fDistanceLeftInch != double(0.1)) + aInset.insert(0, OString::number(fDistanceLeftInch) + "in"); if (!aInset.isEmpty()) m_pTextboxAttrList->add(XML_inset, aInset.makeStringAndClear()); commit 1a37ca65b896a5ba100d46c7cde0793f62bc546b Author: Adam Co <rattles2...@gmail.com> Date: Mon Jul 15 18:40:08 2013 +0300 fdo#66929: fix for default textbox inset values Conflicts: sw/qa/extras/ooxmlexport/ooxmlexport.cxx Change-Id: I0e9fa5e73e802f85f02c3fcc5c276ed0c1cb2a58 diff --git a/oox/source/vml/vmltextboxcontext.cxx b/oox/source/vml/vmltextboxcontext.cxx index d91c66a..fbb701f 100644 --- a/oox/source/vml/vmltextboxcontext.cxx +++ b/oox/source/vml/vmltextboxcontext.cxx @@ -171,18 +171,27 @@ TextBoxContext::TextBoxContext( ContextHandler2Helper& rParent, TextBox& rTextBo { OUString inset = rAttribs.getString( XML_inset ).get(); OUString value; - ConversionHelper::separatePair( value, inset, inset, ',' ); + OUString remainingStr; + + ConversionHelper::separatePair( value, remainingStr, inset, ',' ); rTextBox.borderDistanceLeft = ConversionHelper::decodeMeasureToHmm( graphicHelper, value.isEmpty() ? "0.1in" : value, 0, false, false ); - ConversionHelper::separatePair( value, inset, inset, ',' ); + + inset = remainingStr; + ConversionHelper::separatePair( value, remainingStr, inset, ',' ); rTextBox.borderDistanceTop = ConversionHelper::decodeMeasureToHmm( graphicHelper, value.isEmpty() ? "0.05in" : value, 0, false, false ); - ConversionHelper::separatePair( value, inset, inset, ',' ); + + inset = remainingStr; + ConversionHelper::separatePair( value, remainingStr, inset, ',' ); rTextBox.borderDistanceRight = ConversionHelper::decodeMeasureToHmm( graphicHelper, value.isEmpty() ? "0.1in" : value, 0, false, false ); - ConversionHelper::separatePair( value, inset, inset, ',' ); + + inset = remainingStr; + ConversionHelper::separatePair( value, remainingStr, inset, ',' ); rTextBox.borderDistanceBottom = ConversionHelper::decodeMeasureToHmm( graphicHelper, value.isEmpty() ? "0.05in" : value, 0, false, false ); + rTextBox.borderDistanceSet = true; } diff --git a/sw/qa/extras/ooxmlexport/data/fdo66929.docx b/sw/qa/extras/ooxmlexport/data/fdo66929.docx new file mode 100644 index 0000000..7f0afac Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo66929.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index ff5dc8f..86d6e39 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -95,6 +95,7 @@ public: void testFdo66773(); void testFdo58577(); void testBnc581614(); + void testFdo66929(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -160,6 +161,7 @@ void Test::run() {"fdo66773.docx", &Test::testFdo66773}, {"fdo58577.odt", &Test::testFdo58577}, {"bnc581614.doc", &Test::testBnc581614}, + {"fdo66929.docx", &Test::testFdo66929}, }; // Don't test the first import of these, for some reason those tests fail const char* aBlacklist[] = { @@ -953,6 +955,20 @@ void Test::testBnc581614() CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty<drawing::FillStyle>(xFrame, "FillStyle")); } +void Test::testFdo66929() +{ + // The problem was that the default 'inset' attribute of the 'textbox' node was exported incorrectly. + // A node like '<v:textbox inset="0">' was exported back as '<v:textbox inset="0pt,0pt,0pt,0pt">' + // This is wrong because the original node denotes a specific 'left' inset, and a default 'top','right','bottom' inset + uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 0 ) , getProperty< sal_Int32 >( xFrame, "LeftBorderDistance" ) ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 127 ), getProperty< sal_Int32 >( xFrame, "TopBorderDistance" ) ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 254 ), getProperty< sal_Int32 >( xFrame, "RightBorderDistance" ) ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 127 ), getProperty< sal_Int32 >( xFrame, "BottomBorderDistance" ) ); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 1c0e257..768235e 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4965,13 +4965,38 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& rBox ) } } - // v:textbox's inset attribute: inner margin values for textbox text + // v:textbox's inset attribute: inner margin values for textbox text - write only non-default values + double aDistanceLeftTwips = double(rBox.GetDistance(BOX_LINE_LEFT)); + double aDistanceTopTwips = double(rBox.GetDistance(BOX_LINE_TOP)); + double aDistanceRightTwips = double(rBox.GetDistance(BOX_LINE_RIGHT)); + double aDistanceBottomTwips = double(rBox.GetDistance(BOX_LINE_BOTTOM)); + + // Convert 'TWIPS' to 'INCH' (because in Word the default values are in Inches) + double aDistanceLeftInch = aDistanceLeftTwips / 1440; + double aDistanceTopInch = aDistanceTopTwips / 1440; + double aDistanceRightInch = aDistanceRightTwips / 1440; + double aDistanceBottomInch = aDistanceBottomTwips / 1440; + + // This code will write ONLY the non-default values. The values are in 'left','top','right','bottom' order. + // so 'bottom' is checked if it is default and if it is non-default - all the values will be written + // otherwise - 'right' is checked if it is default and if it is non-default - all the values except for 'bottom' will be written + // and so on. OStringBuffer aInset; - aInset.append(OString::number(double(rBox.GetDistance(BOX_LINE_LEFT))/20) + "pt,"); - aInset.append(OString::number(double(rBox.GetDistance(BOX_LINE_TOP))/20) + "pt,"); - aInset.append(OString::number(double(rBox.GetDistance(BOX_LINE_RIGHT))/20) + "pt,"); - aInset.append(OString::number(double(rBox.GetDistance(BOX_LINE_BOTTOM))/20) + "pt"); - m_pTextboxAttrList->add(XML_inset, aInset.makeStringAndClear()); + if(!aInset.isEmpty() || aDistanceBottomInch != double(0.05)) + aInset.insert(0, "," + OString::number(aDistanceBottomInch) + "in"); + + if(!aInset.isEmpty() || aDistanceRightInch != double(0.1)) + aInset.insert(0, "," + OString::number(aDistanceRightInch) + "in"); + + if(!aInset.isEmpty() || aDistanceTopInch != double(0.05)) + aInset.insert(0, "," + OString::number(aDistanceTopInch) + "in"); + + if(!aInset.isEmpty() || aDistanceLeftInch != double(0.1)) + aInset.insert(0, OString::number(aDistanceLeftInch) + "in"); + + if (!aInset.isEmpty()) + m_pTextboxAttrList->add(XML_inset, aInset.makeStringAndClear()); + return; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits