sw/source/uibase/inc/conttree.hxx              |    1 
 sw/source/uibase/utlui/content.cxx             |   39 +++++++++++++++++++++++++
 sw/uiconfig/swriter/ui/navigatorcontextmenu.ui |    9 +++++
 3 files changed, 49 insertions(+)

New commits:
commit b000d964fcc8849d10576bf3539bde7729db2eb1
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Sat Feb 5 21:27:33 2022 -0900
Commit:     Jim Raykowski <rayk...@gmail.com>
CommitDate: Fri Mar 25 23:18:18 2022 +0100

    tdf#142447 related: SwNavigator: Copy outlines
    
    Change-Id: Ibfc173ab6db3d9cbb1e8c59b515c40f1846f1e42
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129542
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>

diff --git a/sw/source/uibase/inc/conttree.hxx 
b/sw/source/uibase/inc/conttree.hxx
index 2de7dc54f1e2..9f595def2825 100644
--- a/sw/source/uibase/inc/conttree.hxx
+++ b/sw/source/uibase/inc/conttree.hxx
@@ -158,6 +158,7 @@ class SwContentTree final : public SfxListener
     void            ExecuteContextMenuAction(const OString& 
rSelectedPopupEntry);
 
     void DeleteOutlineSelections();
+    void CopyOutlineSelections();
 
     size_t GetEntryCount() const;
 
diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index c793f63740bc..619424701fb6 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -1426,6 +1426,7 @@ IMPL_LINK(SwContentTree, CommandHdl, const CommandEvent&, 
rCEvt, bool)
 
     bool bRemovePostItEntries = true;
     bool bRemoveIndexEntries = true;
+    bool bRemoveCopyEntry = true;
     bool bRemoveEditEntry = true;
     bool bRemoveUnprotectEntry = true;
     bool bRemoveDeleteEntry = true;
@@ -1569,6 +1570,7 @@ IMPL_LINK(SwContentTree, CommandHdl, const CommandEvent&, 
rCEvt, bool)
                     bRemoveSelectEntry = false;
                     bRemoveChapterEntries = false;
                 }
+                bRemoveCopyEntry = false;
             }
             else if (!bReadonly && (bEditable || bDeletable))
             {
@@ -1704,7 +1706,11 @@ IMPL_LINK(SwContentTree, CommandHdl, const 
CommandEvent&, rCEvt, bool)
             bRemoveSendOutlineEntry)
         xPop->remove("separator1");
 
+    if (bRemoveCopyEntry)
+        xPop->remove("copy");
+
     if (bRemoveGotoEntry &&
+            bRemoveCopyEntry &&
             bRemoveSelectEntry &&
             bRemoveDeleteEntry &&
             bRemoveChapterEntries &&
@@ -4053,6 +4059,8 @@ IMPL_LINK(SwContentTree, KeyInputHdl, const KeyEvent&, 
rEvent, bool)
                         ExecCommand("chapterup", !aCode.IsShift());
                     else if (aCode.GetCode() == KEY_DOWN)
                         ExecCommand("chapterdown", !aCode.IsShift());
+                    else if (aCode.GetCode() == KEY_C)
+                        CopyOutlineSelections();
                     else
                         bConsumed = false;
                 }
@@ -4168,6 +4176,11 @@ IMPL_LINK(SwContentTree, QueryTooltipHdl, const 
weld::TreeIter&, rEntry, OUStrin
 
 void SwContentTree::ExecuteContextMenuAction(const OString& 
rSelectedPopupEntry)
 {
+    if (rSelectedPopupEntry == "copy")
+    {
+        CopyOutlineSelections();
+        return;
+    }
     if (rSelectedPopupEntry == "collapseallcategories")
     {
         std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
@@ -4870,6 +4883,32 @@ static void lcl_AssureStdModeAtShell(SwWrtShell* 
pWrtShell)
         pWrtShell->EnterStdMode();
 }
 
+void SwContentTree::CopyOutlineSelections()
+{
+    m_pActiveShell->LockView(true);
+    {
+        MakeAllOutlineContentTemporarilyVisible a(m_pActiveShell->GetDoc());
+        lcl_AssureStdModeAtShell(m_pActiveShell);
+        m_pActiveShell->EnterAddMode();
+        size_t nCount = m_xTreeView->get_selected_rows().size();
+        m_xTreeView->selected_foreach([this, &nCount](weld::TreeIter& rEntry){
+            SwOutlineNodes::size_type nOutlinePos = 
reinterpret_cast<SwOutlineContent*>(
+                        
m_xTreeView->get_id(rEntry).toInt64())->GetOutlinePos();
+            m_pActiveShell->SttSelect();
+            m_pActiveShell->MakeOutlineSel(nOutlinePos, nOutlinePos,
+                                           
!m_xTreeView->get_row_expanded(rEntry), false);
+            // don't move if this is the last selected outline or the cursor 
is at start of para
+            if (--nCount && !m_pActiveShell->IsSttPara())
+                m_pActiveShell->Right(CRSR_SKIP_CHARS, true, 1, false);
+            m_pActiveShell->EndSelect();
+            return false;
+        });
+        m_pActiveShell->LeaveAddMode();
+        
m_pActiveShell->GetView().GetViewFrame()->GetBindings().Execute(SID_COPY);
+    }
+    m_pActiveShell->LockView(false);
+}
+
 void SwContentTree::GotoContent(const SwContent* pCnt)
 {
     m_nLastGotoContentWasOutlinePos = SwOutlineNodes::npos;
diff --git a/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui 
b/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui
index e39368556fed..d7619e643fd0 100644
--- a/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui
+++ b/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui
@@ -44,6 +44,15 @@
         <property name="use-underline">True</property>
       </object>
     </child>
+    <child>
+      <object class="GtkMenuItem" id="copy">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label" translatable="yes" 
context="navigatorcontextmenu|STR_COPY_ENTRY">_Copy</property>
+        <property name="use-underline">True</property>
+        <accelerator key="C" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+      </object>
+    </child>
     <child>
       <object class="GtkMenuItem" id="806">
         <property name="visible">True</property>

Reply via email to