sw/source/uibase/shells/tabsh.cxx |   46 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 44 insertions(+), 2 deletions(-)

New commits:
commit ed7243ec27d8cdc883ccc5f7eaa732155c4a2096
Author:     László Németh <nem...@numbertext.org>
AuthorDate: Fri Apr 22 13:23:55 2022 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Tue Apr 26 09:28:30 2022 +0200

    tdf#147453 sw: disable Delete Table functions on tracked deletions
    
    In Show Changes mode, disable "Delete Selected Rows" icons
    and the same menu options in the following cases:
    
    - no table selection, but the text cursor in a deleted table row;
    
    - with table selection, all selected cells in deleted table rows.
    
    Disable also "Deleted Selected Columns" and "Delete Table"
    icons and the same menu options, when the cursor is there
    in a deleted table.
    
    Follow-up to commit c4f6fee3bea0d8618b5815e60304ff9359ccd21c
    "tdf#147435 sw: enable Accept Change for table selection".
    
    Change-Id: Ic6781ccee794c7458e6979f2e981840339cd3883
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133320
    Tested-by: Jenkins
    Reviewed-by: László Németh <nem...@numbertext.org>
    (cherry picked from commit 0204c00f241313e1d292b4c3ea117d42af7dec69)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133292
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sw/source/uibase/shells/tabsh.cxx 
b/sw/source/uibase/shells/tabsh.cxx
index 7798b6c0da9c..84a090b111fd 100644
--- a/sw/source/uibase/shells/tabsh.cxx
+++ b/sw/source/uibase/shells/tabsh.cxx
@@ -55,6 +55,7 @@
 #include <fmtfsize.hxx>
 #include <swmodule.hxx>
 #include <wrtsh.hxx>
+#include <rootfrm.hxx>
 #include <wview.hxx>
 #include <frmatr.hxx>
 #include <uitool.hxx>
@@ -445,6 +446,43 @@ static void lcl_TabGetMaxLineWidth(const SvxBorderLine* 
pBorderLine, SvxBorderLi
     rBorderLine.SetColor(pBorderLine->GetColor());
 }
 
+static bool lcl_BoxesInDeletedRows(SwWrtShell &rSh, const SwSelBoxes& rBoxes)
+{
+    // cursor and selection are there only in deleted rows in Show Changes mode
+    if ( rSh.GetLayout()->IsHideRedlines() )
+        return false;
+
+    // not selected or all selected rows are deleted
+    bool bRet = true;
+    SwRedlineTable::size_type nRedlinePos = 0;
+    if ( rBoxes.empty() )
+        bRet = 
rSh.GetCursor()->GetNode().GetTableBox()->GetUpper()->IsDeleted(nRedlinePos);
+    else
+    {
+        tools::Long nBoxes = rBoxes.size();
+        SwTableLine* pPrevLine = nullptr;
+        for ( tools::Long i = 0; i < nBoxes; i++ )
+        {
+            SwTableLine* pLine = rBoxes[i]->GetUpper();
+            if ( pLine != pPrevLine )
+                bRet &= pLine->IsDeleted(nRedlinePos);
+            pPrevLine = pLine;
+        }
+    }
+
+    return bRet;
+}
+
+static bool lcl_CursorInDeletedTable(SwWrtShell &rSh)
+{
+    // cursor and selection are there only in deleted table in Show Changes 
mode
+    if ( rSh.GetLayout()->IsHideRedlines() )
+        return false;
+
+    SwTableNode* pTableNd = 
rSh.GetCursor()->GetPoint()->nNode.GetNode().FindTableNode();
+    return pTableNd && pTableNd->GetTable().IsDeleted();
+}
+
 void SwTableShell::Execute(SfxRequest &rReq)
 {
     const SfxItemSet* pArgs = rReq.GetArgs();
@@ -1381,7 +1419,7 @@ void SwTableShell::GetState(SfxItemSet &rSet)
                 {
                     SwSelBoxes aBoxes;
                     ::GetTableSel( rSh, aBoxes, SwTableSearchType::Row );
-                    if( ::HasProtectedCells( aBoxes ))
+                    if( ::HasProtectedCells( aBoxes ) || 
lcl_BoxesInDeletedRows( rSh, aBoxes ) )
                         rSet.DisableItem( nSlot );
                 }
                 break;
@@ -1389,10 +1427,14 @@ void SwTableShell::GetState(SfxItemSet &rSet)
                 {
                     SwSelBoxes aBoxes;
                     ::GetTableSel( rSh, aBoxes, SwTableSearchType::Col );
-                    if( ::HasProtectedCells( aBoxes ))
+                    if( ::HasProtectedCells( aBoxes ) || 
lcl_CursorInDeletedTable( rSh ) )
                         rSet.DisableItem( nSlot );
                 }
                 break;
+            case FN_TABLE_DELETE_TABLE:
+                if( lcl_CursorInDeletedTable( rSh ) )
+                    rSet.DisableItem( nSlot );
+                break;
 
             case FN_TABLE_UNSET_READ_ONLY_CELLS:
                 // disable in readonly sections, but enable in protected cells

Reply via email to