diff options
-rw-r--r-- | sw/source/uibase/utlui/content.cxx | 109 | ||||
-rw-r--r-- | sw/uiconfig/swriter/ui/navigatorcontextmenu.ui | 35 |
2 files changed, 136 insertions, 8 deletions
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 @@ -246,6 +246,41 @@ </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> <property name="can-focus">False</property> |