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 <nemeth@numbertext.org>
(cherry picked from commit 0204c00f241313e1d292b4c3ea117d42af7dec69)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133292
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/sw/source/uibase/shells/tabsh.cxx b/sw/source/uibase/shells/tabsh.cxx
index 7798b6c..84a090b 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