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.st...@cib.de>
AuthorDate: Tue Nov 24 15:33:44 2020 +0100
Commit:     Michael Stahl <michael.st...@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.st...@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="&apos;Liberation Serif&apos;" 
style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Arial Unicode MS" svg:font-family="&apos;Arial 
Unicode MS&apos;" style:font-family-generic="system" 
style:font-pitch="variable"/>
+  <style:font-face style:name="Source Han Serif CN" 
svg:font-family="&apos;Source Han Serif CN&apos;" 
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()
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to