sw/qa/extras/uiwriter/data/tdf160842.fodt |   75 ++++++++++++++++++++++++++++++
 sw/qa/extras/uiwriter/uiwriter6.cxx       |   41 ++++++++++++++++
 sw/source/core/frmedt/feshview.cxx        |   22 ++++++++
 3 files changed, 138 insertions(+)

New commits:
commit 5ad48954250b9235f4381a756445c318d2d69f6c
Author:     László Németh <nem...@numbertext.org>
AuthorDate: Sat Apr 27 00:26:54 2024 +0200
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Mon May 13 11:56:35 2024 +0200

    tdf#160842 sw: select cell content instead of cropped part of image
    
    It was not possible to select and edit the content of the bottom
    cell, if an image cropped by the fixed row height "covered" it,
    i.e. the image was in the previous row, anchored as character.
    
    Note: table cells with fixed row height are usable to crop images
    easily, with a single drag & drop, according to the requirement of
    the text layout, while the cell above or bottom of the cell with
    image is for the caption of the image. This is very useful to
    adjust a book layout with sections with multiple columns and
    illustrations.
    
    Change-Id: I8683b4066db6ce43549ec3aa69b0e639a59e3681
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166794
    Tested-by: Jenkins
    Reviewed-by: László Németh <nem...@numbertext.org>
    (cherry picked from commit f3b899655018397e71300dbb32cdf4f82940a68b)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167089
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/sw/qa/extras/uiwriter/data/tdf160842.fodt 
b/sw/qa/extras/uiwriter/data/tdf160842.fodt
new file mode 100644
index 000000000000..217b9c1a9570
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data/tdf160842.fodt
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document 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:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xforms="http://www.w3.org/2002/xforms"; 
xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:ooow="http://openoffice.org/2004/writer"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:dc="http://purl.org/dc/elements/1.1/"; xmlns:c
 alcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:officeooo="http://openoffice.org/2009/office"; 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:
 meta:1.0" 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
 office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <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:writing-mode="lr-tb" 
style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" 
style:line-break="strict" loext:tab-stop-distance="0cm" 
style:writing-mode="lr-tb" 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="DejaVu Sans" fo:font-size="12pt" 
fo:language="en" fo:country="US" style:letter-kerning="true" 
style:font-size-complex="12pt"/>
+  </style:default-style>
+  <style:style style:name="Frame_20_contents" style:display-name="Frame 
contents" style:family="paragraph" style:parent-style-name="Standard" 
style:class="extra"/>
+  <style:style style:name="Graphics" style:family="graphic">
+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" 
svg:y="0cm" style:wrap="dynamic" style:number-wrapped-paragraphs="no-limit" 
style:wrap-contour="false" style:vertical-pos="top" 
style:vertical-rel="paragraph" style:horizontal-pos="center" 
style:horizontal-rel="paragraph" fo:background-color="transparent" 
draw:fill="none" draw:fill-color="#729fcf"/>
+  </style:style>
+  <style:style style:name="Frame" style:family="graphic">
+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" 
svg:y="0cm" fo:margin-left="0.201cm" fo:margin-right="0.201cm" 
fo:margin-top="0.201cm" fo:margin-bottom="0.201cm" style:wrap="parallel" 
style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" 
style:vertical-pos="top" style:vertical-rel="paragraph-content" 
style:horizontal-pos="center" style:horizontal-rel="paragraph-content" 
fo:background-color="transparent" draw:fill="none" draw:fill-color="#729fcf" 
fo:padding="0.15cm" fo:border="0.06pt solid #000000"/>
+  </style:style>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="Table1" style:family="table">
+   <style:table-properties style:width="8.707cm" table:align="margins" 
style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="Table1.A" style:family="table-column">
+   <style:table-column-properties style:column-width="8.707cm" 
style:rel-column-width="65535*"/>
+  </style:style>
+  <style:style style:name="Table1.1" style:family="table-row">
+   <style:table-row-properties style:row-height="6.897cm" 
fo:keep-together="always"/>
+  </style:style>
+  <style:style style:name="Table1.A1" style:family="table-cell">
+   <style:table-cell-properties style:vertical-align="top" fo:padding="0cm" 
fo:border="0.05pt solid #000000" style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="Table1.2" style:family="table-row">
+   <style:table-row-properties style:min-row-height="0.109cm" 
fo:keep-together="always"/>
+  </style:style>
+  <style:style style:name="Table1.A2" style:family="table-cell">
+   <style:table-cell-properties style:vertical-align="top" fo:padding="0cm" 
fo:border="none" style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="fr1" style:family="graphic" 
style:parent-style-name="Frame">
+   <style:graphic-properties fo:margin-left="0cm" fo:margin-right="0cm" 
fo:margin-top="0cm" fo:margin-bottom="0cm" style:vertical-pos="top" 
style:vertical-rel="paragraph" style:horizontal-pos="left" 
style:horizontal-rel="paragraph" fo:padding="0cm" fo:border="none" 
draw:wrap-influence-on-position="once-concurrent" loext:allow-overlap="true"/>
+  </style:style>
+  <style:style style:name="fr2" style:family="graphic" 
style:parent-style-name="Graphics">
+   <style:graphic-properties fo:margin-left="0cm" fo:margin-right="0cm" 
fo:margin-top="0cm" fo:margin-bottom="0cm" style:vertical-pos="from-top" 
style:horizontal-pos="center" style:horizontal-rel="paragraph" fo:padding="0cm" 
fo:border="none" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" 
draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" 
draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" 
draw:image-opacity="100%" draw:color-mode="standard"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1" 
draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <text:p text:style-name="P3"><draw:frame draw:style-name="fr1" 
draw:name="Frame1" text:anchor-type="paragraph" svg:width="8.707cm" 
draw:z-index="0">
+     <draw:text-box fo:min-height="6.765cm">
+      <table:table table:name="Table1" table:style-name="Table1">
+       <table:table-column table:style-name="Table1.A"/>
+       <table:table-row table:style-name="Table1.1">
+        <table:table-cell table:style-name="Table1.A1" 
office:value-type="string">
+         <text:p text:style-name="P1"><draw:frame draw:style-name="fr2" 
draw:name="Image1" text:anchor-type="as-char" svg:y="-10.984cm" 
svg:width="11.234cm" svg:height="8.398cm" draw:z-index="1"><draw:image 
draw:mime-type="image/png">
+            
<office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAAFklEQVQI12P2Ytilf46NeWX3
+             a804HgAg7QTAqXPBTwAAAABJRU5ErkJggg==
+            </office:binary-data>
+           </draw:image>
+          </draw:frame><text:span 
text:style-name="T1"><text:s/></text:span></text:p>
+        </table:table-cell>
+       </table:table-row>
+       <table:table-row table:style-name="Table1.2">
+        <table:table-cell table:style-name="Table1.A2" 
office:value-type="string">
+         <text:p text:style-name="P2">Lorem ipsum dolor sit amet, consectetur 
adipiscing.</text:p>
+        </table:table-cell>
+       </table:table-row>
+      </table:table>
+     </draw:text-box>
+    </draw:frame></text:p>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/uiwriter/uiwriter6.cxx 
b/sw/qa/extras/uiwriter/uiwriter6.cxx
index 9b8ae0244efe..db0c8f6929c7 100644
--- a/sw/qa/extras/uiwriter/uiwriter6.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter6.cxx
@@ -55,6 +55,10 @@
 #include <wrthtml.hxx>
 #include <dbmgr.hxx>
 #include <rootfrm.hxx>
+#include <pagefrm.hxx>
+#include <sortedobjs.hxx>
+#include <flyfrms.hxx>
+#include <tabfrm.hxx>
 #include <unotxdoc.hxx>
 #include <wrong.hxx>
 #include <com/sun/star/linguistic2/LinguServiceManager.hpp>
@@ -1472,6 +1476,43 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf44773)
     CPPUNIT_ASSERT_EQUAL(tools::Long(810), pCellA1->getFrameArea().Height());
 }
 
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf160842)
+{
+    createSwDoc("tdf160842.fodt");
+    SwDoc* pDoc = getSwDoc();
+    CPPUNIT_ASSERT(pDoc);
+    SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+    CPPUNIT_ASSERT(pWrtShell);
+    // the cursor is not in the table
+    CPPUNIT_ASSERT(!pWrtShell->IsCursorInTable());
+
+    SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout();
+    auto pPage = dynamic_cast<SwPageFrame*>(pLayout->Lower());
+    CPPUNIT_ASSERT(pPage);
+    const SwSortedObjs& rPageObjs = *pPage->GetSortedObjs();
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPageObjs.size());
+    auto pPageFly = dynamic_cast<SwFlyAtContentFrame*>(rPageObjs[0]);
+    CPPUNIT_ASSERT(pPageFly);
+    auto pTable = dynamic_cast<SwTabFrame*>(pPageFly->GetLower());
+    CPPUNIT_ASSERT(pTable);
+    auto pRow2 = pTable->GetLower()->GetNext();
+    CPPUNIT_ASSERT(pRow2->IsRowFrame());
+    auto pCellA2 = pRow2->GetLower();
+    CPPUNIT_ASSERT(pCellA2);
+    const SwRect& rCellA2Rect = pCellA2->getFrameArea();
+    auto nRowHeight = rCellA2Rect.Height();
+    // select center of the bottom cell
+    Point ptFrom(rCellA2Rect.Left() + rCellA2Rect.Width() / 2, 
rCellA2Rect.Top() + nRowHeight / 2);
+    vcl::Window& rEditWin = pDoc->GetDocShell()->GetView()->GetEditWin();
+    Point aFrom = rEditWin.LogicToPixel(ptFrom);
+    MouseEvent aClickEvent(aFrom, 1, MouseEventModifiers::SIMPLECLICK, 
MOUSE_LEFT);
+    rEditWin.MouseButtonDown(aClickEvent);
+    rEditWin.MouseButtonUp(aClickEvent);
+
+    // the cursor is in the table
+    CPPUNIT_ASSERT(pWrtShell->IsCursorInTable());
+}
+
 CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf115132)
 {
     createSwDoc();
diff --git a/sw/source/core/frmedt/feshview.cxx 
b/sw/source/core/frmedt/feshview.cxx
index 9154758364fb..4ad0747619ee 100644
--- a/sw/source/core/frmedt/feshview.cxx
+++ b/sw/source/core/frmedt/feshview.cxx
@@ -68,6 +68,7 @@
 #include <rootfrm.hxx>
 #include <pagefrm.hxx>
 #include <sectfrm.hxx>
+#include <rowfrm.hxx>
 #include <doc.hxx>
 #include <IDocumentUndoRedo.hxx>
 #include <dview.hxx>
@@ -1392,6 +1393,27 @@ bool SwFEShell::ShouldObjectBeSelected(const Point& rPt)
                     }
                 }
             }
+
+            // within table row, where image cropped by the fixed table row 
height,
+            // click position must be in the cell, where the image anchored as 
character
+            if ( bRet && pContact && pContact->ObjAnchoredAsChar() )
+            {
+                if ( const SwTableBox *pBox = 
pContact->GetAnchorNode().GetTableBox() )
+                {
+                    SwIterator<SwRowFrame, SwFormat> aIter( 
*pBox->GetUpper()->GetFrameFormat() );
+                    bool bContainsClickPosition = false;
+                    for (SwRowFrame* pFrame = aIter.First(); pFrame; pFrame = 
aIter.Next())
+                    {
+                        if ( pFrame->getFrameArea().Contains( rPt ) )
+                        {
+                            bContainsClickPosition = true;
+                            break;
+                        }
+                    }
+                    if ( !bContainsClickPosition )
+                        bRet = false;
+                }
+            }
         }
     }
 

Reply via email to