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>