summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Heinisch <andreas.heinisch@yahoo.de>2023-04-17 11:07:35 +0200
committerAndreas Heinisch <andreas.heinisch@yahoo.de>2023-04-19 18:25:20 +0200
commit695f08911f40ab8d457c7c7e37bf87bb301ef98d (patch)
tree65f278f78cff403c628c12f2dffa91a4a116ec98
parentbe1fe4418caa8c26ea53fe1f9acbe36096d5e3a9 (diff)
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.heinisch@yahoo.de>
-rw-r--r--svx/source/dialog/srchdlg.cxx24
-rw-r--r--svx/source/tbxctrls/tbunosearchcontrollers.cxx36
2 files changed, 36 insertions, 24 deletions
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);