summaryrefslogtreecommitdiff
path: root/plugins/QuickSearch/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2021-05-16 12:37:34 +0300
committerGeorge Hazan <ghazan@miranda.im>2021-05-16 12:37:39 +0300
commitcf58cd85828eda93e0f6d22c343dba4042d5a165 (patch)
treeb45d076452f18339eb77204a306643c53f382f80 /plugins/QuickSearch/src
parentfdf74acfa8249ea72b54e13cd61eb47708ebef1d (diff)
QuickSearch: fix for pattern search
Diffstat (limited to 'plugins/QuickSearch/src')
-rw-r--r--plugins/QuickSearch/src/stdafx.h22
-rw-r--r--plugins/QuickSearch/src/window.cpp46
-rw-r--r--plugins/QuickSearch/src/window_misc.cpp70
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);