Fixed advanced search feature

This commit is contained in:
Ianos Gnatiuc 2005-11-21 16:54:54 +00:00
parent 93f931255e
commit ebd238ef7d
2 changed files with 73 additions and 34 deletions

View File

@ -10,6 +10,12 @@ ______________________________________________________________________
Notes for GoldED+ 1.1.5, /snapshot/ Notes for GoldED+ 1.1.5, /snapshot/
______________________________________________________________________ ______________________________________________________________________
+ ')' and '(' chars can be used for advanced search.
')' - shortcut for "<>:" (from, to, subject), and
'(' - for "#._*@%" (body, tagline, tearline, origin, signature, kludges)
- Fixed advanced search feature.
+ READGoToReplyNext work on non JAM message bases + READGoToReplyNext work on non JAM message bases
+ Win32: Mapped APPS key to Shift+F10 + Win32: Mapped APPS key to Shift+F10

View File

@ -57,21 +57,38 @@ inline void search_item_option(bool& a, const char* s) {
// ------------------------------------------------------------------ // ------------------------------------------------------------------
const char* search_item_set(search_item& item, const char* s) { const char* search_item_set(search_item& item, const char* s, int what)
{
bool flag = false;
while(*s) { while(*s) {
switch(*s) { switch(*s) {
case ')':
search_item_option(item.where.from, s);
search_item_option(item.where.to, s);
search_item_option(item.where.subject, s);
flag = true;
break;
case '(':
search_item_option(item.where.body, s);
search_item_option(item.where.tagline, s);
search_item_option(item.where.tearline, s);
search_item_option(item.where.origin, s);
search_item_option(item.where.signature, s);
search_item_option(item.where.kludges, s);
flag = true;
break;
case '!': search_item_option(item.reverse, s); break; case '!': search_item_option(item.reverse, s); break;
case '<': search_item_option(item.where.from, s); break; case '<': search_item_option(item.where.from, s); flag = true; break;
case '>': search_item_option(item.where.to, s); break; case '>': search_item_option(item.where.to, s); flag = true; break;
case ':': search_item_option(item.where.subject, s); break; case ':': search_item_option(item.where.subject, s); flag = true; break;
case '#': search_item_option(item.where.body, s); break; case '#': search_item_option(item.where.body, s); flag = true; break;
case '.': search_item_option(item.where.tagline, s); break; case '.': search_item_option(item.where.tagline, s); flag = true; break;
case '_': search_item_option(item.where.tearline, s); break; case '_': search_item_option(item.where.tearline, s); flag = true; break;
case '*': search_item_option(item.where.origin, s); break; case '*': search_item_option(item.where.origin, s); flag = true; break;
case '@': search_item_option(item.where.signature, s); break; case '@': search_item_option(item.where.signature, s); flag = true; break;
case '%': search_item_option(item.where.kludges, s); break; case '%': search_item_option(item.where.kludges, s); flag = true; break;
case '=': search_item_option(item.case_sensitive, s); break; case '=': search_item_option(item.case_sensitive, s); flag = true; break;
case '?': case '?':
s++; s++;
switch(g_tolower(*s)) { switch(g_tolower(*s)) {
@ -92,51 +109,66 @@ const char* search_item_set(search_item& item, const char* s) {
case '\'': case '\'':
break; break;
default: default:
return s; if (isspace(*s)) break;
else
goto lblLoopExit;
} }
s++; s++;
} }
lblLoopExit:
if (what && !flag)
{
if (what & GFIND_FROM) item.where.from = true;
if (what & GFIND_TO) item.where.to = true;
if (what & GFIND_SUBJECT) item.where.subject = true;
if (what & GFIND_BODY) item.where.body = true;
if (what & GFIND_TAGLINE) item.where.tagline = true;
if (what & GFIND_TEARLINE) item.where.tearline = true;
if (what & GFIND_ORIGIN) item.where.origin = true;
if (what & GFIND_KLUDGES) item.where.kludges = true;
if (what & GFIND_SIGNATURE) item.where.signature = true;
}
return s; return s;
} }
// ------------------------------------------------------------------ // ------------------------------------------------------------------
void golded_search_manager::prepare_from_string(const char* prompt, int what) { void golded_search_manager::prepare_from_string(const char* prompt, int what)
{
// Get defaults // Get defaults
reverse = false; reverse = false;
direction = DIR_NEXT; direction = DIR_NEXT;
search_item default_item;
const char* p = prompt; const char* p = prompt;
if(*p == '-' or *p == '+') { if (*p == '-' or *p == '+')
{
direction = (*p == '-') ? DIR_PREV : DIR_NEXT; direction = (*p == '-') ? DIR_PREV : DIR_NEXT;
p++; p++;
} }
p = search_item_set(default_item, p);
if(default_item.reverse) {
default_item.reverse = false;
reverse = true;
}
if(what == GFIND_HDR or what == GFIND_HDRTXT) { search_item default_item;
if(not (default_item.where.from or default_item.where.to or default_item.where.subject)) { p = search_item_set(default_item, p, what);
default_item.where.from = true;
default_item.where.to = true; search_item item = default_item;
default_item.where.subject = true;
} default_item.reverse = false;
if(what == GFIND_HDRTXT) default_item.where.from = false;
default_item.where.body = true; default_item.where.to = false;
} default_item.where.subject = false;
default_item.where.body = false;
default_item.where.tagline = false;
default_item.where.tearline = false;
default_item.where.origin = false;
default_item.where.kludges = false;
default_item.where.signature = false;
char buf[256]; char buf[256];
char* b = buf; char* b = buf;
bool item_complete = false; bool item_complete = false;
search_item item = default_item;
p = search_item_set(item, strskip_wht(p));
do { do {
@ -204,8 +236,9 @@ void golded_search_manager::prepare_from_string(const char* prompt, int what) {
} }
if(*p == NUL) if(*p == NUL)
break; break;
item = default_item; item = default_item;
p = search_item_set(item, strskip_wht(p)); p = search_item_set(item, strskip_wht(p), what);
b = buf; b = buf;
} }