mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
Cfg: Refactor 'Gui - Url bar'; Add better support for buttons
This commit is contained in:
@@ -28,7 +28,7 @@ public class Srch_urlbar_mgr implements Gfo_invk { // NOTE: needs to be app-leve
|
||||
private int max_results = 10;
|
||||
private boolean auto_wildcard = true;
|
||||
private final Srch_ns_mgr ns_mgr = new Srch_ns_mgr().Add_main_if_empty();
|
||||
private Srch_crt_scanner_syms syms = Srch_search_mgr.Scanner_syms;
|
||||
private Srch_crt_scanner_syms syms = Srch_crt_scanner_syms.New__dflt();
|
||||
private void Ns_ids_(String s) {
|
||||
int[] ns_ids = Int_.Ary_empty;
|
||||
if (String_.Eq(s, "*")) {} // leave as int[0]; ns_mgr will interpret as wildcard
|
||||
@@ -76,7 +76,7 @@ public class Srch_urlbar_mgr implements Gfo_invk { // NOTE: needs to be app-leve
|
||||
url_bar.List_sel_idx_(0); // clear selected list item; EX: search "a" -> page down; sel is row #5 -> search "b" -> sel should not be #5; DATE:2016-03-24
|
||||
if (!url_bar.List_visible()) url_bar.Items__size_to_fit(max_results); // resize offscreen; handles 1st search when dropdown flashes briefly in middle of screen before being moved under bar; DATE:2016-03-24
|
||||
|
||||
Srch_search_qry qry = Srch_search_qry.New__url_bar(wiki, ns_mgr, auto_wildcard, max_results, Bry_.new_u8(search_str));
|
||||
Srch_search_qry qry = Srch_search_qry.New__url_bar(wiki, ns_mgr, syms, auto_wildcard, max_results, Bry_.new_u8(search_str));
|
||||
Srch_rslt_cbk__url_bar cbk = new Srch_rslt_cbk__url_bar(app, url_bar, max_results);
|
||||
Xoa_app_.Usr_dlg().Prog_one("", "", "searching (please wait): ~{0}", search_str);
|
||||
addon.Search(qry, cbk);
|
||||
@@ -93,12 +93,12 @@ public class Srch_urlbar_mgr implements Gfo_invk { // NOTE: needs to be app-leve
|
||||
return this;
|
||||
}
|
||||
private static final String
|
||||
Cfg__enabled = "xowa.addon.search.url_bar.enabled"
|
||||
, Cfg__max_results = "xowa.addon.search.url_bar.max_results"
|
||||
, Cfg__auto_wildcard = "xowa.addon.search.url_bar.auto_wildcard"
|
||||
, Cfg__ns_ids = "xowa.addon.search.url_bar.ns_ids"
|
||||
, Cfg__symbols = "xowa.addon.search.url_bar.symbols"
|
||||
, Cfg__visible_rows = "xowa.addon.search.url_bar.visible_rows"
|
||||
, Cfg__jump_len = "xowa.addon.search.url_bar.jump_len"
|
||||
Cfg__enabled = "xowa.gui.urlbar.search.enabled"
|
||||
, Cfg__max_results = "xowa.gui.urlbar.search.max_results"
|
||||
, Cfg__auto_wildcard = "xowa.gui.urlbar.search.auto_wildcard"
|
||||
, Cfg__ns_ids = "xowa.gui.urlbar.search.ns_ids"
|
||||
, Cfg__symbols = "xowa.gui.urlbar.search.symbols"
|
||||
, Cfg__visible_rows = "xowa.gui.urlbar.search.visible_rows"
|
||||
, Cfg__jump_len = "xowa.gui.urlbar.search.jump_len"
|
||||
;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class Srch_search_mgr {
|
||||
private int search_count;
|
||||
public Srch_search_mgr(Srch_search_addon addon, Xow_wiki wiki, Srch_text_parser parser) {
|
||||
this.addon = addon; this.wiki = wiki;
|
||||
crt_parser = new Srch_crt_parser(Scanner_syms);
|
||||
crt_parser = new Srch_crt_parser(Srch_crt_scanner_syms.Dflt); // NOTE: hard-coded to dflt; should change to use qry.Phrase.Syms, but requires more work
|
||||
|
||||
// init cur_cmds with Noop cmd to make cancel logic below easier
|
||||
int len = Srch_search_qry.Tid_len;
|
||||
@@ -70,7 +70,7 @@ public class Srch_search_mgr {
|
||||
public void Search_async(Cancelable cxl, Srch_search_qry qry, Srch_crt_mgr crt_mgr, Srch_rslt_cbk rslt_cbk, Srch_rslt_list rslts_list) {
|
||||
synchronized (mutex) { // force only one search at a time; do not (a) place around Thread_sleep; (b) reuse for any other locks
|
||||
if (++search_count > 64) this.Clear(); // lazy way of clearing memory
|
||||
Srch_search_ctx ctx = new Srch_search_ctx(cxl, wiki, addon, cache__page, cache__word_counts, qry, Scanner_syms, crt_mgr, rslts_list);
|
||||
Srch_search_ctx ctx = new Srch_search_ctx(cxl, wiki, addon, cache__page, cache__word_counts, qry, qry.Phrase.Syms, crt_mgr, rslts_list);
|
||||
ctx.Score_rng.Select_init(ctx.Rslts_needed, rslts_list.Score_bgn, rslts_list.Score_len, Srch_link_wkr.Percentile_rng__calc_adj(crt_mgr.Words_nth__len()));
|
||||
page_tbl_searcher.Search(ctx, rslt_cbk);
|
||||
if (cxl.Canceled()) return;
|
||||
@@ -85,5 +85,4 @@ public class Srch_search_mgr {
|
||||
cache__word_counts.Clear();
|
||||
cache__rslts.Clear();
|
||||
}
|
||||
public static final Srch_crt_scanner_syms Scanner_syms = Srch_crt_scanner_syms.Dflt;
|
||||
}
|
||||
|
||||
@@ -19,27 +19,29 @@ package gplx.xowa.addons.wikis.searchs.searchers; import gplx.*; import gplx.xow
|
||||
import gplx.core.btries.*;
|
||||
import gplx.xowa.addons.wikis.searchs.searchers.crts.*;
|
||||
public class Srch_search_phrase {
|
||||
public Srch_search_phrase(boolean wildcard, byte[] orig, byte[] compiled) {
|
||||
public Srch_search_phrase(boolean wildcard, byte[] orig, byte[] compiled, Srch_crt_scanner_syms syms) {
|
||||
this.Orig = orig;
|
||||
this.Compiled = compiled;
|
||||
this.Wildcard = wildcard;
|
||||
this.Syms = syms;
|
||||
}
|
||||
public final boolean Wildcard;
|
||||
public final byte[] Orig; // EX: "Earth"
|
||||
public final byte[] Compiled; // EX: "earth*"
|
||||
public final Srch_crt_scanner_syms Syms;
|
||||
|
||||
public static Srch_search_phrase New(gplx.xowa.langs.cases.Xol_case_mgr case_mgr, byte[] orig, boolean wildcard) {
|
||||
public static Srch_search_phrase New(gplx.xowa.langs.cases.Xol_case_mgr case_mgr, Srch_crt_scanner_syms syms, boolean auto_wildcard, byte[] orig) {
|
||||
int orig_len = orig.length;
|
||||
if ( orig_len > 0 // if "*" at end, remove and change to wildcard; needed for Special:Search which will send in "earth*" but "earth" needed for highlighting
|
||||
&& orig[orig_len - 1] == Srch_crt_scanner_syms.Dflt.Wild()) {
|
||||
&& orig[orig_len - 1] == syms.Wild()) {
|
||||
orig = Bry_.Mid(orig, 0, orig_len - 1);
|
||||
wildcard = true;
|
||||
auto_wildcard = true;
|
||||
}
|
||||
byte[] lcase = case_mgr.Case_build_lower(orig);
|
||||
lcase = Auto_wildcard(lcase, Srch_crt_scanner_syms.Dflt);
|
||||
return new Srch_search_phrase(wildcard, orig, lcase);
|
||||
lcase = Auto_wildcard(lcase, auto_wildcard, syms);
|
||||
return new Srch_search_phrase(auto_wildcard, orig, lcase, syms);
|
||||
}
|
||||
public static byte[] Auto_wildcard(byte[] raw, Srch_crt_scanner_syms syms) {
|
||||
public static byte[] Auto_wildcard(byte[] raw, boolean auto_wildcard, Srch_crt_scanner_syms syms) {
|
||||
Btrie_slim_mgr trie = syms.Trie();
|
||||
int raw_len = raw.length;
|
||||
int insert_pos = -1;
|
||||
@@ -118,7 +120,8 @@ public class Srch_search_phrase {
|
||||
}
|
||||
|
||||
// add wildcard
|
||||
if (insert_pos == raw_len - 1) return Bry_.Add(raw, syms.Wild());
|
||||
if (insert_pos == raw_len - 1)
|
||||
return auto_wildcard ? Bry_.Add(raw, syms.Wild()) : raw;
|
||||
else {
|
||||
byte[] rv = new byte[raw_len + 1];
|
||||
int wildcard_pos = insert_pos + 1;
|
||||
|
||||
@@ -34,13 +34,15 @@ public class Srch_search_phrase_tst {
|
||||
@Test public void Escape() {fxt.Test__auto_wildcard("\\*" , "\\**");}
|
||||
@Test public void Escape__incomplete() {fxt.Test__auto_wildcard("a\\" , "a\\");}
|
||||
@Test public void Escape__escaped() {fxt.Test__auto_wildcard("a\\\\" , "a\\\\*");}
|
||||
@Test public void Auto_wildcard_n() {fxt.Init__auto_wildcard_n_().Test__auto_wildcard("a", "a");}
|
||||
}
|
||||
class Srch_search_phrase_fxt {
|
||||
private final Srch_crt_scanner_syms syms = Srch_crt_scanner_syms.Dflt;
|
||||
public Srch_search_phrase_fxt() {}
|
||||
private boolean auto_wildcard = true;
|
||||
public Srch_search_phrase_fxt Init__auto_wildcard_n_() {this.auto_wildcard = false; return this;}
|
||||
public void Test__auto_wildcard(String src_str, String expd) {
|
||||
byte[] src_raw = Bry_.new_u8(src_str);
|
||||
byte[] actl = Srch_search_phrase.Auto_wildcard(src_raw, syms);
|
||||
byte[] actl = Srch_search_phrase.Auto_wildcard(src_raw, auto_wildcard, syms);
|
||||
Tfds.Eq(expd, String_.new_u8(actl));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.xowa.addons.wikis.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*;
|
||||
import gplx.xowa.wikis.domains.*;
|
||||
import gplx.xowa.addons.wikis.searchs.gui.htmlbars.*;
|
||||
import gplx.xowa.addons.wikis.searchs.searchers.crts.*;
|
||||
public class Srch_search_qry {
|
||||
public Srch_search_qry(byte tid, Srch_ns_mgr ns_mgr, Srch_search_phrase phrase, int slab_bgn, int slab_end) {
|
||||
this.Tid = tid;
|
||||
@@ -33,19 +34,19 @@ public class Srch_search_qry {
|
||||
public final int Slab_end; // EX: 20
|
||||
|
||||
public static final byte Tid_len = 4, Tid__url_bar = 0, Tid__suggest_box = 1, Tid__search_page = 2, Tid__android = 3;
|
||||
public static Srch_search_qry New__url_bar(Xow_wiki wiki, Srch_ns_mgr ns_mgr, boolean auto_wildcard, int max_results, byte[] search_orig) {
|
||||
return new Srch_search_qry(Tid__url_bar, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, auto_wildcard), 0, max_results);
|
||||
public static Srch_search_qry New__url_bar(Xow_wiki wiki, Srch_ns_mgr ns_mgr, Srch_crt_scanner_syms syms, boolean auto_wildcard, int max_results, byte[] search_orig) {
|
||||
return new Srch_search_qry(Tid__url_bar, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), syms, auto_wildcard, search_orig), 0, max_results);
|
||||
}
|
||||
public static Srch_search_qry New__suggest_box(Xow_wiki wiki, Srch_ns_mgr ns_mgr, int results_max, byte[] search_orig) {
|
||||
return new Srch_search_qry(Tid__suggest_box, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, Bool_.Y), 0, results_max);
|
||||
return new Srch_search_qry(Tid__suggest_box, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), Srch_crt_scanner_syms.Dflt, Bool_.Y, search_orig), 0, results_max);
|
||||
}
|
||||
public static Srch_search_qry New__search_page(Xow_domain_itm[] domains, Xow_wiki wiki, Srch_ns_mgr ns_mgr, boolean simple_search, byte[] search_orig, int slab_idx, int slab_len) {
|
||||
int slab_bgn = slab_idx * slab_len;
|
||||
int slab_end = slab_bgn + slab_len;
|
||||
boolean wildcard = simple_search;
|
||||
return new Srch_search_qry(Tid__search_page, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, wildcard), slab_bgn, slab_end);
|
||||
return new Srch_search_qry(Tid__search_page, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), Srch_crt_scanner_syms.Dflt, wildcard, search_orig), slab_bgn, slab_end);
|
||||
}
|
||||
public static Srch_search_qry New__drd(Xow_wiki wiki, Srch_ns_mgr ns_mgr, byte[] search_orig, int slab_bgn, int slab_end) {
|
||||
return new Srch_search_qry(Tid__android, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, Bool_.Y), slab_bgn, slab_end);
|
||||
return new Srch_search_qry(Tid__android, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), Srch_crt_scanner_syms.Dflt, Bool_.Y, search_orig), slab_bgn, slab_end);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,11 +92,13 @@ public class Srch_crt_scanner_syms {
|
||||
if (b == Byte_ascii.Null) return;
|
||||
rv.Add_bry_byte(b, tid);
|
||||
}
|
||||
public static final Srch_crt_scanner_syms Dflt =
|
||||
new Srch_crt_scanner_syms
|
||||
public static Srch_crt_scanner_syms New__dflt() {
|
||||
return new Srch_crt_scanner_syms
|
||||
( Byte_ascii.Backslash, Byte_ascii.Space, Byte_ascii.Quote, Byte_ascii.Dash, Byte_ascii.Plus, Byte_ascii.Comma
|
||||
, Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Star
|
||||
);
|
||||
}
|
||||
public static final Srch_crt_scanner_syms Dflt = New__dflt();
|
||||
private static byte Parse__val(byte[] line, int val_bgn, int line_len) {
|
||||
if (line_len - val_bgn == 1) return line[val_bgn];
|
||||
if ( line_len - val_bgn == 2
|
||||
|
||||
Reference in New Issue
Block a user