sw/source/uibase/inc/conttree.hxx  |    1 
 sw/source/uibase/utlui/content.cxx |   87 ++++++++++++++++++++++++++++++++++---
 2 files changed, 82 insertions(+), 6 deletions(-)

New commits:
commit 26b64750ea15812de172985b50e6f22c2c71a60d
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Tue Dec 6 22:48:58 2022 -0900
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Dec 8 08:03:51 2022 +0000

    tdf#152029 Bring tables, frames, images, and ole objects to
    
    attention in the document view when the mouse pointer is over these
    content type and content entries in the Navigator content tree
    
    Change-Id: I9493203c2011a2f02fb6ddb6741992d43eaf4ddd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143763
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/source/uibase/inc/conttree.hxx 
b/sw/source/uibase/inc/conttree.hxx
index fc7f506b5128..03f331c2584f 100644
--- a/sw/source/uibase/inc/conttree.hxx
+++ b/sw/source/uibase/inc/conttree.hxx
@@ -137,6 +137,7 @@ class SwContentTree final : public SfxListener
     std::unique_ptr<sdr::overlay::OverlayObject> m_xOverlayObject;
 
     void BringHeadingsToAttention(const SwOutlineNodes& rOutlineNodesArr);
+    void BringFramesToAttention(const std::vector<const SwFrameFormat*>& 
rFrameFormats);
     void BringBookmarksToAttention(const std::vector<OUString>& rNames);
     void BringURLFieldsToAttention(const SwGetINetAttrs& rINetAttrsArr);
     void BringReferencesToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr);
diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index 7c4761bb365e..1033c63c84e3 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -1164,9 +1164,12 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
         {
             SwContent* pCnt = 
weld::fromId<SwContent*>(m_xTreeView->get_id(*xEntry));
             const ContentTypeId nType = pCnt->GetParent()->GetType();
-            bRemoveOverlayObject = nType != ContentTypeId::OUTLINE &&
-                    nType != ContentTypeId::BOOKMARK && nType != 
ContentTypeId::URLFIELD  &&
-                    nType != ContentTypeId::REFERENCE && nType != 
ContentTypeId::TEXTFIELD;
+            bRemoveOverlayObject =
+                    nType != ContentTypeId::OUTLINE && nType != 
ContentTypeId::TABLE &&
+                    nType != ContentTypeId::FRAME && nType != 
ContentTypeId::GRAPHIC &&
+                    nType != ContentTypeId::OLE && nType != 
ContentTypeId::BOOKMARK &&
+                    nType != ContentTypeId::URLFIELD && nType != 
ContentTypeId::REFERENCE &&
+                    nType != ContentTypeId::TEXTFIELD;
             if (!bRemoveOverlayObject && (rMEvt.IsEnterWindow() ||
                                 m_xTreeView->iter_compare(*xEntry, 
*m_xOverlayCompareEntry) != 0))
             {
@@ -1177,6 +1180,26 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                             
GetOutLineNds()[static_cast<SwOutlineContent*>(pCnt)->GetOutlinePos()]);
                     BringHeadingsToAttention(aOutlineNodes);
                 }
+                else if (nType == ContentTypeId::TABLE)
+                {
+                   if (const SwFrameFormats* pFrameFormats =
+                            m_pActiveShell->GetDoc()->GetTableFrameFormats())
+                        if (const SwFrameFormat* pFrameFormat =
+                                
pFrameFormats->FindFormatByName(pCnt->GetName()))
+                            BringFramesToAttention(std::vector<const 
SwFrameFormat*> {pFrameFormat});
+                }
+                else if (nType == ContentTypeId::FRAME || nType == 
ContentTypeId::GRAPHIC ||
+                         nType == ContentTypeId::OLE)
+                {
+                    SwNodeType eNodeType = SwNodeType::Text;
+                    if(nType == ContentTypeId::GRAPHIC)
+                        eNodeType = SwNodeType::Grf;
+                    else if(nType == ContentTypeId::OLE)
+                        eNodeType = SwNodeType::Ole;
+                    if (const SwFrameFormat* pFrameFormat =
+                            
m_pActiveShell->GetDoc()->FindFlyByName(pCnt->GetName(), eNodeType))
+                        BringFramesToAttention(std::vector<const 
SwFrameFormat*> {pFrameFormat});
+                }
                 else if (nType == ContentTypeId::BOOKMARK)
                 {
                     BringBookmarksToAttention(std::vector<OUString> 
{pCnt->GetName()});
@@ -1210,9 +1233,12 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
         {
             const ContentTypeId nType =
                     
weld::fromId<SwContentType*>(m_xTreeView->get_id(*xEntry))->GetType();
-            bRemoveOverlayObject = nType != ContentTypeId::OUTLINE &&
-                    nType != ContentTypeId::BOOKMARK && nType != 
ContentTypeId::URLFIELD  &&
-                    nType != ContentTypeId::REFERENCE && nType != 
ContentTypeId::TEXTFIELD;
+            bRemoveOverlayObject =
+                    nType != ContentTypeId::OUTLINE && nType != 
ContentTypeId::TABLE &&
+                    nType != ContentTypeId::FRAME && nType != 
ContentTypeId::GRAPHIC &&
+                    nType != ContentTypeId::OLE && nType != 
ContentTypeId::BOOKMARK &&
+                    nType != ContentTypeId::URLFIELD && nType != 
ContentTypeId::REFERENCE &&
+                    nType != ContentTypeId::TEXTFIELD;
             if (!bRemoveOverlayObject && (rMEvt.IsEnterWindow() ||
                                 m_xTreeView->iter_compare(*xEntry, 
*m_xOverlayCompareEntry) != 0))
             {
@@ -1220,6 +1246,38 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                 {
                     
BringHeadingsToAttention(m_pActiveShell->GetNodes().GetOutLineNds());
                 }
+                else if (nType == ContentTypeId::TABLE)
+                {
+                    std::vector<const SwFrameFormat*> aTableFormatsArr;
+                    const size_t nCount = 
m_pActiveShell->GetTableFrameFormatCount(true);
+                    const SwFrameFormats* pFrameFormats =
+                            m_pActiveShell->GetDoc()->GetTableFrameFormats();
+                    SwAutoFormatGetDocNode aGetHt(&m_pActiveShell->GetNodes());
+                    for(size_t n = 0, i = 0; i < nCount + n; ++i)
+                    {
+                        if (const SwTableFormat* pTableFormat =
+                                
static_cast<SwTableFormat*>(pFrameFormats->GetFormat(i)))
+                        {
+                            if (pTableFormat->GetInfo(aGetHt))  // skip 
deleted tables
+                            {
+                                n++;
+                                continue;
+                            }
+                            aTableFormatsArr.push_back(pTableFormat);
+                        }
+                    }
+                    BringFramesToAttention(aTableFormatsArr);
+                }
+                else if (nType == ContentTypeId::FRAME ||  nType == 
ContentTypeId::GRAPHIC ||
+                         nType == ContentTypeId::OLE)
+                {
+                        FlyCntType eType = FLYCNTTYPE_FRM;
+                        if(nType == ContentTypeId::GRAPHIC)
+                            eType = FLYCNTTYPE_GRF;
+                        else if(nType == ContentTypeId::OLE)
+                            eType = FLYCNTTYPE_OLE;
+                        
BringFramesToAttention(m_pActiveShell->GetFlyFrameFormats(eType, true));
+                }
                 else if (nType == ContentTypeId::BOOKMARK)
                 {
                     Reference<frame::XModel> xModel =
@@ -5623,6 +5681,23 @@ void SwContentTree::BringHeadingsToAttention(const 
SwOutlineNodes& rOutlineNodes
     m_aOverlayObjectDelayTimer.Start();
 }
 
+void SwContentTree::BringFramesToAttention(const std::vector<const 
SwFrameFormat*>& rFrameFormats)
+{
+    std::vector<basegfx::B2DRange> aRanges;
+    for (const SwFrameFormat* pFrameFormat : rFrameFormats)
+    {
+        SwRect aFrameRect = pFrameFormat->FindLayoutRect();
+        aRanges.emplace_back(aFrameRect.Left(), aFrameRect.Top(),
+                             aFrameRect.Right(), aFrameRect.Bottom());
+    }
+    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
+        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
+    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
+                                                              Color(), 
std::move(aRanges),
+                                                              true /*unused 
for Invert type*/));
+    m_aOverlayObjectDelayTimer.Start();
+}
+
 void SwContentTree::BringBookmarksToAttention(const std::vector<OUString>& 
rNames)
 {
     std::vector<basegfx::B2DRange> aRanges;

Reply via email to