svx/source/dialog/srchdlg.cxx                  |   24 +++++++++-------
 svx/source/tbxctrls/tbunosearchcontrollers.cxx |   36 +++++++++++++++----------
 2 files changed, 36 insertions(+), 24 deletions(-)

New commits:
commit 695f08911f40ab8d457c7c7e37bf87bb301ef98d
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Mon Apr 17 11:07:35 2023 +0200
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Wed Apr 19 18:25:20 2023 +0200

    tdf#154818 - Find bar: remember and reuse last search string
    
    In addition, the search items are rearranged to their usage order.
    Change-Id: I4f4bdfd869a981726ef84060e93c178502eaefef
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150485
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/svx/source/dialog/srchdlg.cxx b/svx/source/dialog/srchdlg.cxx
index 69483c124770..4805bbd8159e 100644
--- a/svx/source/dialog/srchdlg.cxx
+++ b/svx/source/dialog/srchdlg.cxx
@@ -1591,20 +1591,22 @@ void SvxSearchDialog::Remember_Impl( const OUString 
&rStr, bool _bSearch )
     std::vector<OUString>* pArr = _bSearch ? &aSearchStrings : 
&aReplaceStrings;
     weld::ComboBox* pListBox = _bSearch ? m_xSearchLB.get() : 
m_xReplaceLB.get();
 
-    // ignore identical strings
-    if (std::find(pArr->begin(), pArr->end(), rStr) != pArr->end())
-        return;
+    // tdf#154818 - rearrange the search items
+    const auto nPos = pListBox->find_text(rStr);
+    if (nPos != -1)
+    {
+        pListBox->remove(nPos);
+        pArr->erase(pArr->begin() + nPos);
+    }
+    else if (pListBox->get_count() >= nRememberSize)
+    {
+        // delete oldest entry at maximum occupancy (ListBox and Array)
+        pListBox->remove(nRememberSize - 1);
+        pArr->erase(pArr->begin() + nRememberSize - 1);
+    }
 
     pArr->insert(pArr->begin(), rStr);
     pListBox->insert_text(0, rStr);
-
-    // delete oldest entry at maximum occupancy (ListBox and Array)
-    size_t nArrSize = pArr->size();
-    if (nArrSize > nRememberSize)
-    {
-        pListBox->remove(nArrSize - 1);
-        pArr->erase(pArr->begin() + nArrSize - 1);
-    }
 }
 
 void SvxSearchDialog::TemplatesChanged_Impl( SfxStyleSheetBasePool& rPool )
diff --git a/svx/source/tbxctrls/tbunosearchcontrollers.cxx 
b/svx/source/tbxctrls/tbunosearchcontrollers.cxx
index 9611f4d686c0..d43222fe4e32 100644
--- a/svx/source/tbxctrls/tbunosearchcontrollers.cxx
+++ b/svx/source/tbxctrls/tbunosearchcontrollers.cxx
@@ -60,6 +60,7 @@
 #include <svx/labelitemwindow.hxx>
 #include <svx/srchdlg.hxx>
 #include <vcl/event.hxx>
+#include <unotools/viewoptions.hxx>
 
 #include <findtextfield.hxx>
 
@@ -222,17 +223,15 @@ FindTextFieldControl::FindTextFieldControl( vcl::Window* 
pParent,
 
 void FindTextFieldControl::Remember_Impl(const OUString& rStr)
 {
-    const sal_Int32 nCount = m_xWidget->get_count();
-
-    for (sal_Int32 i=0; i<nCount; ++i)
-    {
-        if (rStr == m_xWidget->get_text(i))
-            return;
-    }
+    if (rStr.isEmpty())
+        return;
 
-    if (nCount == m_nRememberSize)
+    // tdf#154818 - rearrange the search items
+    const auto nPos = m_xWidget->find_text(rStr);
+    if (nPos != -1)
+        m_xWidget->remove(nPos);
+    else if (m_xWidget->get_count() >= m_nRememberSize)
         m_xWidget->remove(m_nRememberSize - 1);
-
     m_xWidget->insert_text(0, rStr);
 }
 
@@ -261,10 +260,17 @@ void FindTextFieldControl::SetTextToSelected_Impl()
         m_xWidget->set_entry_text(aString);
         m_aChangeHdl.Call(*m_xWidget);
     }
-    else if (get_count() > 0)
+    else
     {
-        // Else, prepopulate with last search word (fdo#84256)
-        m_xWidget->set_entry_text(m_xWidget->get_text(0));
+        // tdf#154818 - reuse last search string
+        SvtViewOptions aDlgOpt(EViewType::Dialog, m_xWidget->get_help_id());
+        if (aDlgOpt.Exists())
+        {
+            css::uno::Any aUserItem = aDlgOpt.GetUserItem("UserItem");
+            aUserItem >>= aString;
+            // prepopulate with last search word (fdo#84256)
+            m_xWidget->set_entry_text(aString);
+        }
     }
 }
 
@@ -330,7 +336,11 @@ IMPL_LINK(FindTextFieldControl, KeyInputHdl, const 
KeyEvent&, rKeyEvent, bool)
 
 void FindTextFieldControl::ActivateFind(bool bShift)
 {
-    Remember_Impl(m_xWidget->get_active_text());
+    // tdf#154818 - remember last search string
+    const OUString aLastSearchString = m_xWidget->get_active_text();
+    SvtViewOptions aDlgOpt(EViewType::Dialog, m_xWidget->get_help_id());
+    aDlgOpt.SetUserItem("UserItem", css::uno::Any(aLastSearchString));
+    Remember_Impl(aLastSearchString);
 
     vcl::Window* pWindow = GetParent();
     ToolBox* pToolBox = static_cast<ToolBox*>(pWindow);

Reply via email to