[Libreoffice-commits] core.git: sw/qa sw/source
Miklos Vajna
vmiklos at collabora.co.uk
Wed Jul 11 14:21:11 UTC 2018
sw/qa/extras/layout/data/tdf118672.odt |binary
sw/qa/extras/layout/layout.cxx | 27 +++++++++++++++++++++++++++
sw/source/core/text/inftxt.cxx | 6 ++++--
sw/source/core/text/xmldump.cxx | 19 ++++++++++++++++---
4 files changed, 47 insertions(+), 5 deletions(-)
New commits:
commit 4b345f95ce7cb09011892bf465cfdf3811adaf8e
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Wed Jul 11 14:29:36 2018 +0200
tdf#118672 sw layout, TabOverMargin: allow using the area over the tab portion
TabOverMargin in general is about allowing the cursor to jump over a
margin if there is an explicit tab stop there.
A corner-case is what to do when there is enough content so a line break
is necessary for the characters after the tab portion. Allow using the
area up to the edge of the whole text frame (i.e. over the tab
position), this matches what Word does.
Change-Id: Ie86edf030d54fba556eee26e7ea563fb8d4fbee4
Reviewed-on: https://gerrit.libreoffice.org/57275
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
Tested-by: Jenkins
diff --git a/sw/qa/extras/layout/data/tdf118672.odt b/sw/qa/extras/layout/data/tdf118672.odt
new file mode 100644
index 000000000000..5f480f670ada
Binary files /dev/null and b/sw/qa/extras/layout/data/tdf118672.odt differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 1ff1c23c6df4..ea2e24f06b75 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -9,6 +9,7 @@
#include <swmodeltestbase.hxx>
#include <test/mtfxmldump.hxx>
+#include <com/sun/star/linguistic2/LinguServiceManager.hpp>
static char const DATA_DIRECTORY[] = "/sw/qa/extras/layout/data/";
@@ -24,6 +25,7 @@ public:
void testTableExtrusion2();
void testTdf116848();
void testTdf117245();
+ void testTdf118672();
void testTdf117923();
CPPUNIT_TEST_SUITE(SwLayoutWriter);
@@ -35,6 +37,7 @@ public:
CPPUNIT_TEST(testTableExtrusion2);
CPPUNIT_TEST(testTdf116848);
CPPUNIT_TEST(testTdf117245);
+ CPPUNIT_TEST(testTdf118672);
CPPUNIT_TEST(testTdf117923);
CPPUNIT_TEST_SUITE_END();
@@ -196,6 +199,30 @@ void SwLayoutWriter::testTdf117245()
assertXPath(pXmlDoc, "/root/page/body/txt[2]/LineBreak", 1);
}
+void SwLayoutWriter::testTdf118672()
+{
+ createDoc("tdf118672.odt");
+ xmlDocPtr pXmlDoc = parseLayoutDump();
+
+ // Check if we have hyphenation support, otherwise can't test SwHyphPortion.
+ uno::Reference<linguistic2::XLinguServiceManager2> xLinguServiceManager
+ = linguistic2::LinguServiceManager::create(comphelper::getProcessComponentContext());
+ uno::Sequence<lang::Locale> aLocales
+ = xLinguServiceManager->getAvailableLocales("com.sun.star.linguistic2.Hyphenator");
+ auto it = std::find_if(aLocales.begin(), aLocales.end(), [](const lang::Locale& rLocale) {
+ return rLocale.Language == "en" && rLocale.Country == "US";
+ });
+ if (it == aLocales.end())
+ return;
+
+ OUString aLine1("He heard quiet steps behind him. That didn't bode well. Who could be fol*1 2 "
+ "3 4 5 6 7 8 9 10con-");
+ // This ended as "fol*1 2 3 4 5 6 7 8 9", i.e. "10con-" was moved to the next line.
+ assertXPath(pXmlDoc, "/root/page/body/txt[1]/LineBreak[1]", "Line", aLine1);
+ OUString aLine2("setetur");
+ assertXPath(pXmlDoc, "/root/page/body/txt[1]/LineBreak[2]", "Line", aLine2);
+}
+
void SwLayoutWriter::testTdf117923()
{
createDoc("tdf117923.doc");
diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx
index 5c7faa1b8511..eeff3e39eb14 100644
--- a/sw/source/core/text/inftxt.cxx
+++ b/sw/source/core/text/inftxt.cxx
@@ -1702,11 +1702,13 @@ SwTwips SwTextFormatInfo::GetLineWidth()
if (!pLastTab)
return nLineWidth;
+ // Consider tab portions over the printing bounds of the text frame.
if (pLastTab->GetTabPos() <= Width())
return nLineWidth;
- // Consider tab portions over the printing bounds of the text frame.
- nLineWidth = pLastTab->GetTabPos() - X();
+ // If there is one such tab portion, then text is allowed to use the full
+ // text frame area (even over the actual tab portion).
+ nLineWidth = GetTextFrame()->getFrameArea().Width() - X();
return nLineWidth;
}
diff --git a/sw/source/core/text/xmldump.cxx b/sw/source/core/text/xmldump.cxx
index d29d7abdbd7a..7ad0a25fdf98 100644
--- a/sw/source/core/text/xmldump.cxx
+++ b/sw/source/core/text/xmldump.cxx
@@ -32,6 +32,8 @@ class XmlPortionDumper:public SwPortionHandler
private:
xmlTextWriterPtr writer;
TextFrameIndex ofs;
+ const OUString& m_rText;
+ OUString m_aLine;
static const char* getTypeName( sal_uInt16 nType )
{
@@ -105,7 +107,7 @@ class XmlPortionDumper:public SwPortionHandler
public:
- explicit XmlPortionDumper( xmlTextWriterPtr some_writer ):writer( some_writer ), ofs( 0 )
+ explicit XmlPortionDumper( xmlTextWriterPtr some_writer, const OUString& rText ):writer( some_writer ), ofs( 0 ), m_rText(rText)
{
}
@@ -120,7 +122,6 @@ class XmlPortionDumper:public SwPortionHandler
sal_Int32 nHeight,
sal_Int32 nWidth) override
{
- ofs += nLength;
xmlTextWriterStartElement( writer, BAD_CAST( "Text" ) );
xmlTextWriterWriteFormatAttribute( writer,
BAD_CAST( "nLength" ),
@@ -132,8 +133,13 @@ class XmlPortionDumper:public SwPortionHandler
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST("nHeight"), "%i", static_cast<int>(nHeight));
if (nWidth > 0)
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST("nWidth"), "%i", static_cast<int>(nWidth));
+ if (nLength > 0)
+ xmlTextWriterWriteAttribute(writer, BAD_CAST("Portion"),
+ BAD_CAST(m_rText.copy(ofs, nLength).toUtf8().getStr()));
xmlTextWriterEndElement( writer );
+ m_aLine += m_rText.copy(ofs, nLength);
+ ofs += nLength;
}
/**
@@ -174,6 +180,7 @@ class XmlPortionDumper:public SwPortionHandler
pFont->dumpAsXml(writer);
xmlTextWriterEndElement( writer );
+ m_aLine += rText;
ofs += nLength;
}
@@ -184,6 +191,12 @@ class XmlPortionDumper:public SwPortionHandler
xmlTextWriterWriteFormatAttribute( writer,
BAD_CAST( "nWidth" ),
"%i", static_cast<int>(nWidth) );
+ if (!m_aLine.isEmpty())
+ {
+ xmlTextWriterWriteAttribute(writer, BAD_CAST("Line"),
+ BAD_CAST(m_aLine.toUtf8().getStr()));
+ m_aLine.clear();
+ }
xmlTextWriterEndElement( writer );
}
@@ -379,7 +392,7 @@ void SwFrame::dumpAsXml( xmlTextWriterPtr writer ) const
RTL_TEXTENCODING_UTF8 );
xmlTextWriterWriteString( writer,
reinterpret_cast<const xmlChar *>(aText8.getStr( )) );
- XmlPortionDumper pdumper( writer );
+ XmlPortionDumper pdumper( writer, aText );
pTextFrame->VisitPortions( pdumper );
}
More information about the Libreoffice-commits
mailing list