diff options
author | George Hazan <ghazan@miranda.im> | 2021-05-16 12:37:34 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2021-05-16 12:37:39 +0300 |
commit | cf58cd85828eda93e0f6d22c343dba4042d5a165 (patch) | |
tree | b45d076452f18339eb77204a306643c53f382f80 /plugins/QuickSearch | |
parent | fdf74acfa8249ea72b54e13cd61eb47708ebef1d (diff) |
QuickSearch: fix for pattern search
Diffstat (limited to 'plugins/QuickSearch')
-rw-r--r-- | plugins/QuickSearch/src/stdafx.h | 22 | ||||
-rw-r--r-- | plugins/QuickSearch/src/window.cpp | 46 | ||||
-rw-r--r-- | plugins/QuickSearch/src/window_misc.cpp | 70 |
3 files changed, 90 insertions, 48 deletions
diff --git a/plugins/QuickSearch/src/stdafx.h b/plugins/QuickSearch/src/stdafx.h index a6cd211e45..b5089aff12 100644 --- a/plugins/QuickSearch/src/stdafx.h +++ b/plugins/QuickSearch/src/stdafx.h @@ -355,23 +355,23 @@ class QSMainDlg : public CDlgBase HGENMENU mnuhandle = 0; // patterns - wchar_t *pattern = nullptr; // edit field text - wchar_t *patstr = nullptr; // edit field text + struct Pattern { + Pattern(const wchar_t *pwszText) : + str(pwszText) + {} - struct - { - wchar_t *str; - bool res; - } - static patterns[8]; + const wchar_t *str; + bool res = false; + }; - int numpattern = 0; + OBJLIST<Pattern> m_patterns; + ptrW m_wszPatternBuf; bool bShowOffline; char *szFilterProto = nullptr; - bool CheckPattern(CRowItem *); - void MakePattern(); + bool CheckPattern(CRowItem *pRow); + void MakePattern(const wchar_t *pwszPattern); // controls CTimer m_hover; diff --git a/plugins/QuickSearch/src/window.cpp b/plugins/QuickSearch/src/window.cpp index 670a72b03c..f7777c637a 100644 --- a/plugins/QuickSearch/src/window.cpp +++ b/plugins/QuickSearch/src/window.cpp @@ -223,21 +223,12 @@ INT_PTR QSMainDlg::NewLVProc(UINT msg, WPARAM wParam, LPARAM lParam) break; case 8: // backspace - if (pattern != nullptr) { - size_t len = mir_wstrlen(pattern); - pattern[len - 1] = 0; - edtFilter.SetText(pattern); - } + edtFilter.SendMsg(msg, wParam, lParam); break; } - if (wParam >= 32 && wParam <= 127) { // letters - CMStringW buf; - if (pattern) - buf = pattern; - buf.AppendChar(wParam); - edtFilter.SetText(buf); - } + if (wParam >= 32 && wParam <= 127) // letters + edtFilter.SendMsg(msg, wParam, lParam); break; case WM_MOUSEMOVE: @@ -364,6 +355,7 @@ static int CompareSb(const CStatusBarItem *p1, const CStatusBarItem *p2) QSMainDlg::QSMainDlg(const wchar_t *pwszPattern) : CDlgBase(g_plugin, IDD_MAIN), m_rows(50), + m_patterns(1), m_sbdata(10, CompareSb), m_grid(this, IDC_LIST), m_hover(this, 10), @@ -375,14 +367,10 @@ QSMainDlg::QSMainDlg(const wchar_t *pwszPattern) : { SetMinSize(300, 160); - if (pwszPattern) { - pattern = mir_wstrdup(pwszPattern); - CharLowerW(pattern); - } + if (pwszPattern) + m_wszPatternBuf = mir_wstrdup(pwszPattern); else if (g_plugin.m_flags & QSO_SAVEPATTERN) - pattern = g_plugin.getWStringA("pattern"); - else - pattern = nullptr; + m_wszPatternBuf = g_plugin.getWStringA("pattern"); m_hover.OnEvent = Callback(this, &QSMainDlg::onTimer_Hover); @@ -460,12 +448,11 @@ bool QSMainDlg::OnInitDialog() PrepareTable(); - if (pattern != nullptr) - SetDlgItemTextW(m_hwnd, IDC_E_SEARCHTEXT, pattern); - else { - SetDlgItemTextW(m_hwnd, IDC_E_SEARCHTEXT, L""); - FillGrid(); + if (m_wszPatternBuf) { + edtFilter.SetText(m_wszPatternBuf); + MakePattern(m_wszPatternBuf); } + FillGrid(); // Show sorting column HDITEM hdi = {}; @@ -519,12 +506,10 @@ void QSMainDlg::OnDestroy() m_grid.SetImageList(0, LVSIL_SMALL); if (g_plugin.m_flags & QSO_SAVEPATTERN) - g_plugin.setWString("pattern", pattern); - - mir_free(patstr); - mir_free(pattern); + g_plugin.setWString("pattern", ptrW(edtFilter.GetText())); m_rows.destroy(); + m_patterns.destroy(); } int QSMainDlg::Resizer(UTILRESIZECONTROL *urc) @@ -617,10 +602,7 @@ void QSMainDlg::onChange_Filter(CCtrlEdit *) if (!m_bInitialized) return; - wchar_t buf[256]; - GetDlgItemTextW(m_hwnd, IDC_E_SEARCHTEXT, buf, _countof(buf)); - CharLowerW(buf); - replaceStrW(pattern, (buf[0]) ? buf : nullptr); + MakePattern(ptrW(edtFilter.GetText())); FillGrid(); } diff --git a/plugins/QuickSearch/src/window_misc.cpp b/plugins/QuickSearch/src/window_misc.cpp index a52354b884..b166096a4d 100644 --- a/plugins/QuickSearch/src/window_misc.cpp +++ b/plugins/QuickSearch/src/window_misc.cpp @@ -20,13 +20,75 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////////////////////////////// // patterns -bool QSMainDlg::CheckPattern(CRowItem *) +bool QSMainDlg::CheckPattern(CRowItem *pRow) { - return true; + if (m_patterns.getCount() == 0) + return true; + + for (auto &p : m_patterns) + p->res = 0; + + int i = 0; + for (auto &it : g_plugin.m_columns) { + if (it->bEnabled && it->bFilter && pRow->pValues[i].text != nullptr) { + CMStringW buf(pRow->pValues[i].text); + buf.MakeLower(); + + for (auto &p : m_patterns) + if (!p->res && buf.Find(p->str) != -1) + p->res = true; + } + i++; + } + + bool result = true; + for (auto &p : m_patterns) + result = result && p->res; + return result; } -void QSMainDlg::MakePattern() +void QSMainDlg::MakePattern(const wchar_t *pwszPattern) { + m_patterns.destroy(); + if (mir_wstrlen(pwszPattern) == 0) + return; + + // m_wszPatternBuf works as a storage for patterns, we store pointers to it in m_patterns + m_wszPatternBuf = mir_wstrdup(pwszPattern); + CharLowerW(m_wszPatternBuf); + + for (wchar_t *p = m_wszPatternBuf; *p; ) { + auto *pWord = wcspbrk(p, L" \""); + if (pWord == nullptr) { + m_patterns.insert(new Pattern(p)); + return; + } + + bool isSpace = pWord[0] == ' '; + + // there's some valuable info between p and pWord + if (pWord != p) { + *pWord = 0; + m_patterns.insert(new Pattern(p)); + } + + if (isSpace) { + p = ltrimpw(pWord + 1); // skip all spaces + } + else { + auto *pEnd = wcschr(++pWord, '\"'); + + // treat the rest of line as one pattern + if (pEnd == nullptr) { + m_patterns.insert(new Pattern(pWord)); + return; + } + + *pEnd = 0; + m_patterns.insert(new Pattern(pWord)); + p = ltrimpw(pEnd + 1); + } + } } ///////////////////////////////////////////////////////////////////////////////////////// @@ -262,8 +324,6 @@ void QSMainDlg::FillGrid() { m_grid.SetDraw(false); - MakePattern(); - for (auto &it: m_rows) ProcessLine(it); |