sw/source/uibase/sidebar/QuickFindPanel.cxx | 60 +++++++++++++++++++++------- sw/source/uibase/sidebar/QuickFindPanel.hxx | 16 +++++-- sw/source/uibase/sidebar/SwPanelFactory.cxx | 2 sw/uiconfig/swriter/ui/sidebarquickfind.ui | 12 +++++ 4 files changed, 69 insertions(+), 21 deletions(-)
New commits: commit 89ffec202ee7a21c1f9b1d5deebfceb7357de5cc Author: Jim Raykowski <[email protected]> AuthorDate: Wed Nov 12 22:45:33 2025 -0900 Commit: Jim Raykowski <[email protected]> CommitDate: Mon Nov 17 11:45:54 2025 +0100 related tdf#162580: copy query text from sidebar Find deck to F&R dialog Makes the query text in the Find&Replace dialog find entry become that of the sidebar Find deck find entry when keyboard focus is in the Find deck find entry and Ctrl+H (or any accelerator assigned to .uno:SearchDialog) is pressed or the F&R button in the Find deck is pressed. Normally these actions make the F&R dialog open or close. Here the F&R dialog is never closed. It either opens the F&R dialog and copies the find text to it or copies the find text to the already open F&R dialog. Reasoning for this behavior: F&R dialog is open. Find deck search finds nothing. Ctrl+H or F&R toolbar button in the Find deck is pressed to upgrade the search using options in the F&R dialog. Without this patch the open F&R dialog closes when Ctrl+H or the F&R button is pressed. Likely what is expected is the F&R dialog remains open and the text in the F&R dialog find entry becomes that of the sidebar Find deck find entry, which is what this patch does. Change-Id: Ic01cbbe6881469349a0756f3837428324f27d5b4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193945 Tested-by: Jenkins Reviewed-by: Jim Raykowski <[email protected]> diff --git a/sw/source/uibase/sidebar/QuickFindPanel.cxx b/sw/source/uibase/sidebar/QuickFindPanel.cxx index 702c961e77b6..05d29c92ae1c 100644 --- a/sw/source/uibase/sidebar/QuickFindPanel.cxx +++ b/sw/source/uibase/sidebar/QuickFindPanel.cxx @@ -27,6 +27,9 @@ #include <vcl/sysdata.hxx> #include <swwait.hxx> +#include <svx/srchdlg.hxx> +#include <comphelper/processfactory.hxx> + const int CharactersBeforeAndAfter = 40; namespace @@ -97,7 +100,8 @@ IMPL_LINK_NOARG(QuickFindPanel::SearchOptionsDialog, SimilaritySettingsDialogBut std::unique_ptr<PanelLayout> QuickFindPanel::Create(weld::Widget* pParent, - const css::uno::Reference<css::frame::XFrame>& rxFrame) + const css::uno::Reference<css::frame::XFrame>& rxFrame, + SfxBindings* pBindings) { if (pParent == nullptr) throw lang::IllegalArgumentException("no parent Window given to QuickFindPanel::Create", @@ -105,20 +109,23 @@ QuickFindPanel::Create(weld::Widget* pParent, if (!rxFrame.is()) throw lang::IllegalArgumentException("no XFrame given to QuickFindPanel::Create", nullptr, 0); - return std::make_unique<QuickFindPanel>(pParent, rxFrame); + return std::make_unique<QuickFindPanel>(pParent, rxFrame, pBindings); } -QuickFindPanel::QuickFindPanel(weld::Widget* pParent, const uno::Reference<frame::XFrame>& rxFrame) +QuickFindPanel::QuickFindPanel(weld::Widget* pParent, const uno::Reference<frame::XFrame>& rxFrame, + SfxBindings* pBindings) : PanelLayout(pParent, u"QuickFindPanel"_ustr, u"modules/swriter/ui/sidebarquickfind.ui"_ustr) , m_xSearchFindEntry(m_xBuilder->weld_entry(u"Find"_ustr)) , m_xSearchOptionsToolbar(m_xBuilder->weld_toolbar(u"searchoptionstoolbar"_ustr)) , m_xFindAndReplaceToolbar(m_xBuilder->weld_toolbar(u"findandreplacetoolbar"_ustr)) - , m_xFindAndReplaceToolbarDispatch( - new ToolbarUnoDispatcher(*m_xFindAndReplaceToolbar, *m_xBuilder, rxFrame)) , m_xSearchFindsList(m_xBuilder->weld_tree_view(u"searchfinds"_ustr)) , m_xSearchFindFoundTimesLabel(m_xBuilder->weld_label("numberofsearchfinds")) , m_pWrtShell(::GetActiveWrtShell()) + , m_xAcceleratorExecute(svt::AcceleratorExecute::createAcceleratorHelper()) + , m_pBindings(pBindings) { + m_xAcceleratorExecute->init(comphelper::getProcessComponentContext(), rxFrame); + m_nMinimumPanelWidth = m_xBuilder->weld_widget(u"box"_ustr)->get_preferred_size().getWidth() + (6 * 2) + 6; m_xContainer->set_size_request(m_nMinimumPanelWidth, 1); @@ -127,6 +134,8 @@ QuickFindPanel::QuickFindPanel(weld::Widget* pParent, const uno::Reference<frame m_xSearchFindEntry->connect_activate( LINK(this, QuickFindPanel, SearchFindEntryActivateHandler)); m_xSearchFindEntry->connect_changed(LINK(this, QuickFindPanel, SearchFindEntryChangedHandler)); + m_xSearchFindEntry->connect_key_press( + LINK(this, QuickFindPanel, SearchFindEntryKeyInputHandler)); m_xSearchOptionsToolbar->connect_clicked( LINK(this, QuickFindPanel, SearchOptionsToolbarClickedHandler)); @@ -181,25 +190,46 @@ IMPL_LINK_NOARG(QuickFindPanel, SearchOptionsToolbarClickedHandler, const OUStri // tdf#162580 related: When upgrading from Find toolbar search to advanced Find and Replace // search dialog, inherit (pre-fill) search field's term from current value of find bar's // focused search entry -IMPL_LINK(QuickFindPanel, FindAndReplaceToolbarClickedHandler, const OUString&, rCommand, void) + +bool QuickFindPanel::UpgradeSearchToSearchDialog() { - if (!SwView::GetSearchDialog()) + m_pWrtShell->AssureStdMode(); + SvxSearchDialog* pSearchDialog = SwView::GetSearchDialog(); + if (!pSearchDialog) { - SvxSearchItem* pSearchItem = SwView::GetSearchItem(); - if (!pSearchItem) - { - pSearchItem = new SvxSearchItem(SID_SEARCH_ITEM); - SwView::SetSearchItem(pSearchItem); - } - pSearchItem->SetSearchString(m_xSearchFindEntry->get_text()); + m_pBindings->ExecuteSynchron(SID_SEARCH_DLG); + pSearchDialog = SwView::GetSearchDialog(); + } + if (pSearchDialog) + { + pSearchDialog->SetSearchLabel(EMPTY_OUSTRING); + pSearchDialog->SetSearchLBEntryTextAndGrabFocus(m_xSearchFindEntry->get_text()); + pSearchDialog->Present(); + return true; } - m_xFindAndReplaceToolbarDispatch->Select(rCommand); + return false; +} + +IMPL_LINK(QuickFindPanel, FindAndReplaceToolbarClickedHandler, const OUString&, rCommand, void) +{ + if (rCommand == "searchdialog") + UpgradeSearchToSearchDialog(); +} + +IMPL_LINK(QuickFindPanel, SearchFindEntryKeyInputHandler, const KeyEvent&, rKeyEvent, bool) +{ + const OUString aCommand(m_xAcceleratorExecute->findCommand( + svt::AcceleratorExecute::st_VCLKey2AWTKey(rKeyEvent.GetKeyCode()))); + if (aCommand == ".uno:SearchDialog") + return UpgradeSearchToSearchDialog(); + return false; } QuickFindPanel::~QuickFindPanel() { m_xSearchFindEntry.reset(); m_xSearchFindsList.reset(); + m_xAcceleratorExecute.reset(); } IMPL_LINK_NOARG(QuickFindPanel, SearchFindEntryFocusInHandler, weld::Widget&, void) diff --git a/sw/source/uibase/sidebar/QuickFindPanel.hxx b/sw/source/uibase/sidebar/QuickFindPanel.hxx index ac17e8567ef6..a5c109f090f7 100644 --- a/sw/source/uibase/sidebar/QuickFindPanel.hxx +++ b/sw/source/uibase/sidebar/QuickFindPanel.hxx @@ -12,7 +12,9 @@ #include <sfx2/sidebar/PanelLayout.hxx> #include <svx/svxdlg.hxx> #include <wrtsh.hxx> -#include <sfx2/weldutils.hxx> + +#include <sfx2/bindings.hxx> +#include <svtools/acceleratorexecute.hxx> namespace sw::sidebar { @@ -45,9 +47,11 @@ class QuickFindPanel : public PanelLayout public: static std::unique_ptr<PanelLayout> Create(weld::Widget* pParent, - const uno::Reference<frame::XFrame>& rxFrame); + const uno::Reference<frame::XFrame>& rxFrame, + SfxBindings* pBindings); - QuickFindPanel(weld::Widget* pParent, const uno::Reference<frame::XFrame>& rxFrame); + QuickFindPanel(weld::Widget* pParent, const uno::Reference<frame::XFrame>& rxFrame, + SfxBindings* pBindings); virtual ~QuickFindPanel() override; private: @@ -56,11 +60,13 @@ private: std::unique_ptr<weld::Entry> m_xSearchFindEntry; std::unique_ptr<weld::Toolbar> m_xSearchOptionsToolbar; std::unique_ptr<weld::Toolbar> m_xFindAndReplaceToolbar; - std::unique_ptr<ToolbarUnoDispatcher> m_xFindAndReplaceToolbarDispatch; std::unique_ptr<weld::TreeView> m_xSearchFindsList; std::unique_ptr<weld::Label> m_xSearchFindFoundTimesLabel; SwWrtShell* m_pWrtShell; + std::unique_ptr<svt::AcceleratorExecute> m_xAcceleratorExecute; + + SfxBindings* m_pBindings; int m_nMinimumPanelWidth; @@ -75,6 +81,7 @@ private: DECL_LINK(SearchFindEntryFocusInHandler, weld::Widget&, void); DECL_LINK(SearchFindEntryActivateHandler, weld::Entry&, bool); DECL_LINK(SearchFindEntryChangedHandler, weld::Entry&, void); + DECL_LINK(SearchFindEntryKeyInputHandler, const KeyEvent&, bool); DECL_LINK(SearchFindsListCustomGetSizeHandler, weld::TreeView::get_size_args, Size); DECL_LINK(SearchFindsListRender, weld::TreeView::render_args, void); DECL_LINK(SearchFindsListSelectionChangedHandler, weld::TreeView&, void); @@ -84,6 +91,7 @@ private: DECL_LINK(FindAndReplaceToolbarClickedHandler, const OUString&, void); void FillSearchFindsList(); + bool UpgradeSearchToSearchDialog(); }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/sidebar/SwPanelFactory.cxx b/sw/source/uibase/sidebar/SwPanelFactory.cxx index cb8c8248bf3f..93873b05014a 100644 --- a/sw/source/uibase/sidebar/SwPanelFactory.cxx +++ b/sw/source/uibase/sidebar/SwPanelFactory.cxx @@ -220,7 +220,7 @@ Reference<ui::XUIElement> SAL_CALL SwPanelFactory::createUIElement ( else if (rsResourceURL.endsWith("/QuickFindPanel")) { std::unique_ptr<PanelLayout> xPanel - = sw::sidebar::QuickFindPanel::Create(pParent, xFrame); + = sw::sidebar::QuickFindPanel::Create(pParent, xFrame, pBindings); xElement = sfx2::sidebar::SidebarPanelBase::Create(rsResourceURL, xFrame, std::move(xPanel), ui::LayoutSize(-1, -1, -1)); } diff --git a/sw/uiconfig/swriter/ui/sidebarquickfind.ui b/sw/uiconfig/swriter/ui/sidebarquickfind.ui index e8eaa19033fe..97951d741afc 100644 --- a/sw/uiconfig/swriter/ui/sidebarquickfind.ui +++ b/sw/uiconfig/swriter/ui/sidebarquickfind.ui @@ -54,6 +54,7 @@ <child> <object class="GtkToolButton" id="searchoptions"> <property name="visible">True</property> + <property name="can-focus">False</property> <property name="tooltip-text" translatable="yes" context="quickfindpanel|moresearchoptions|tooltip_text">Search Options</property> <property name="icon-name">sw/res/sr20006.png</property> <child internal-child="accessible"> @@ -82,8 +83,17 @@ <property name="toolbar-style">icons</property> <property name="show-arrow">False</property> <child> - <object class="GtkToolButton" id=".uno:SearchDialog"> + <object class="GtkToolButton" id="searchdialog"> <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="tooltip-text" translatable="yes" context="quickfindpanel|searchdialog|tooltip_text">Search with Find and Replace</property> + <property name="icon-name">cmd/sc_searchdialog.png</property> + <child internal-child="accessible"> + <object class="AtkObject" id="searchdialog-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="quickfindpanel|searchdialog|accessible_name">Search with Find and Replace</property> + <property name="AtkObject::accessible-description" translatable="yes" context="quickfindpanel|extended_tip|searchdialog">Click here to transfer the search to the Find and Replace dialog to set more search options.</property> + </object> + </child> </object> <packing> <property name="expand">False</property>
