[Libreoffice-commits] core.git: sw/inc sw/qa sw/source

Michael Stahl (via logerrit) logerrit at kemper.freedesktop.org
Tue Nov 24 18:55:18 UTC 2020


 sw/inc/unoparagraph.hxx                          |    6 -
 sw/qa/extras/unowriter/data/bookmarkintable.fodt |   82 +++++++++++++++++++++++
 sw/qa/extras/unowriter/unowriter.cxx             |   27 +++++++
 sw/source/core/unocore/unoobj.cxx                |    7 -
 sw/source/core/unocore/unoobj2.cxx               |   32 +++++++-
 sw/source/core/unocore/unotbl.cxx                |    3 
 6 files changed, 140 insertions(+), 17 deletions(-)

New commits:
commit ecc3c621fe5a7e962f0e40cb3709ad5772a5d744
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Tue Nov 24 15:33:44 2020 +0100
Commit:     Michael Stahl <michael.stahl at cib.de>
CommitDate: Tue Nov 24 19:54:36 2020 +0100

    sw: fix SwXTextRange::createEnumeration() inside table cell
    
    This would set CursorType::SelectionInTable but leave m_pOwnTable
    and m_pOwnStartNode uninitialised, causing
    
    sw/source/core/unocore/unoobj2.cxx:399: SwXParagraphEnumeration: table type but no start node or table
    
    and then the enumeration would return the table it's in as the first
    element, which is quite annoying.
    
    Refactor the creation of SwXParagraphEnumeration to prevent this.
    
    Change-Id: I4e9e3456bdf66b9822d19ad985a20b094e6bbba4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106532
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>

diff --git a/sw/inc/unoparagraph.hxx b/sw/inc/unoparagraph.hxx
index 64a8defd83fc..eb89ce47249e 100644
--- a/sw/inc/unoparagraph.hxx
+++ b/sw/inc/unoparagraph.hxx
@@ -43,7 +43,7 @@ class SwPaM;
 class SwUnoCursor;
 class SwStartNode;
 class SwTextNode;
-class SwTable;
+class SwTableBox;
 class SwXText;
 
 typedef ::cppu::ImplInheritanceHelper
@@ -216,8 +216,8 @@ struct SwXParagraphEnumeration
         css::uno::Reference< css::text::XText > const & xParent,
         const std::shared_ptr<SwUnoCursor>& pCursor,
         const CursorType eType,
-        SwStartNode const*const pStartNode = nullptr,
-        SwTable const*const pTable = nullptr);
+        /// only for CursorType::TableText
+        SwTableBox const*const pTableBox = nullptr);
 };
 
 #endif // INCLUDED_SW_INC_UNOPARAGRAPH_HXX
diff --git a/sw/qa/extras/unowriter/data/bookmarkintable.fodt b/sw/qa/extras/unowriter/data/bookmarkintable.fodt
new file mode 100644
index 000000000000..641200fef93e
--- /dev/null
+++ b/sw/qa/extras/unowriter/data/bookmarkintable.fodt
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:officeooo="http://openoffice.org/2009/office" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns
 :config:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="ur
 n:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta><meta:creation-date>2020-11-24T13:16:34.248376640</meta:creation-date><dc:date>2020-11-24T14:47:04.359492742</dc:date><meta:editing-duration>PT2M22S</meta:editing-duration><meta:editing-cycles>2</meta:editing-cycles><meta:generator>LibreOfficeDev/7.1.0.0.alpha1$Linux_X86_64 LibreOffice_project/a871df849fad8f923db945cf0606f30603380ef7</meta:generator><meta:document-statistic meta:table-count="1" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="1" meta:word-count="1" meta:character-count="5" meta:non-whitespace-character-count="5"/></office:meta>
+ <office:font-face-decls>
+  <style:font-face style:name="Liberation Serif" svg:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Arial Unicode MS" svg:font-family="'Arial Unicode MS'" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Source Han Serif CN" svg:font-family="'Source Han Serif CN'" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Source Han Serif CN" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Arial Unicode MS" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Source Han Serif CN" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Arial Unicode MS" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+  <style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:orphans="0" fo:widows="0" text:number-lines="false" text:line-number="0"/>
+  </style:style>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="Table1" style:family="table">
+   <style:table-properties style:width="17cm" table:align="margins"/>
+  </style:style>
+  <style:style style:name="Table1.A" style:family="table-column">
+   <style:table-column-properties style:column-width="17cm" style:rel-column-width="65535*"/>
+  </style:style>
+  <style:style style:name="Table1.A1" style:family="table-cell">
+   <style:table-cell-properties fo:padding="0.097cm" fo:border="0.05pt solid #000000"/>
+  </style:style>
+  <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Table_20_Contents">
+   <style:text-properties officeooo:rsid="001c6504" officeooo:paragraph-rsid="001c6504"/>
+  </style:style>
+  <style:style style:name="T1" style:family="text">
+   <style:text-properties officeooo:rsid="001cbfb2"/>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0cm">
+    <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <table:table table:name="Table1" table:style-name="Table1">
+    <table:table-column table:style-name="Table1.A"/>
+    <table:table-row table:style-name="TableLine91390352">
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1"><text:span text:style-name="T1">a</text:span><text:bookmark-start text:name="Bookmark 1"/>foo<text:bookmark-end text:name="Bookmark 1"/><text:span text:style-name="T1">b</text:span></text:p>
+     </table:table-cell>
+    </table:table-row>
+   </table:table>
+   <text:p text:style-name="Standard"/>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/unowriter/unowriter.cxx b/sw/qa/extras/unowriter/unowriter.cxx
index a3cf7afaa37e..eac432ccb2d6 100644
--- a/sw/qa/extras/unowriter/unowriter.cxx
+++ b/sw/qa/extras/unowriter/unowriter.cxx
@@ -31,6 +31,7 @@
 #include <com/sun/star/text/XTextDocument.hpp>
 #include <com/sun/star/container/XNameContainer.hpp>
 #include <com/sun/star/view/XRenderable.hpp>
+#include <com/sun/star/text/XBookmarksSupplier.hpp>
 #include <com/sun/star/text/XTextViewCursorSupplier.hpp>
 #include <com/sun/star/text/XTextTable.hpp>
 #include <com/sun/star/text/XPageCursor.hpp>
@@ -496,6 +497,32 @@ CPPUNIT_TEST_FIXTURE(SwUnoWriter, testSectionAnchorCopyTableAtEnd)
                          xCursor->getString());
 }
 
+CPPUNIT_TEST_FIXTURE(SwUnoWriter, testTextRangeInTable)
+{
+    load(DATA_DIRECTORY, "bookmarkintable.fodt");
+
+    uno::Reference<text::XBookmarksSupplier> const xBS(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XNameAccess> const xMarks(xBS->getBookmarks());
+    uno::Reference<text::XTextContent> const xMark(xMarks->getByName("Bookmark 1"), uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> const xAnchor(xMark->getAnchor(), uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> const xEnum(xAnchor->createEnumeration());
+    uno::Reference<lang::XServiceInfo> const xPara(xEnum->nextElement(), uno::UNO_QUERY);
+    // not the top-level table!
+    CPPUNIT_ASSERT(!xPara->supportsService("com.sun.star.text.TextTable"));
+    CPPUNIT_ASSERT(!xEnum->hasMoreElements());
+    uno::Reference<container::XEnumerationAccess> const xParaEA(xPara, uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> const xPortions(xParaEA->createEnumeration());
+    uno::Reference<beans::XPropertySet> const xP1(xPortions->nextElement(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty<OUString>(xP1, "TextPortionType"));
+    uno::Reference<beans::XPropertySet> const xP2(xPortions->nextElement(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty<OUString>(xP2, "TextPortionType"));
+    uno::Reference<text::XTextRange> const xP2R(xP2, uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("foo"), xP2R->getString());
+    uno::Reference<beans::XPropertySet> const xP3(xPortions->nextElement(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty<OUString>(xP3, "TextPortionType"));
+    CPPUNIT_ASSERT(!xPortions->hasMoreElements());
+}
+
 CPPUNIT_TEST_FIXTURE(SwUnoWriter, testXURI)
 {
     uno::Reference<uno::XComponentContext> xContext(::comphelper::getProcessComponentContext());
diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx
index eb100abb6e54..38315904adb2 100644
--- a/sw/source/core/unocore/unoobj.cxx
+++ b/sw/source/core/unocore/unoobj.cxx
@@ -2909,12 +2909,7 @@ SwXTextCursor::createEnumeration()
     }
     const CursorType eSetType = (CursorType::TableText == m_pImpl->m_eType)
             ? CursorType::SelectionInTable : CursorType::Selection;
-    SwTableNode const*const pStartNode( (CursorType::TableText == m_pImpl->m_eType)
-            ? rUnoCursor.GetPoint()->nNode.GetNode().FindTableNode()
-            : nullptr);
-    SwTable const*const pTable(
-            pStartNode ? & pStartNode->GetTable() : nullptr );
-    return SwXParagraphEnumeration::Create(pParentText, pNewCursor, eSetType, pStartNode, pTable);
+    return SwXParagraphEnumeration::Create(pParentText, pNewCursor, eSetType);
 }
 
 uno::Type SAL_CALL
diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx
index f88ee9b84a9f..a2b98d41d307 100644
--- a/sw/source/core/unocore/unoobj2.cxx
+++ b/sw/source/core/unocore/unoobj2.cxx
@@ -395,10 +395,9 @@ struct SwXParagraphEnumerationImpl final : public SwXParagraphEnumeration
         , m_pCursor(pCursor)
     {
         OSL_ENSURE(m_xParentText.is(), "SwXParagraphEnumeration: no parent?");
-        OSL_ENSURE(   !((CursorType::SelectionInTable == eType) ||
-                        (CursorType::TableText == eType))
-                   || (m_pOwnTable && m_pOwnStartNode),
-            "SwXParagraphEnumeration: table type but no start node or table?");
+        assert( !((CursorType::SelectionInTable == eType)
+                      || (CursorType::TableText == eType))
+            || (m_pOwnTable && m_pOwnStartNode));
 
         if ((CursorType::Selection == m_eCursorType) ||
             (CursorType::SelectionInTable == m_eCursorType))
@@ -451,9 +450,30 @@ SwXParagraphEnumeration* SwXParagraphEnumeration::Create(
     uno::Reference< text::XText > const& xParent,
     const std::shared_ptr<SwUnoCursor>& pCursor,
     const CursorType eType,
-    SwStartNode const*const pStartNode,
-    SwTable const*const pTable)
+    SwTableBox const*const pTableBox)
 {
+    SwStartNode const* pStartNode(nullptr);
+    SwTable const* pTable(nullptr);
+    assert((eType == CursorType::TableText) == (pTableBox != nullptr));
+    switch (eType)
+    {
+        case CursorType::TableText:
+        {
+            pStartNode = pTableBox->GetSttNd();
+            pTable = & pStartNode->FindTableNode()->GetTable();
+            break;
+        }
+        case CursorType::SelectionInTable:
+        {
+            SwTableNode const*const pTableNode(
+                pCursor->GetPoint()->nNode.GetNode().FindTableNode());
+            pStartNode = pTableNode;
+            pTable = & pTableNode->GetTable();
+            break;
+        }
+        default:
+            break;
+    }
     return new SwXParagraphEnumerationImpl(xParent, pCursor, eType, pStartNode, pTable);
 }
 
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index 527b56099cb0..9731df22cd99 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -1113,8 +1113,7 @@ uno::Reference<container::XEnumeration> SwXCell::createEnumeration()
     pUnoCursor->Move(fnMoveForward, GoInNode);
     // remember table and start node for later travelling
     // (used in export of tables in tables)
-    SwTable const*const pTable(&pSttNd->FindTableNode()->GetTable());
-    return SwXParagraphEnumeration::Create(this, pUnoCursor, CursorType::TableText, pSttNd, pTable);
+    return SwXParagraphEnumeration::Create(this, pUnoCursor, CursorType::TableText, m_pBox);
 }
 
 uno::Type SAL_CALL SwXCell::getElementType()


More information about the Libreoffice-commits mailing list