summaryrefslogtreecommitdiff
path: root/ui/search.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui/search.cpp')
-rw-r--r--ui/search.cpp180
1 files changed, 34 insertions, 146 deletions
diff --git a/ui/search.cpp b/ui/search.cpp
index 4c9c5366..c834b934 100644
--- a/ui/search.cpp
+++ b/ui/search.cpp
@@ -5,82 +5,19 @@
// **************************************************************************
#include "search.h"
-#include "gui_generated.h"
-#include <wx/msgdlg.h>
-#include <wx/utils.h>
-#include <utility>
#include <zen/string_tools.h>
-#include <wx+/mouse_move_dlg.h>
-using namespace zen;
-
-
-class SearchDlg : public SearchDialogGenerated
-{
-public:
- SearchDlg(wxWindow* parent, wxString& searchText, bool& respectCase);
-
- enum ReturnCodes
- {
- BUTTON_CANCEL,
- BUTTON_OKAY
- };
-
-private:
- void OnClose (wxCloseEvent& event) { EndModal(BUTTON_CANCEL); }
- void OnCancel(wxCommandEvent& event) { EndModal(BUTTON_CANCEL); }
- void OnFindNext(wxCommandEvent& event);
- void OnText(wxCommandEvent& event);
-
- wxString& searchText_;
- bool& respectCase_;
-};
-
-
-SearchDlg::SearchDlg(wxWindow* parent, wxString& searchText, bool& respectCase) :
- SearchDialogGenerated(parent),
- searchText_(searchText),
- respectCase_(respectCase)
-{
-#ifdef ZEN_WIN
- new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
-#endif
-
- m_checkBoxMatchCase->SetValue(respectCase_);
- m_textCtrlSearchTxt->SetValue(searchText_);
-
- m_textCtrlSearchTxt->SetFocus();
-}
-
-
-void SearchDlg::OnFindNext(wxCommandEvent& event)
-{
- respectCase_ = m_checkBoxMatchCase->GetValue();
- searchText_ = m_textCtrlSearchTxt->GetValue();
- EndModal(BUTTON_OKAY);
-}
+using namespace zen;
-void SearchDlg::OnText(wxCommandEvent& event)
+namespace
{
- if (m_textCtrlSearchTxt->GetValue().Trim().IsEmpty())
- m_buttonFindNext->Disable();
- else
- m_buttonFindNext->Enable();
-
- event.Skip();
-}
-//###########################################################################################
-
-template <bool respectCase>
-class FindInText;
-
template <bool respectCase>
-class FindInText
+class ContainsMatch
{
public:
- FindInText(const wxString& textToFind) : textToFind_(textToFind) {}
- bool found(const wxString& phrase) const { return contains(phrase, textToFind_); }
+ ContainsMatch(const wxString& textToFind) : textToFind_(textToFind) {}
+ bool operator()(const wxString& phrase) const { return contains(phrase, textToFind_); }
private:
wxString textToFind_;
@@ -88,11 +25,11 @@ private:
template <>
-class FindInText<false>
+class ContainsMatch<false>
{
public:
- FindInText(const wxString& textToFind) : textToFind_(textToFind) { textToFind_.MakeUpper(); }
- bool found(wxString&& phrase) const
+ ContainsMatch(const wxString& textToFind) : textToFind_(textToFind) { textToFind_.MakeUpper(); }
+ bool operator()(wxString&& phrase) const
{
//wxWidgets::MakeUpper() is inefficient! But performance is not THAT important for this high-level search functionality
phrase.MakeUpper();
@@ -111,102 +48,53 @@ ptrdiff_t findRow(const Grid& grid, //return -1 if no matching row found
size_t rowFirst, //specify area to search:
size_t rowLast) // [rowFirst, rowLast)
{
- auto prov = grid.getDataProvider();
- std::vector<Grid::ColumnAttribute> colAttr = grid.getColumnConfig();
- vector_remove_if(colAttr, [](const Grid::ColumnAttribute& ca) { return !ca.visible_; });
- if (!colAttr.empty() && prov)
+ if (auto prov = grid.getDataProvider())
{
- const FindInText<respectCase> searchTxt(searchString);
+ std::vector<Grid::ColumnAttribute> colAttr = grid.getColumnConfig();
+ vector_remove_if(colAttr, [](const Grid::ColumnAttribute& ca) { return !ca.visible_; });
+ if (!colAttr.empty())
+ {
+ const ContainsMatch<respectCase> containsMatch(searchString);
- for (size_t row = rowFirst; row < rowLast; ++row)
- for (auto iterCol = colAttr.begin(); iterCol != colAttr.end(); ++iterCol)
- if (searchTxt.found(prov->getValue(row, iterCol->type_)))
- return row;
+ for (size_t row = rowFirst; row < rowLast; ++row)
+ for (auto iterCol = colAttr.begin(); iterCol != colAttr.end(); ++iterCol)
+ if (containsMatch(prov->getValue(row, iterCol->type_)))
+ return row;
+ }
}
return -1;
}
-
-
-//syntactic sugar...
-ptrdiff_t findRow(Grid& grid,
- bool respectCase,
- const wxString& searchString,
- size_t rowFirst, //specify area to search:
- size_t rowLast) // [rowFirst, rowLast)
-{
- return respectCase ?
- findRow<true>( grid, searchString, rowFirst, rowLast) :
- findRow<false>(grid, searchString, rowFirst, rowLast);
}
-wxString lastSearchString; //this variable really is conceptionally global...
-
-
-void executeSearch(bool forceShowDialog,
- bool& respectCase,
- wxWindow* parent,
- Grid* gridL, Grid* gridR)
+std::pair<const Grid*, ptrdiff_t> zen::findGridMatch(const Grid& grid1, const Grid& grid2, const wxString& searchString, bool respectCase)
{
- bool searchDialogWasShown = false;
-
- if (forceShowDialog || lastSearchString.IsEmpty())
- {
- SearchDlg searchDlg(parent, lastSearchString, respectCase); //wxWidgets deletion handling -> deleted by parentWindow
- if (static_cast<SearchDlg::ReturnCodes>(searchDlg.ShowModal()) != SearchDlg::BUTTON_OKAY)
- return;
-
- searchDialogWasShown = true;
- }
-
- if (wxWindow::FindFocus() == &gridR->getMainWin())
- std::swap(gridL, gridR); //select side to start with
+ const size_t rowCountL = grid1.getRowCount();
+ const size_t rowCountR = grid2.getRowCount();
+ auto cursorPos = grid1.getGridCursor(); //(row, component pos)
- const size_t rowCountL = gridL->getRowCount();
- const size_t rowCountR = gridR->getRowCount();
- auto cursorPos = gridL->getGridCursor(); //(row, component pos)
+ std::pair<const Grid*, ptrdiff_t> result(nullptr, -1);
size_t cursorRowL = cursorPos.first;
if (cursorRowL >= rowCountL)
cursorRowL = 0;
{
- wxBusyCursor showHourGlass;
-
- auto finishSearch = [&](Grid& grid, size_t rowFirst, size_t rowLast) -> bool
+ auto finishSearch = [&](const Grid& grid, size_t rowFirst, size_t rowLast) -> bool
{
- const ptrdiff_t targetRow = findRow(grid, respectCase, lastSearchString, rowFirst, rowLast);
+ const ptrdiff_t targetRow = respectCase ?
+ findRow<true>( grid, searchString, rowFirst, rowLast) :
+ findRow<false>(grid, searchString, rowFirst, rowLast);
if (targetRow >= 0)
{
- //gridOther.clearSelection(); -> not needed other grids are automatically cleared after selection
- grid.setGridCursor(targetRow);
- grid.SetFocus();
+ result = std::make_pair(&grid, targetRow);
return true;
}
return false;
};
- if (finishSearch(*gridL, cursorRowL + 1, rowCountL) ||
- finishSearch(*gridR, 0, rowCountR) ||
- finishSearch(*gridL, 0, cursorRowL + 1))
- return;
+ if (!finishSearch(grid1, cursorRowL + 1, rowCountL))
+ if (!finishSearch(grid2, 0, rowCountR))
+ finishSearch(grid1, 0, cursorRowL + 1);
}
-
- wxMessageBox(replaceCpy(_("Cannot find %x"), L"%x", L"\"" + lastSearchString + L"\"", false), _("Find"), wxOK, parent);
-
- //show search dialog again
- if (searchDialogWasShown)
- executeSearch(true, respectCase, parent, gridL, gridR);
-}
-//###########################################################################################
-
-
-void zen::startFind(wxWindow* parent, Grid& gridL, Grid& gridR, bool& respectCase) //Strg + F
-{
- executeSearch(true, respectCase, parent, &gridL, &gridR);
-}
-
-
-void zen::findNext(wxWindow* parent, Grid& gridL, Grid& gridR, bool& respectCase) //F3
-{
- executeSearch(false, respectCase, parent, &gridL, &gridR);
-}
+ return result;
+} \ No newline at end of file
bgstack15