tdf#155343 sw tracked table column: add tooltip

Tooltip of a deleted table column shows "Column Deleted",
an inserted table column (will) show "Column Inserted".

Follow-up to commit ffd8d20d368a885d6d786749278fa438573227a7
"tdf#150673 sw xmloff: import/export tracked table column" and
commit 84fbb3398f7486f00e7b7dea415e1ea2510a9535
"tdf#146144 sw: add tooltip to table rows with change tracking".

Change-Id: I79fd2397410328b320bd2536285cc5cc835da9fd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151998
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx
index 57bb90a..6efdcee 100644
--- a/sw/inc/crsrsh.hxx
+++ b/sw/inc/crsrsh.hxx
@@ -87,15 +87,16 @@ enum class IsAttrAtPos
    ContentCheck     = 0x0400,
    SmartTag         = 0x0800,
    FormControl      = 0x1000,
    TableRedline     = 0x2000
    TableRedline     = 0x2000,
    TableColRedline  = 0x4000
#ifdef DBG_UTIL
    ,CurrAttrs       = 0x4000        ///< only for debugging
    ,TableBoxValue   = 0x8000        ///< only for debugging
    ,CurrAttrs       = 0x8000        ///< only for debugging
    ,TableBoxValue   = 0x10000       ///< only for debugging
#endif
    , ContentControl = 0x10000
    , ContentControl = 0x20000
};
namespace o3tl {
    template<> struct typed_flags<IsAttrAtPos> : is_typed_flags<IsAttrAtPos, 0x1ffff> {};
    template<> struct typed_flags<IsAttrAtPos> : is_typed_flags<IsAttrAtPos, 0x3ffff> {};
}

struct SwContentAtPos
diff --git a/sw/inc/strings.hrc b/sw/inc/strings.hrc
index b7c8137..c18aff4 100644
--- a/sw/inc/strings.hrc
+++ b/sw/inc/strings.hrc
@@ -1268,6 +1268,8 @@
#define STR_REDLINE_PARAGRAPH_FORMAT            NC_("STR_REDLINE_PARAGRAPH_FORMAT", "Paragraph formatting changed")
#define STR_REDLINE_TABLE_ROW_INSERT            NC_("STR_REDLINE_TABLE_ROW_INSERT", "Row Inserted")
#define STR_REDLINE_TABLE_ROW_DELETE            NC_("STR_REDLINE_TABLE_ROW_DELETE", "Row Deleted")
#define STR_REDLINE_TABLE_COLUMN_INSERT         NC_("STR_REDLINE_TABLE_COLUMN_INSERT", "Column Inserted")
#define STR_REDLINE_TABLE_COLUMN_DELETE         NC_("STR_REDLINE_TABLE_COLUMN_DELETE", "Column Deleted")
#define STR_REDLINE_TABLE_CELL_INSERT           NC_("STR_REDLINE_TABLE_CELL_INSERT", "Cell Inserted")
#define STR_REDLINE_TABLE_CELL_DELETE           NC_("STR_REDLINE_TABLE_CELL_DELETE", "Cell Deleted")
#define STR_REDLINE_INSERT_MOVED                NC_("STR_REDLINE_INSERT_MOVED", "Moved (insertion)")
diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx
index 3ea5db4..a165623 100644
--- a/sw/source/core/crsr/crstrvl.cxx
+++ b/sw/source/core/crsr/crstrvl.cxx
@@ -1879,7 +1879,8 @@ bool SwCursorShell::GetContentAtPos( const Point& rPt,
            }
        }

        if( !bRet && ( IsAttrAtPos::TableRedline & rContentAtPos.eContentAtPos ) )
        if( !bRet && ( ( IsAttrAtPos::TableRedline & rContentAtPos.eContentAtPos ) ||
                     ( IsAttrAtPos::TableColRedline & rContentAtPos.eContentAtPos ) ) )
        {
            const SwTableNode* pTableNd;
            const SwTableBox* pBox;
@@ -1889,17 +1890,34 @@ bool SwCursorShell::GetContentAtPos( const Point& rPt,
                nullptr != ( pBox = pTableNd->GetTable().GetTableBox(
                pSttNd->GetIndex() )) &&
                nullptr != ( pTableLine = pBox->GetUpper() ) &&
                RedlineType::None != pTableLine->GetRedlineType() )
                ( RedlineType::None != pBox->GetRedlineType() ||
                RedlineType::None != pTableLine->GetRedlineType() ) )
            {
                SwRedlineTable::size_type nPos = 0;
                nPos = pTableLine->UpdateTextChangesOnly(nPos);
                if ( nPos != SwRedlineTable::npos )
                const SwRedlineTable& aRedlineTable = GetDoc()->getIDocumentRedlineAccess().GetRedlineTable();
                if ( RedlineType::None != pTableLine->GetRedlineType() )
                {
                    rContentAtPos.aFnd.pRedl = GetDoc()->getIDocumentRedlineAccess().GetRedlineTable()[nPos];
                    rContentAtPos.eContentAtPos = IsAttrAtPos::TableRedline;
                    bRet = true;
                    SwRedlineTable::size_type nPos = 0;
                    nPos = pTableLine->UpdateTextChangesOnly(nPos);
                    if ( nPos != SwRedlineTable::npos )
                    {
                        rContentAtPos.aFnd.pRedl = aRedlineTable[nPos];
                        rContentAtPos.eContentAtPos = IsAttrAtPos::TableRedline;
                        bRet = true;
                    }
                }

                else
                {
                    SwRedlineTable::size_type n = 0;
                    SwNodeIndex aIdx( *pSttNd, 1 );
                    const SwPosition aBoxStart(aIdx);
                    const SwRangeRedline* pFnd = aRedlineTable.FindAtPosition( aBoxStart, n, /*next=*/true );
                    if( pFnd && RedlineType::Delete == pFnd->GetType() )
                    {
                        rContentAtPos.aFnd.pRedl = aRedlineTable[n];
                        rContentAtPos.eContentAtPos = IsAttrAtPos::TableColRedline;
                        bRet = true;
                    }
                }
            }
        }

diff --git a/sw/source/uibase/docvw/edtwin2.cxx b/sw/source/uibase/docvw/edtwin2.cxx
index 1c95637..0efbd85 100644
--- a/sw/source/uibase/docvw/edtwin2.cxx
+++ b/sw/source/uibase/docvw/edtwin2.cxx
@@ -253,19 +253,24 @@ bool PSCSDFPropsQuickHelp(const HelpEvent &rEvt, SwWrtShell& rSh)
}
}

static OUString lcl_GetRedlineHelp( const SwRangeRedline& rRedl, bool bBalloon, bool bTableChange )
static OUString lcl_GetRedlineHelp( const SwRangeRedline& rRedl, bool bBalloon,
                                    bool bTableChange, bool bTableColChange )
{
    TranslateId pResId;
    switch( rRedl.GetType() )
    {
    case RedlineType::Insert:   pResId = bTableChange
        ? STR_REDLINE_TABLE_ROW_INSERT
        ? !bTableColChange
            ? STR_REDLINE_TABLE_ROW_INSERT
            : STR_REDLINE_TABLE_COLUMN_INSERT
        :  rRedl.IsMoved()
            ? STR_REDLINE_INSERT_MOVED
            : STR_REDLINE_INSERT;
        break;
    case RedlineType::Delete:   pResId = bTableChange
        ? STR_REDLINE_TABLE_ROW_DELETE
        ? !bTableColChange
            ? STR_REDLINE_TABLE_ROW_DELETE
            : STR_REDLINE_TABLE_COLUMN_DELETE
        : rRedl.IsMoved()
            ? STR_REDLINE_DELETE_MOVED
            : STR_REDLINE_DELETE;
@@ -344,7 +349,8 @@ void SwEditWin::RequestHelp(const HelpEvent &rEvt)
                                    ( bBalloon ? IsAttrAtPos::CurrAttrs : IsAttrAtPos::NONE) |
#endif
                                    IsAttrAtPos::TableBoxFml |
                                    IsAttrAtPos::TableRedline );
                                    IsAttrAtPos::TableRedline |
                                    IsAttrAtPos::TableColRedline );

        if( rSh.GetContentAtPos( aPos, aContentAtPos, false, &aFieldRect ) )
        {
@@ -454,13 +460,17 @@ void SwEditWin::RequestHelp(const HelpEvent &rEvt)
                break;

            case IsAttrAtPos::TableRedline:
            case IsAttrAtPos::TableColRedline:
            case IsAttrAtPos::Redline:
            {
                const bool bShowTrackChanges = IDocumentRedlineAccess::IsShowChanges( m_rView.GetDocShell()->GetDoc()->getIDocumentRedlineAccess().GetRedlineFlags() );
                const bool bShowInlineTooltips = rSh.GetViewOptions()->IsShowInlineTooltips();
                if ( bShowTrackChanges && bShowInlineTooltips )
                {
                     sText = lcl_GetRedlineHelp(*aContentAtPos.aFnd.pRedl, bBalloon, IsAttrAtPos::TableRedline == aContentAtPos.eContentAtPos );
                     sText = lcl_GetRedlineHelp(*aContentAtPos.aFnd.pRedl, bBalloon,
                         IsAttrAtPos::TableRedline == aContentAtPos.eContentAtPos ||
                         IsAttrAtPos::TableColRedline == aContentAtPos.eContentAtPos,
                         IsAttrAtPos::TableColRedline == aContentAtPos.eContentAtPos);
                }
                break;
            }
@@ -598,7 +608,7 @@ void SwEditWin::RequestHelp(const HelpEvent &rEvt)
                        {
                            aContentAtPos.eContentAtPos = IsAttrAtPos::Redline;
                            if( rSh.GetContentAtPos( aPos, aContentAtPos, false, &aFieldRect ) )
                                sText = lcl_GetRedlineHelp(*aContentAtPos.aFnd.pRedl, bBalloon, /*bTableChange=*/false);
                                sText = lcl_GetRedlineHelp(*aContentAtPos.aFnd.pRedl, bBalloon, /*bTableChange=*/false, /*bTableColChange=*/false);
                        }
                    }
                }