sw/source/uibase/utlui/content.cxx             |  109 +++++++++++++++++++++++--
 sw/uiconfig/swriter/ui/navigatorcontextmenu.ui |   35 ++++++++
 2 files changed, 136 insertions(+), 8 deletions(-)

New commits:
commit b2b84dfa1d4f5da32f3335c59d618d385173a170
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Sun Apr 21 19:23:34 2024 -0800
Commit:     Jim Raykowski <rayk...@gmail.com>
CommitDate: Thu Apr 25 05:38:42 2024 +0200

    tdf#160598 SwNavigator enhancement to delete footnotes/endnotes
    
    m_bDocHasChanged is checked first in the tooltip and mouse move handlers
    to prevent crashes/asserts that happen when SfxPoolItemHolder m_aAttr
    references a delete poolitem or poolitem data. Without this check the
    following types of crashes/asserts can happen:
    
    ----
    
    Unspecified Application Error
    
    Fatal exception: Signal 6
    Stack:
    0 sal::backtrace_get(unsigned int) at /home/lo/Dev/LO1/core/sal/osl/
    unx/backtraceapi.cxx:42 (discriminator 3)
    1 (anonymous namespace)::printStack(int) at /home/lo/Dev/LO1/core/sal/
    osl/unx/signal.cxx:289
    2 (anonymous namespace)::callSystemHandler(int, siginfo_t*, void*) at /
    home/lo/Dev/LO1/core/sal/osl/unx/signal.cxx:330
    3 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*)
    at /home/lo/Dev/LO1/core/sal/osl/unx/signal.cxx:427
    4 __restore_rt at libc_sigaction.c:?
    5 __pthread_kill_implementation at ./nptl/pthread_kill.c:44
    6 __GI_raise at ./signal/../sysdeps/posix/raise.c:27
    7 __GI_abort at ./stdlib/abort.c:81 (discriminator 21)
    8 SalAbort(rtl::OUString const&, bool) at /home/lo/Dev/LO1/core/vcl/
    source/app/salplug.cxx:412
    9 Application::Abort(rtl::OUString const&) at /home/lo/Dev/LO1/core/
    vcl/source/app/svapp.cxx:316
    10 desktop::Desktop::Exception(ExceptionCategory) at /home/lo/Dev/LO1/
    core/desktop/source/app/app.cxx:1203 (discriminator 2)
    11 VCLExceptionSignal_impl(void*, oslSignalInfo*) at /home/lo/Dev/LO1/
    core/vcl/source/app/svmain.cxx:176
    12 callSignalHandler(oslSignalInfo*) at /home/lo/Dev/LO1/core/sal/osl/
    all/signalshared.cxx:47
    13 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*)
    at /home/lo/Dev/LO1/core/sal/osl/unx/signal.cxx:423
    14 __restore_rt at libc_sigaction.c:?
    15 SfxPoolItem::Which() const at /home/lo/Dev/LO1/core/include/svl/
    poolitem.hxx:225
    16 SfxPoolItemHolder::Which() const at /home/lo/Dev/LO1/core/include/
    svl/itemset.hxx:74 (discriminator 1)
    17 SwTextAttr::GetFootnote() const at /home/lo/Dev/LO1/core/sw/inc/
    txatbase.hxx:223 (discriminator 1)
    18 SwContentTree::QueryTooltipHdl(weld::TreeIter const&) at /home/lo/
    Dev/LO1/core/sw/source/uibase/utlui/content.cxx:4974
    19 SwContentTree::LinkStubQueryTooltipHdl(void*, weld::TreeIter const&)
    at /home/lo/Dev/LO1/core/sw/source/uibase/utlui/content.cxx:4895
    20 Link<weld::TreeIter const&, rtl::OUString>::Call(weld::TreeIter
    const&) const at /home/lo/Dev/LO1/core/include/tools/link.hxx:111
    21 weld::TreeView::signal_query_tooltip(weld::TreeIter const&) at /
    home/lo/Dev/LO1/core/include/vcl/weld.hxx:977
    22 SalInstanceTreeView::TooltipHdl(SvTreeListEntry*) at /home/lo/Dev/
    LO1/core/vcl/source/app/salvtables.cxx:5154
    23 SalInstanceTreeView::LinkStubTooltipHdl(void*, SvTreeListEntry*) at
    /home/lo/Dev/LO1/core/vcl/source/app/salvtables.cxx:5151
    24 Link<SvTreeListEntry*, rtl::OUString>::Call(SvTreeListEntry*) const
    at /home/lo/Dev/LO1/core/include/tools/link.hxx:111
    25 SvTreeListBox::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/
    core/vcl/source/treelist/treelistbox.cxx:3284
    26 ImplHandleMouseHelpRequest(vcl::Window*, Point const&) at /home/lo/
    Dev/LO1/core/vcl/source/window/winproc.cxx:186
    27 ImplHandleMouseEvent(VclPtr<vcl::Window> const&, NotifyEventType,
    bool, long, long, unsigned long, unsigned short, MouseEventModifiers) at
    /home/lo/Dev/LO1/core/vcl/source/window/winproc.cxx:740
    28 ImplHandleSalMouseMove(vcl::Window*, SalMouseEvent const*) at /home/
    lo/Dev/LO1/core/vcl/source/window/winproc.cxx:2332
    29 ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) at /home/
    lo/Dev/LO1/core/vcl/source/window/winproc.cxx:2665 (discriminator 1)
    30 SalFrame::CallCallback(SalEvent, void const*) const at /home/lo/Dev/
    LO1/core/vcl/inc/salframe.hxx:312 (discriminator 1)
    31 QtFrame::CallCallback(SalEvent, void const*) const at /home/lo/Dev/
    LO1/core/vcl/inc/qt5/QtFrame.hxx:228
    32 QtWidget::mouseMoveEvent(QMouseEvent*) at /home/lo/Dev/LO1/core/vcl/
    qt5/QtWidget.cxx:202
    33 QWidget::event(QEvent*) in /lib/x86_64-linux-gnu/libQt5Widgets.so.5
    34 QtWidget::event(QEvent*) at /home/lo/Dev/LO1/core/vcl/qt5/
    QtWidget.cxx:738 (discriminator 2)
    35 QApplicationPrivate::notify_helper(QObject*, QEvent*) in /lib/
    x86_64-linux-gnu/libQt5Widgets.so.5
    36 QApplication::notify(QObject*, QEvent*) in /lib/x86_64-linux-gnu/
    libQt5Widgets.so.5
    37 QCoreApplication::notifyInternal2(QObject*, QEvent*) in /lib/x86_64-
    linux-gnu/libQt5Core.so.5
    38 QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*,
    QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool, bool) in /lib/
    x86_64-linux-gnu/libQt5Widgets.so.5
    39 QDesktopWidget::qt_metacall(QMetaObject::Call, int, void**) in /lib/
    x86_64-linux-gnu/libQt5Widgets.so.5
    40 QDesktopWidget::qt_metacall(QMetaObject::Call, int, void**) in /lib/
    x86_64-linux-gnu/libQt5Widgets.so.5
    41 QApplicationPrivate::notify_helper(QObject*, QEvent*) in /lib/
    x86_64-linux-gnu/libQt5Widgets.so.5
    42 QCoreApplication::notifyInternal2(QObject*, QEvent*) in /lib/x86_64-
    linux-gnu/libQt5Core.so.5
    43
    
QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*)
    in /lib/x86_64-linux-gnu/libQt5Gui.so.5
    44
    
QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>)
    in /lib/x86_64-linux-gnu/libQt5Gui.so.5
    45 QXcbNativeInterface::dumpNativeWindows(unsigned long long) const in
    /lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
    46 g_main_context_dispatch in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    48 g_main_context_iteration in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    49
    QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
    in /lib/x86_64-linux-gnu/libQt5Core.so.5
    50 QtInstance::ImplYield(bool, bool) at /home/lo/Dev/LO1/core/vcl/qt5/
    QtInstance.cxx:453
    51 QtInstance::DoYield(bool, bool) at /home/lo/Dev/LO1/core/vcl/qt5/
    QtInstance.cxx:464
    52 ImplYield(bool, bool) at /home/lo/Dev/LO1/core/vcl/source/app/
    svapp.cxx:395
    53 Application::Yield() at /home/lo/Dev/LO1/core/vcl/source/app/
    svapp.cxx:483
    54 Application::Execute() at /home/lo/Dev/LO1/core/vcl/source/app/
    svapp.cxx:370
    55 desktop::Desktop::Main() at /home/lo/Dev/LO1/core/desktop/source/
    app/app.cxx:1617
    56 ImplSVMain() at /home/lo/Dev/LO1/core/vcl/source/app/svmain.cxx:229
    57 SVMain() at /home/lo/Dev/LO1/core/vcl/source/app/svmain.cxx:262
    58 soffice_main at /home/lo/Dev/LO1/core/desktop/source/app/
    sofficemain.cxx:93
    59 sal_main at /home/lo/Dev/LO1/core/desktop/source/app/main.c:51
    60 main at /home/lo/Dev/LO1/core/desktop/source/app/main.c:49
    61 __libc_start_call_main at ./csu/../sysdeps/nptl/
    libc_start_call_main.h:58
    62 call_init at ./csu/../csu/libc-start.c:128
    63 _start in /home/lo/Dev/LO1/core/instdir/program/soffice.bin
    
    ----
    
    soffice.bin: /home/lo/Dev/LO1/core/sw/inc/txatbase.hxx:223: const
    SwFormatFootnote& SwTextAttr::GetFootnote() const: Assertion `m_aAttr
    && m_aAttr.Which() == RES_TXTATR_FTN' failed.
    
    Fatal exception: Signal 6
    Stack:
    0 sal::backtrace_get(unsigned int) at /home/lo/Dev/LO1/core/sal/osl/
    unx/backtraceapi.cxx:42 (discriminator 3)
    1 (anonymous namespace)::printStack(int) at /home/lo/Dev/LO1/core/sal/
    osl/unx/signal.cxx:289
    2 (anonymous namespace)::callSystemHandler(int, siginfo_t*, void*) at /
    home/lo/Dev/LO1/core/sal/osl/unx/signal.cxx:330
    3 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*)
    at /home/lo/Dev/LO1/core/sal/osl/unx/signal.cxx:427
    4 __restore_rt at libc_sigaction.c:?
    5 __pthread_kill_implementation at ./nptl/pthread_kill.c:44
    6 __GI_raise at ./signal/../sysdeps/posix/raise.c:27
    7 __GI_abort at ./stdlib/abort.c:81 (discriminator 21)
    8 _nl_load_domain at ./intl/loadmsgcat.c:1177
    9 __GI___assert_fail at :?
    10 SwTextAttr::GetFootnote() const at /home/lo/Dev/LO1/core/sw/inc/
    txatbase.hxx:224
    11 SwContentTree::QueryTooltipHdl(weld::TreeIter const&) at /home/lo/
    Dev/LO1/core/sw/source/uibase/utlui/content.cxx:4974
    12 SwContentTree::LinkStubQueryTooltipHdl(void*, weld::TreeIter const&)
    at /home/lo/Dev/LO1/core/sw/source/uibase/utlui/content.cxx:4895
    13 Link<weld::TreeIter const&, rtl::OUString>::Call(weld::TreeIter
    const&) const at /home/lo/Dev/LO1/core/include/tools/link.hxx:111
    14 weld::TreeView::signal_query_tooltip(weld::TreeIter const&) at /
    home/lo/Dev/LO1/core/include/vcl/weld.hxx:977
    15 (anonymous
    namespace)::GtkInstanceTreeView::signalQueryTooltip(_GtkWidget*, int,
    int, int, _GtkTooltip*, void*) at /home/lo/Dev/LO1/core/vcl/unx/gtk3/
    gtkinst.cxx:14701 (discriminator 2)
    16 gtk_socket_add_id in /lib/x86_64-linux-gnu/libgtk-3.so.0
    17 g_closure_invoke in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    18 g_signal_handlers_destroy in /lib/x86_64-linux-gnu/
    libgobject-2.0.so.0
    19 g_signal_emit_valist in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    20 g_signal_emit in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    21 gtk_tooltip_set_icon_from_gicon in /lib/x86_64-linux-gnu/
    libgtk-3.so.0
    22 gtk_tooltip_set_icon_from_gicon in /lib/x86_64-linux-gnu/
    libgtk-3.so.0
    23 gtk_main_do_event in /lib/x86_64-linux-gnu/libgtk-3.so.0
    24 gdk_drawing_context_get_clip in /lib/x86_64-linux-gnu/libgdk-3.so.0
    25 gdk_x11_drag_context_get_type in /lib/x86_64-linux-gnu/libgdk-3.so.0
    26 g_main_context_dispatch in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    27 g_io_channel_new_file in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    28 g_main_loop_run in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    29 main_loop_run(_GMainLoop*) at /home/lo/Dev/LO1/core/vcl/inc/unx/gtk/
    gtkdata.hxx:63
    30 (anonymous namespace)::DialogRunner::run() at /home/lo/Dev/LO1/core/
    vcl/unx/gtk3/gtkinst.cxx:6747 (discriminator 13)
    31 (anonymous namespace)::GtkInstanceDialog::run() at /home/lo/Dev/LO1/
    core/vcl/unx/gtk3/gtkinst.cxx:10046
    32 weld::DialogController::run() at /home/lo/Dev/LO1/core/include/vcl/
    weld.hxx:2669
    33 (anonymous namespace)::RecoveryUI::impl_doEmergencySave() at /home/
    lo/Dev/LO1/core/svx/source/unodraw/recoveryui.cxx:258 (discriminator 1)
    34 (anonymous
    namespace)::RecoveryUI::dispatchWithReturnValue(com::sun::star::util::URL
    const&,
    com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>
    const&) at /home/lo/Dev/LO1/core/svx/source/unodraw/recoveryui.cxx:148
    35 desktop::(anonymous namespace)::impl_callRecoveryUI(bool, bool) at /
    home/lo/Dev/LO1/core/desktop/source/app/app.cxx:1022 (discriminator 5)
    36 desktop::Desktop::Exception(ExceptionCategory) at /home/lo/Dev/LO1/
    core/desktop/source/app/app.cxx:1177
    37 VCLExceptionSignal_impl(void*, oslSignalInfo*) at /home/lo/Dev/LO1/
    core/vcl/source/app/svmain.cxx:176
    38 callSignalHandler(oslSignalInfo*) at /home/lo/Dev/LO1/core/sal/osl/
    all/signalshared.cxx:47
    39 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*)
    at /home/lo/Dev/LO1/core/sal/osl/unx/signal.cxx:423
    40 __restore_rt at libc_sigaction.c:?
    41 SfxPoolItem::Which() const at /home/lo/Dev/LO1/core/include/svl/
    poolitem.hxx:225
    42 SfxPoolItemHolder::Which() const at /home/lo/Dev/LO1/core/include/
    svl/itemset.hxx:74 (discriminator 1)
    43 SwTextAttr::GetFootnote() const at /home/lo/Dev/LO1/core/sw/inc/
    txatbase.hxx:223 (discriminator 1)
    44 SwContentTree::QueryTooltipHdl(weld::TreeIter const&) at /home/lo/
    Dev/LO1/core/sw/source/uibase/utlui/content.cxx:4974
    45 SwContentTree::LinkStubQueryTooltipHdl(void*, weld::TreeIter const&)
    at /home/lo/Dev/LO1/core/sw/source/uibase/utlui/content.cxx:4895
    46 Link<weld::TreeIter const&, rtl::OUString>::Call(weld::TreeIter
    const&) const at /home/lo/Dev/LO1/core/include/tools/link.hxx:111
    47 weld::TreeView::signal_query_tooltip(weld::TreeIter const&) at /
    home/lo/Dev/LO1/core/include/vcl/weld.hxx:977
    48 (anonymous
    namespace)::GtkInstanceTreeView::signalQueryTooltip(_GtkWidget*, int,
    int, int, _GtkTooltip*, void*) at /home/lo/Dev/LO1/core/vcl/unx/gtk3/
    gtkinst.cxx:14701 (discriminator 2)
    49 gtk_socket_add_id in /lib/x86_64-linux-gnu/libgtk-3.so.0
    50 g_closure_invoke in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    51 g_signal_handlers_destroy in /lib/x86_64-linux-gnu/
    libgobject-2.0.so.0
    52 g_signal_emit_valist in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    53 g_signal_emit in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    54 gtk_tooltip_set_icon_from_gicon in /lib/x86_64-linux-gnu/
    libgtk-3.so.0
    55 gtk_tooltip_set_icon_from_gicon in /lib/x86_64-linux-gnu/
    libgtk-3.so.0
    56 gtk_tooltip_trigger_tooltip_query in /lib/x86_64-linux-gnu/
    libgtk-3.so.0
    57 GtkSalFrame::ShowTooltip(rtl::OUString const&, tools::Rectangle
    const&) at /home/lo/Dev/LO1/core/vcl/unx/gtk3/gtkframe.cxx:3154
    58 ImplShowHelpWindow(vcl::Window*, unsigned short, QuickHelpFlags,
    rtl::OUString const&, Point const&, tools::Rectangle const&) at /home/
    lo/Dev/LO1/core/vcl/source/app/help.cxx:492
    59 Help::ShowQuickHelp(vcl::Window*, tools::Rectangle const&,
    rtl::OUString const&, QuickHelpFlags) at /home/lo/Dev/LO1/core/vcl/
    source/app/help.cxx:191 (discriminator 5)
    60 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    61 ImplBorderWindow::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/
    core/vcl/source/window/brdwin.cxx:1673
    62 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    63 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    64 ImplBorderWindow::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/
    core/vcl/source/window/brdwin.cxx:1673
    65 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    66 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    67 SplitWindow::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/splitwin.cxx:2117
    68 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    69 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    70 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    71 vcl::Window::RequestHelp(HelpEvent const&) at /home/lo/Dev/LO1/core/
    vcl/source/window/window.cxx:1928
    72 ImplHandleMouseHelpRequest(vcl::Window*, Point const&) at /home/lo/
    Dev/LO1/core/vcl/source/window/winproc.cxx:186
    73 ImplHandleMouseEvent(VclPtr<vcl::Window> const&, NotifyEventType,
    bool, long, long, unsigned long, unsigned short, MouseEventModifiers) at
    /home/lo/Dev/LO1/core/vcl/source/window/winproc.cxx:740
    74 ImplHandleSalMouseMove(vcl::Window*, SalMouseEvent const*) at /home/
    lo/Dev/LO1/core/vcl/source/window/winproc.cxx:2332
    75 ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) at /home/
    lo/Dev/LO1/core/vcl/source/window/winproc.cxx:2665 (discriminator 1)
    76 SalFrame::CallCallback(SalEvent, void const*) const at /home/lo/Dev/
    LO1/core/vcl/inc/salframe.hxx:312 (discriminator 1)
    77 GtkSalFrame::CallCallbackExc(SalEvent, void const*) const at /home/
    lo/Dev/LO1/core/vcl/unx/gtk3/gtkframe.cxx:6388
    78 GtkSalFrame::DrawingAreaMotion(int, int, unsigned int, unsigned int)
    at /home/lo/Dev/LO1/core/vcl/unx/gtk3/gtkframe.cxx:3719
    79 GtkSalFrame::signalMotion(_GtkWidget*, _GdkEventMotion*, void*) at /
    home/lo/Dev/LO1/core/vcl/unx/gtk3/gtkframe.cxx:3756
    80 gtk_socket_add_id in /lib/x86_64-linux-gnu/libgtk-3.so.0
    81 g_closure_invoke in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    82 g_signal_handlers_destroy in /lib/x86_64-linux-gnu/
    libgobject-2.0.so.0
    83 g_signal_emit_valist in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    84 g_signal_emit in /lib/x86_64-linux-gnu/libgobject-2.0.so.0
    85 gtk_widget_init_template in /lib/x86_64-linux-gnu/libgtk-3.so.0
    86 gtk_grab_remove in /lib/x86_64-linux-gnu/libgtk-3.so.0
    87 gtk_main_do_event in /lib/x86_64-linux-gnu/libgtk-3.so.0
    88 gdk_drawing_context_get_clip in /lib/x86_64-linux-gnu/libgdk-3.so.0
    89 gdk_x11_drag_context_get_type in /lib/x86_64-linux-gnu/libgdk-3.so.0
    90 g_main_context_dispatch in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    91 g_io_channel_new_file in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    92 g_main_context_iteration in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    93 GtkSalData::Yield(bool, bool) at /home/lo/Dev/LO1/core/vcl/unx/gtk3/
    gtkdata.cxx:405 (discriminator 6)
    94 GtkInstance::DoYield(bool, bool) at /home/lo/Dev/LO1/core/vcl/unx/
    gtk3/gtkinst.cxx:436
    95 ImplYield(bool, bool) at /home/lo/Dev/LO1/core/vcl/source/app/
    svapp.cxx:395
    96 Application::Yield() at /home/lo/Dev/LO1/core/vcl/source/app/
    svapp.cxx:483
    97 Application::Execute() at /home/lo/Dev/LO1/core/vcl/source/app/
    svapp.cxx:370
    98 desktop::Desktop::Main() at /home/lo/Dev/LO1/core/desktop/source/
    app/app.cxx:1617
    99 ImplSVMain() at /home/lo/Dev/LO1/core/vcl/source/app/svmain.cxx:229
    100 SVMain() at /home/lo/Dev/LO1/core/vcl/source/app/svmain.cxx:262
    101 soffice_main at /home/lo/Dev/LO1/core/desktop/source/app/
    sofficemain.cxx:93
    102 sal_main at /home/lo/Dev/LO1/core/desktop/source/app/main.c:51
    103 main at /home/lo/Dev/LO1/core/desktop/source/app/main.c:49
    104 __libc_start_call_main at ./csu/../sysdeps/nptl/
    libc_start_call_main.h:58
    105 call_init at ./csu/../csu/libc-start.c:128
    106 _start in /home/lo/Dev/LO1/core/instdir/program/soffice.bin
    
    Change-Id: Id2bad55221a8603a1e12f870bdc1479e7709ee58
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166414
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>

diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index a7e3ff3c9289..f9776b3b2135 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -403,7 +403,7 @@ SwContentType::SwContentType(SwWrtShell* pShell, 
ContentTypeId nType, sal_uInt8
         case ContentTypeId::FOOTNOTE:
         case ContentTypeId::ENDNOTE:
             m_bEdit = true;
-            m_bDelete = false;
+            m_bDelete = true;
         break;
         case ContentTypeId::BOOKMARK:
         {
@@ -1198,6 +1198,11 @@ IMPL_LINK(SwContentTree, MousePressHdl, const 
MouseEvent&, rMEvt, bool)
 
 IMPL_LINK(SwContentTree, MouseMoveHdl, const MouseEvent&, rMEvt, bool)
 {
+    // Prevent trying to bring entry to attention when handling document 
change. The mouse over
+    // entry might not be valid, for example, when the mouse pointer is on an 
entry that is deleted
+    // in the document by an undo/redo.
+    if (m_bDocHasChanged)
+        return false;
     if (m_eState == State::HIDDEN)
         return false;
     if (std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator());
@@ -1703,7 +1708,11 @@ IMPL_LINK(SwContentTree, CommandHdl, const 
CommandEvent&, rCEvt, bool)
          bRemoveDeleteIndexEntry= true,
          bRemoveDeleteCommentEntry = true,
          bRemoveDeleteDrawingObjectEntry = true,
-         bRemoveDeleteFieldEntry = true;
+         bRemoveDeleteFieldEntry = true,
+         bRemoveDeleteAllFootnotesEntry = true,
+         bRemoveDeleteAllEndnotesEntry = true,
+         bRemoveDeleteFootnoteEntry = true,
+         bRemoveDeleteEndnoteEntry = true;
     bool bRemoveRenameEntry = true;
     bool bRemoveSelectEntry = true;
     bool bRemoveToggleExpandEntry = true;
@@ -1878,6 +1887,12 @@ IMPL_LINK(SwContentTree, CommandHdl, const 
CommandEvent&, rCEvt, bool)
                     case ContentTypeId::TEXTFIELD:
                         bRemoveDeleteFieldEntry = false;
                     break;
+                    case ContentTypeId::FOOTNOTE:
+                        bRemoveDeleteFootnoteEntry = false;
+                    break;
+                    case ContentTypeId::ENDNOTE:
+                        bRemoveDeleteEndnoteEntry = false;
+                    break;
                     default: break;
                 }
             }
@@ -1958,10 +1973,17 @@ IMPL_LINK(SwContentTree, CommandHdl, const 
CommandEvent&, rCEvt, bool)
                 bRemoveToggleExpandEntry
                     = lcl_InsertExpandCollapseAllItem(*m_xTreeView, *xEntry, 
*xPop);
             }
-            else if (State::HIDDEN != m_eState && nContentType == 
ContentTypeId::POSTIT
+            else if (State::HIDDEN != m_eState
                      && !m_pActiveShell->GetView().GetDocShell()->IsReadOnly()
                      && pType->GetMemberCount() > 0)
-                bRemovePostItEntries = false;
+            {
+                if (nContentType == ContentTypeId::POSTIT)
+                    bRemovePostItEntries = false;
+                else if (nContentType == ContentTypeId::FOOTNOTE)
+                    bRemoveDeleteAllFootnotesEntry = false;
+                else if (nContentType == ContentTypeId::ENDNOTE)
+                    bRemoveDeleteAllEndnotesEntry = false;
+            }
         }
     }
 
@@ -2018,7 +2040,16 @@ IMPL_LINK(SwContentTree, CommandHdl, const 
CommandEvent&, rCEvt, bool)
         xPop->remove("deletedrawingobject");
     if (bRemoveDeleteFieldEntry)
         xPop->remove("deletefield");
-
+    if (bRemoveDeleteAllFootnotesEntry)
+        xPop->remove("deleteallfootnotes");
+    if (bRemoveDeleteAllEndnotesEntry)
+        xPop->remove("deleteallendnotes");
+    if (bRemoveDeleteFootnoteEntry)
+        xPop->remove("deletefootnote");
+    if (bRemoveDeleteEndnoteEntry)
+        xPop->remove("deleteendnote");
+
+    // bRemoveDeleteEntry is used in determining seperator 2
     bool bRemoveDeleteEntry =
             bRemoveDeleteChapterEntry &&
             bRemoveDeleteTableEntry &&
@@ -2032,7 +2063,11 @@ IMPL_LINK(SwContentTree, CommandHdl, const 
CommandEvent&, rCEvt, bool)
             bRemoveDeleteIndexEntry &&
             bRemoveDeleteCommentEntry &&
             bRemoveDeleteDrawingObjectEntry &&
-            bRemoveDeleteFieldEntry;
+            bRemoveDeleteFieldEntry &&
+            bRemoveDeleteAllFootnotesEntry &&
+            bRemoveDeleteAllEndnotesEntry &&
+            bRemoveDeleteFootnoteEntry &&
+            bRemoveDeleteEndnoteEntry;
 
     if (bRemoveRenameEntry)
         xPop->remove(OUString::number(502));
@@ -4864,6 +4899,13 @@ IMPL_LINK(SwContentTree, KeyInputHdl, const KeyEvent&, 
rEvent, bool)
 
 IMPL_LINK(SwContentTree, QueryTooltipHdl, const weld::TreeIter&, rEntry, 
OUString)
 {
+    // Prevent tool tip handling when handling document change. The entry that 
was present when
+    // the tooltip signal was fired might no longer be valid by the time it 
gets here. For example,
+    // when the mouse pointer is on an entry in the tree that is deleted in 
the document by an
+    // undo/redo. Please see similar note in MouseMoveHdl.
+    if (m_bDocHasChanged)
+        return OUString();
+
     ContentTypeId nType;
     bool bContent = false;
     void* pUserData = weld::fromId<void*>(m_xTreeView->get_id(rEntry));
@@ -5008,6 +5050,51 @@ void SwContentTree::ExecuteContextMenuAction(const 
OUString& rSelectedPopupEntry
     if (!m_xTreeView->get_selected(xFirst.get()))
         return; // this shouldn't happen, but better to be safe than ...
 
+    if (rSelectedPopupEntry == "deleteallfootnotes" || rSelectedPopupEntry == 
"deleteallendnotes")
+    {
+        if (!lcl_IsContentType(*xFirst, *m_xTreeView))
+            return;
+
+        //MakeAllOutlineContentTemporarilyVisible a(m_pActiveShell->GetDoc());
+
+        m_pActiveShell->AssureStdMode();
+
+        SwCursor* pCursor = m_pActiveShell->getShellCursor(true);
+
+        SwContentType* pCntType = 
weld::fromId<SwContentType*>(m_xTreeView->get_id(*xFirst));
+        const auto nCount = pCntType->GetMemberCount();
+
+        m_pActiveShell->StartAction();
+        m_pActiveShell->EnterAddMode();
+        for (size_t i = 0; i < nCount; i++)
+        {
+            const SwTextFootnoteContent* pTextFootnoteCnt =
+                    static_cast<const 
SwTextFootnoteContent*>(pCntType->GetMember(i));
+            if (pTextFootnoteCnt && !pTextFootnoteCnt->IsInvisible())
+            {
+                if (const SwTextAttr* pTextAttr = 
pTextFootnoteCnt->GetTextFootnote())
+                {
+                    const SwTextFootnote* pTextFootnote = 
pTextAttr->GetFootnote().GetTextFootnote();
+                    if (!pTextFootnote)
+                        continue;
+                    const SwTextNode& rTextNode = pTextFootnote->GetTextNode();
+                    auto nStart = pTextAttr->GetStart();
+                    pCursor->GetPoint()->Assign(rTextNode, nStart + 1);
+                    m_pActiveShell->SetMark();
+                    m_pActiveShell->SttSelect();
+                    pCursor->GetPoint()->Assign(rTextNode, nStart);
+                    m_pActiveShell->EndSelect();
+                }
+            }
+        }
+        m_pActiveShell->LeaveAddMode();
+        m_pActiveShell->EndAction();
+
+        m_pActiveShell->DelRight();
+
+        return;
+    }
+
     if (rSelectedPopupEntry == "protectsection" || rSelectedPopupEntry == 
"hidesection")
     {
         SwRegionContent* pCnt = 
weld::fromId<SwRegionContent*>(m_xTreeView->get_id(*xFirst));
@@ -5055,7 +5142,9 @@ void SwContentTree::ExecuteContextMenuAction(const 
OUString& rSelectedPopupEntry
              rSelectedPopupEntry == "deleteindex" ||
              rSelectedPopupEntry == "deletecomment" ||
              rSelectedPopupEntry == "deletedrawingobject" ||
-             rSelectedPopupEntry == "deletefield")
+             rSelectedPopupEntry == "deletefield" ||
+             rSelectedPopupEntry == "deletefootnote" ||
+             rSelectedPopupEntry == "deleteendnote")
     {
         EditEntry(*xFirst, EditEntryMode::DELETE);
         return;
@@ -5701,8 +5790,12 @@ void SwContentTree::EditEntry(const weld::TreeIter& 
rEntry, EditEntryMode nMode)
         break;
         case ContentTypeId::FOOTNOTE:
         case ContentTypeId::ENDNOTE:
-            if (EditEntryMode::EDIT == nMode)
+        {
+            if (nMode == EditEntryMode::DELETE)
+                m_pActiveShell->DelRight();
+            else if (EditEntryMode::EDIT == nMode)
                 nSlot = FN_FORMAT_FOOTNOTE_DLG;
+        }
         break;
         default: break;
     }
diff --git a/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui 
b/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui
index d4ab2d105bfa..266e388d8549 100644
--- a/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui
+++ b/sw/uiconfig/swriter/ui/navigatorcontextmenu.ui
@@ -245,6 +245,41 @@
         <accelerator key="Delete" signal="activate"/>
       </object>
     </child>
+    <child>
+      <object class="GtkMenuItem" id="deleteallfootnotes">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label" translatable="yes" 
context="navigatorcontextmenu|STR_DELETE_ALL_FOOTNOTES">Delete All 
Footnotes</property>
+        <accelerator key="Delete" signal="activate"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="deleteallendnotes">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label" translatable="yes" 
context="navigatorcontextmenu|STR_DELETE_ALL_ENDNOTES">Delete All 
Endnotes</property>
+        <property name="use-underline">True</property>
+        <accelerator key="Delete" signal="activate"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="deletefootnote">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label" translatable="yes" 
context="navigatorcontextmenu|STR_DELETE_FOOTNOTE">Delete Footnote</property>
+        <property name="use-underline">True</property>
+        <accelerator key="Delete" signal="activate"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="deleteendnote">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label" translatable="yes" 
context="navigatorcontextmenu|STR_DELETE_ENDNOTE">Delete Endnote</property>
+        <property name="use-underline">True</property>
+        <accelerator key="Delete" signal="activate"/>
+      </object>
+    </child>
     <child>
       <object class="GtkMenuItem" id="502">
         <property name="visible">True</property>

Reply via email to