diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java index 0fa75f9db..7e4286352 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java @@ -37,4 +37,7 @@ public class Xocfg_mgr { public void Set_str(String ctx, String key, String val) { cache_mgr.Set(ctx, key, val); } + public void Del(String ctx, String key) { + cache_mgr.Del(ctx, key); + } } diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_grp.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_grp.java index f4a8e356c..698cf3e58 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_grp.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_grp.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.langs.mustaches.*; -public class Xogui_grp implements Xogui_nde, Mustache_doc_itm { - private Xogui_itm[] itms = new Xogui_itm[0]; +import gplx.core.gfobjs.*; +public class Xogui_grp implements Xogui_nde, Mustache_doc_itm { public Xogui_grp(int id, int sort, String key) { this.id = id; this.sort = sort; @@ -32,6 +32,8 @@ public class Xogui_grp implements Xogui_nde, Mustache_doc_itm { public String Lang() {return lang;} private String lang; public String Name() {return name;} private String name; public String Help() {return help;} private String help; + + public Xogui_itm[] Itms() {return itms;} private Xogui_itm[] itms = new Xogui_itm[0]; public void Load_by_i18n(String lang, String name, String help) { this.lang = lang; this.name = name; @@ -43,6 +45,23 @@ public class Xogui_grp implements Xogui_nde, Mustache_doc_itm { public void Itms_(Xogui_itm[] v) { this.itms = v; } + public Gfobj_nde To_nde() { + Gfobj_nde rv = Gfobj_nde.New(); + rv.Add_int("id", id); + rv.Add_str("key", key); + rv.Add_str("lang", lang); + rv.Add_str("name", name); + rv.Add_str("help", help); + + List_adp list = List_adp_.New(); + int len = itms.length; + for (int i = 0; i < len; i++) { + Xogui_itm itm = itms[i]; + list.Add(itm.To_nde()); + } + rv.Add_ary("itms", new Gfobj_ary((Gfobj_nde[])list.To_ary_and_clear(Gfobj_nde.class))); + return rv; + } public boolean Mustache__write(String k, Mustache_bfr bfr) { if (String_.Eq(k, "id")) bfr.Add_int(id); else if (String_.Eq(k, "key")) bfr.Add_str_u8(key); diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm.java index 813abbd70..7aefc8c25 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.langs.mustaches.*; +import gplx.core.gfobjs.*; import gplx.langs.jsons.*; public class Xogui_itm implements Xogui_nde, Mustache_doc_itm { public Xogui_itm(int id, int sort) { this.id = id; @@ -30,6 +31,7 @@ public class Xogui_itm implements Xogui_nde, Mustache_doc_itm { public String Gui_args() {return gui_args;} private String gui_args; public String Key() {return key;} private String key; public String Dflt() {return dflt;} private String dflt; + public boolean Edited() {return edited;} private boolean edited; public String Lang() {return lang;} private String lang; public String Name() {return name;} private String name; @@ -54,11 +56,33 @@ public class Xogui_itm implements Xogui_nde, Mustache_doc_itm { this.ctx = ctx; this.val = val; this.date = date; + this.edited = true; } public void Set_data_by_dflt() { this.ctx = Ctx__app; this.val = dflt; this.date = String_.Empty; + this.edited = false; + } + public Gfobj_nde To_nde() { + Gfobj_nde rv = Gfobj_nde.New(); + rv.Add_int("id", id); + rv.Add_str("key", key); + rv.Add_str("dflt", lang); + rv.Add_str("lang", lang); + rv.Add_str("name", name); + rv.Add_str("help", help); + rv.Add_str("ctx", ctx); + rv.Add_str("val", val); + rv.Add_str("date", date); + Bry_bfr bfr = Bry_bfr_.New(); + To_html(bfr); + // rv.Add_str("html", String_.Replace(bfr.To_str_and_clear(), "'", "\\\"")); + rv.Add_str("html", bfr.To_str_and_clear()); + return rv; + } + private void To_html(Bry_bfr bfr) { + new Xogui_itm_html().Build_html(bfr, key, name, gui_type, gui_args, val); } public boolean Mustache__write(String k, Mustache_bfr bfr) { if (String_.Eq(k, "id")) bfr.Add_int(id); @@ -70,11 +94,12 @@ public class Xogui_itm implements Xogui_nde, Mustache_doc_itm { else if (String_.Eq(k, "ctx")) bfr.Add_str_u8(ctx); else if (String_.Eq(k, "val")) bfr.Add_str_u8(val); else if (String_.Eq(k, "date")) bfr.Add_str_u8(date); - else if (String_.Eq(k, "html")) new Xogui_itm_html().Build_html(bfr.Bfr(), key, name, gui_type, gui_args, val); + else if (String_.Eq(k, "html")) To_html(bfr.Bfr()); return true; } public static String Ctx__app = "app"; - public Mustache_doc_itm[] Mustache__subs(String key) { + public Mustache_doc_itm[] Mustache__subs(String k) { + if (String_.Eq(k, "edited")) return Mustache_doc_itm_.Ary__bool(edited); return Mustache_doc_itm_.Ary__empty; } } diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm_html.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm_html.java index da0d46c38..788c599a2 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm_html.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm_html.java @@ -21,26 +21,26 @@ public class Xogui_itm_html { public void Build_html(Bry_bfr bfr, String key, String name, int gui_type, String gui_args, String data) { switch (gui_type) { case Xoitm_gui_tid.Tid__checkbox: - bfr.Add_str_u8_fmt("", key, String_.Eq(data, "y") ? " checked='checked'" : ""); + bfr.Add_str_u8_fmt("", key, String_.Eq(data, "y") ? " checked=\"checked\"" : ""); break; case Xoitm_gui_tid.Tid__numeric: - bfr.Add_str_u8_fmt("", key, data); + bfr.Add_str_u8_fmt("", key, data); break; case Xoitm_gui_tid.Tid__textbox: - bfr.Add_str_u8_fmt("", key, data); + bfr.Add_str_u8_fmt("", key, data); break; case Xoitm_gui_tid.Tid__memo: - bfr.Add_str_u8_fmt("", key, data); + bfr.Add_str_u8_fmt("", key, data); break; case Xoitm_gui_tid.Tid__select: - bfr.Add_str_u8_fmt("", key); for (int i = 0; i < 3; i++) { - bfr.Add_str_u8_fmt("", i, i, i == 2 ? " selected='selected'" : ""); + bfr.Add_str_u8_fmt("", i, i, i == 2 ? " selected=\"selected\"" : ""); } bfr.Add_str_u8_fmt(""); break; case Xoitm_gui_tid.Tid__fs_file: - bfr.Add_str_u8_fmt("", key, data); + bfr.Add_str_u8_fmt("", key, data); break; } } diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_mgr.java index 1f0b40ce6..fafbfeca2 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_mgr.java @@ -23,33 +23,84 @@ public class Xogui_mgr { public Xogui_mgr(Xocfg_db_mgr db_mgr) { this.db_mgr = db_mgr; } - public Xogui_grp Get_by_grp(String grp_key, String ctx, String lang) { - // create hashes - Ordered_hash owner_hash = Ordered_hash_.New(); - Xogui_nde_hash grp_regy = new Xogui_nde_hash(); - Xogui_nde_hash itm_regy = new Xogui_nde_hash(); + public Xogui_root Get_root(String grp_key, String ctx, String lang) { + // create lists + Ordered_hash grp_temp = Ordered_hash_.New(); + Xogui_nde_hash grp_list = new Xogui_nde_hash(); + Xogui_nde_hash itm_list = new Xogui_nde_hash(); // get root_itm Xogrp_meta_itm grp_meta = db_mgr.Tbl__grp_meta().Select_by_key_or_null(grp_key); if (grp_meta == null) throw Err_.new_wo_type("cfg:grp not found", "grp", grp_key); Xogui_grp owner = new Xogui_grp(grp_meta.Id(), 0, grp_meta.Key()); - owner_hash.Add(grp_meta.Id(), owner); - grp_regy.Add(owner); + grp_temp.Add(grp_meta.Id(), owner); + grp_list.Add(owner); - // load tree by selecting subs until no more owners - while (owner_hash.Count() > 0) { - owner = (Xogui_grp)owner_hash.Get_at(0); - owner_hash.Del(owner.Id()); - Load_subs(grp_regy, itm_regy, owner_hash, owner); + // load tree by selecting subs until no more grps + while (grp_temp.Count() > 0) { + owner = (Xogui_grp)grp_temp.Get_at(0); + grp_temp.Del(owner.Id()); + Load_subs(grp_list, itm_list, grp_temp, owner); } // load itms and i18n - Load_itm_meta(itm_regy); - Load_itm_data(itm_regy, ctx); - Load_i18n(grp_regy, itm_regy, lang); - return owner; + Load_itm_meta(itm_list); + Load_itm_data(itm_list, ctx); + Load_i18n(grp_list, itm_list, lang); + + grp_list.Delete_container_grps(); + return new Xogui_root(Load_nav_mgr(grp_key), (Xogui_grp[])grp_list.To_grp_ary_and_clear()); + } + private Xogui_nav_mgr Load_nav_mgr(String grp_key) { + // get grp_id + String sql = Db_sql_.Make_by_fmt(String_.Ary + ( "SELECT grp_id" + , "FROM cfg_grp_meta" + , "WHERE grp_key = '{0}'" + ), grp_key + ); + int grp_id = -1; + Db_rdr rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto(); + try {grp_id = rdr.Move_next() ? rdr.Read_int("grp_id") : -1;} + finally {rdr.Rls();} + + // get owner_id + sql = Db_sql_.Make_by_fmt(String_.Ary + ( "SELECT map_src" + , "FROM cfg_grp_map" + , "WHERE map_trg = {0}" + ), grp_id + ); + int owner_id = -1; + rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto(); + try {owner_id = rdr.Move_next() ? rdr.Read_int("map_src") : -1;} + finally {rdr.Rls();} + + // get peers + sql = Db_sql_.Make_by_fmt(String_.Ary + ( "SELECT m.map_trg" + , ", m.map_sort" + , ", t.grp_key" + , "FROM cfg_grp_map m" + , " LEFT JOIN cfg_grp_meta t ON m.map_trg = t.grp_id" + , "WHERE m.map_src = {0}" + , "ORDER BY m.map_sort" + ), owner_id + ); + List_adp list = List_adp_.New(); + try { + rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto(); + while (rdr.Move_next()) { + String nav_key = rdr.Read_str("grp_key"); + list.Add(new Xogui_nav_itm(String_.Eq(grp_key, nav_key), nav_key, nav_key)); + } + } + finally { + rdr.Rls(); + } + return new Xogui_nav_mgr((Xogui_nav_itm[])list.To_ary_and_clear(Xogui_nav_itm.class)); } - private void Load_subs(Xogui_nde_hash grp_regy, Xogui_nde_hash itm_regy, Ordered_hash owner_hash, Xogui_grp owner) { + private void Load_subs(Xogui_nde_hash grp_list, Xogui_nde_hash itm_list, Ordered_hash grp_temp, Xogui_grp owner) { String sql = Db_sql_.Make_by_fmt(String_.Ary ( "SELECT m.map_trg" , ", m.map_sort" @@ -63,24 +114,24 @@ public class Xogui_mgr { List_adp itms_list = List_adp_.New(); while (rdr.Move_next()) { String grp_key = rdr.Read_str("grp_key"); - // nde is grp + // nde is itm if (grp_key == null) { Xogui_itm gui_itm = new Xogui_itm(rdr.Read_int("map_trg"), rdr.Read_int("map_sort")); itms_list.Add(gui_itm); - itm_regy.Add(gui_itm); + itm_list.Add(gui_itm); } // nde is grp else { Xogui_grp gui_grp = new Xogui_grp(rdr.Read_int("map_trg"), rdr.Read_int("map_sort"), grp_key); owner.Grps__add(gui_grp); - grp_regy.Add(gui_grp); - owner_hash.Add(gui_grp.Id(), gui_grp); + grp_list.Add(gui_grp); + grp_temp.Add(gui_grp.Id(), gui_grp); } } owner.Itms_((Xogui_itm[])itms_list.To_ary_and_clear(Xogui_itm.class)); } - private void Load_itm_meta(Xogui_nde_hash itm_regy) { - Xogui_nde_iter iter = Xogui_nde_iter.New_sql(itm_regy); + private void Load_itm_meta(Xogui_nde_hash itm_list) { + Xogui_nde_iter iter = Xogui_nde_iter.New_sql(itm_list); while (iter.Move_next()) { String sql = Db_sql_.Make_by_fmt(String_.Ary ( "SELECT t.itm_id" @@ -96,13 +147,13 @@ public class Xogui_mgr { Db_rdr rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto(); while (rdr.Move_next()) { - Xogui_itm gui_itm = (Xogui_itm)itm_regy.Get_by_or_fail(rdr.Read_int("itm_id")); + Xogui_itm gui_itm = (Xogui_itm)itm_list.Get_by_or_fail(rdr.Read_int("itm_id")); gui_itm.Load_by_meta(rdr.Read_str("itm_key"), rdr.Read_int("itm_scope_id"), rdr.Read_int("itm_gui_type"), rdr.Read_str("itm_gui_args"), rdr.Read_str("itm_dflt")); } } } - private void Load_itm_data(Xogui_nde_hash itm_regy, String... ctxs) { - Xogui_nde_hash cur_regy = new Xogui_nde_hash().Merge(itm_regy); + private void Load_itm_data(Xogui_nde_hash itm_list, String... ctxs) { + Xogui_nde_hash cur_regy = new Xogui_nde_hash().Merge(itm_list); // loop ctxs where later ctxs are more general defaults; EX: ["en.w", "en.*", "*.w", "app"] int ctxs_len = ctxs.length; @@ -140,8 +191,8 @@ public class Xogui_mgr { itm.Set_data_by_dflt(); } } - private void Load_i18n(Xogui_nde_hash grp_regy, Xogui_nde_hash itm_regy, String... langs) { - Xogui_nde_hash cur_regy = new Xogui_nde_hash().Merge(grp_regy).Merge(itm_regy); + private void Load_i18n(Xogui_nde_hash grp_list, Xogui_nde_hash itm_list, String... langs) { + Xogui_nde_hash cur_regy = new Xogui_nde_hash().Merge(grp_list).Merge(itm_list); // loop langs where later langs are fallbacks; EX: ["de", "en"] int langs_len = langs.length; diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nav_itm.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nav_itm.java new file mode 100644 index 000000000..d226ca785 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nav_itm.java @@ -0,0 +1,37 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; +import gplx.langs.mustaches.*; +public class Xogui_nav_itm implements Mustache_doc_itm { + private final boolean selected; + private final String key, text; + public Xogui_nav_itm(boolean selected, String key, String text) { + this.selected = selected; + this.key = key; + this.text = text; + } + public boolean Mustache__write(String k, Mustache_bfr bfr) { + if (String_.Eq(k, "key")) bfr.Add_str_u8(key); + else if (String_.Eq(k, "text")) bfr.Add_str_u8(text); + return true; + } + public Mustache_doc_itm[] Mustache__subs(String k) { + if (String_.Eq(k, "selected")) return Mustache_doc_itm_.Ary__bool(selected); + return Mustache_doc_itm_.Ary__empty; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nav_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nav_mgr.java new file mode 100644 index 000000000..76f7f6439 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nav_mgr.java @@ -0,0 +1,32 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; +import gplx.langs.mustaches.*; +public class Xogui_nav_mgr implements Mustache_doc_itm { + public Xogui_nav_itm[] Itms() {return itms;} private final Xogui_nav_itm[] itms; + public Xogui_nav_mgr(Xogui_nav_itm[] itms) { + this.itms = itms; + } + public boolean Mustache__write(String k, Mustache_bfr bfr) { + return true; + } + public Mustache_doc_itm[] Mustache__subs(String k) { + if (String_.Eq(k, "itms")) return itms; + return Mustache_doc_itm_.Ary__empty; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nde_hash.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nde_hash.java index 5f97f53f9..0842d8f14 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nde_hash.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_nde_hash.java @@ -31,6 +31,24 @@ class Xogui_nde_hash { public Xogui_nde Get_by_or_fail(int id) { return (Xogui_nde)hash.Get_by_or_fail(id); } + public Xogui_grp[] To_grp_ary_and_clear() { + return (Xogui_grp[])hash.To_ary_and_clear(Xogui_grp.class); + } + public void Delete_container_grps() {// remove container grps else headers with no items will show up + int len = hash.Len(); + for (int i = 0; i < len; i++) { + Xogui_grp grp = (Xogui_grp)hash.Get_at(i); + if (grp.Itms().length == 0) + deleted.Add(grp); + } + + len = deleted.Len(); + for (int i = 0; i < len; i++) { + Xogui_grp grp = (Xogui_grp)deleted.Get_at(i); + hash.Del(grp.Id()); + } + } + public Xogui_nde_hash Merge(Xogui_nde_hash src) { int len = src.Len(); for (int i = 0; i < len; i++) { diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_root.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_root.java new file mode 100644 index 000000000..92000a82d --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_root.java @@ -0,0 +1,47 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; +import gplx.langs.mustaches.*; +import gplx.core.gfobjs.*; +public class Xogui_root implements Mustache_doc_itm { + private final Xogui_nav_mgr[] nav_mgrs; + private final Xogui_grp[] grps; + public Xogui_root(Xogui_nav_mgr nav_mgr, Xogui_grp[] grps) { + this.nav_mgrs = nav_mgr.Itms().length == 0 ? new Xogui_nav_mgr[0] : new Xogui_nav_mgr[] {nav_mgr}; + this.grps = grps; + } + public Gfobj_nde To_nde() { + Gfobj_nde rv = Gfobj_nde.New(); + List_adp list = List_adp_.New(); + int len = grps.length; + for (int i = 0; i < len; i++) { + Xogui_grp itm = grps[i]; + list.Add(itm.To_nde()); + } + rv.Add_ary("grps", new Gfobj_ary((Gfobj_nde[])list.To_ary_and_clear(Gfobj_nde.class))); + return rv; + } + public boolean Mustache__write(String k, Mustache_bfr bfr) { + return true; + } + public Mustache_doc_itm[] Mustache__subs(String key) { + if (String_.Eq(key, "grps")) return grps; + else if (String_.Eq(key, "nav")) return nav_mgrs; + return Mustache_doc_itm_.Ary__empty; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_grp.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_grp.java index ea4496183..08d53c40d 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_grp.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_grp.java @@ -19,12 +19,12 @@ package gplx.xowa.addons.apps.cfgs.mgrs; import gplx.*; import gplx.xowa.*; impo class Xocfg_cache_grp { private final Hash_adp vals = Hash_adp_.New(); private final Ordered_hash subs = Ordered_hash_.New(); - private final String dflt; public Xocfg_cache_grp(String key, String dflt) { this.key = key; this.dflt = dflt; } public String Key() {return key;} private final String key; + public String Dflt() {return dflt;} private final String dflt; public String Get(String ctx) { // exact match; EX: "en.w|key_1" Xocfg_cache_itm rv = (Xocfg_cache_itm)vals.Get_by(ctx); @@ -47,6 +47,9 @@ class Xocfg_cache_grp { rv.Val_(val); } } + public void Del(String ctx) { + vals.Del(ctx); + } public void Add(String ctx, Xocfg_cache_itm itm) { vals.Add(ctx, itm); } @@ -68,7 +71,8 @@ class Xocfg_cache_grp { Pub(list, val); } } - Pub(list, val); + if (list != null) // NOTE: check for null as it's possible for no subscribers + Pub(list, val); } private void Pub(List_adp list, String val) { int len = list.Len(); diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr.java index b5742784f..3781e4f96 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr.java @@ -37,6 +37,12 @@ public class Xocfg_cache_mgr { db_mgr.Set_str(ctx, key, val); grp.Pub(ctx, val); } + public void Del(String ctx, String key) { + Xocfg_cache_grp grp = Grps__get_or_load(key); + grp.Del(ctx); + db_mgr.Del(ctx, key); + grp.Pub(ctx, grp.Dflt()); + } public void Sub(Gfo_invk sub, String ctx, String key, String evt) { Xocfg_cache_grp grp = Grps__get_or_load(key); grp.Sub(sub, ctx, evt); diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_bridge.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_bridge.java index 74ef15e81..1ce0d0907 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_bridge.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_bridge.java @@ -31,15 +31,17 @@ public class Xocfg_list_bridge implements Bridge_cmd_itm { switch (proc_id) { case Proc__upsert: mgr.Upsert(args); break; case Proc__revert: mgr.Revert(args); break; + case Proc__load: mgr.Load(args); break; default: throw Err_.new_unhandled_default(proc_id); } return Bridge_cmd_mgr.Msg__ok; } - private static final byte Proc__upsert = 0, Proc__revert = 1; + private static final byte Proc__upsert = 0, Proc__revert = 1, Proc__load = 2; private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs() .Add_str_byte("upsert" , Proc__upsert) .Add_str_byte("revert" , Proc__revert) + .Add_str_byte("load" , Proc__load) ; public byte[] Key() {return BRIDGE_KEY;} public static final byte[] BRIDGE_KEY = Bry_.new_a7("cfg.item.exec"); diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_bridge_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_bridge_mgr.java index 61d41875b..35eaf4287 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_bridge_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_bridge_mgr.java @@ -17,9 +17,10 @@ along with this program. If not, see . */ package gplx.xowa.addons.apps.cfgs.specials.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.langs.jsons.*; -import gplx.xowa.addons.apps.cfgs.dbs.*; +import gplx.xowa.guis.cbks.*; import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.gui.*; public class Xocfg_list_bridge_mgr { private final Xoa_app app; + private final Xog_cbk_trg cbk_trg = Xog_cbk_trg.New(Xocfg_list_special.Prototype.Special__meta().Ttl_bry()); public Xocfg_list_bridge_mgr(Xoa_app app) { this.app = app; } @@ -30,8 +31,15 @@ public class Xocfg_list_bridge_mgr { app.Cfg().Set_str(ctx, key, val); } public void Revert(Json_nde args) { -// String ctx = args.Get_as_str("ctx"); -// String key = args.Get_as_str("key"); -// app.Cfg().d.Del(ctx, key); + String ctx = args.Get_as_str("ctx"); + String key = args.Get_as_str("key"); + app.Cfg().Del(ctx, key); + } + public void Load(Json_nde args) { + String ctx = args.Get_as_str("ctx"); + String key = args.Get_as_str("key"); + Xogui_mgr gui_mgr = new Xogui_mgr(new Xocfg_db_mgr(app.User().User_db_mgr().Conn())); + Xogui_root gui_root = gui_mgr.Get_root(key, ctx, "en"); + app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_list.load__recv", gui_root.To_nde()); } } diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_html.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_html.java index 93c695799..132e69ee4 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_html.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/lists/Xocfg_list_html.java @@ -26,18 +26,22 @@ class Xocfg_list_html extends Xow_special_wtr__base { this.lang = lang; } @Override protected Io_url Get_addon_dir(Xoa_app app) {return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "app", "cfg", "list");} - @Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xocfg_list.mustache.html");} + @Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xocfg_list.core.mustache.html");} @Override protected Mustache_doc_itm Bld_mustache_root(Xoa_app app) { Xogui_mgr mgr = Xogui_mgr.New(app); - return mgr.Get_by_grp(grp_key, ctx, lang); + return mgr.Get_root(grp_key, ctx, lang); } @Override protected void Bld_tags(Xoa_app app, Io_url addon_dir, Xopage_html_data page_data) { Xopg_tag_mgr head_tags = page_data.Head_tags(); Xopg_tag_wtr_.Add__xocss (head_tags, app.Fsys_mgr().Http_root()); Xopg_tag_wtr_.Add__xohelp (head_tags, app.Fsys_mgr().Http_root()); Xopg_tag_wtr_.Add__xolog (head_tags, app.Fsys_mgr().Http_root()); + Xopg_tag_wtr_.Add__xoelem (head_tags, app.Fsys_mgr().Http_root()); + Xopg_tag_wtr_.Add__mustache (head_tags, app.Fsys_mgr().Http_root()); + Xopg_tag_wtr_.Add__xotmpl (head_tags, app.Fsys_mgr().Http_root()); Xopg_tag_wtr_.Add__xoajax (head_tags, app.Fsys_mgr().Http_root(), app); + head_tags.Add(Xopg_tag_itm.New_htm_frag(addon_dir.GenSubFil_nest("bin", "xocfg_list.grps.mustache.html"), "xocfg.grps")); head_tags.Add(Xopg_tag_itm.New_css_file(addon_dir.GenSubFil_nest("bin", "xocfg_list.css"))); head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("bin", "xocfg_list.js"))); } diff --git a/400_xowa/src/gplx/xowa/wikis/pages/tags/Xopg_tag_wtr_.java b/400_xowa/src/gplx/xowa/wikis/pages/tags/Xopg_tag_wtr_.java index bc880eb32..0a38efd6d 100644 --- a/400_xowa/src/gplx/xowa/wikis/pages/tags/Xopg_tag_wtr_.java +++ b/400_xowa/src/gplx/xowa/wikis/pages/tags/Xopg_tag_wtr_.java @@ -37,6 +37,14 @@ public class Xopg_tag_wtr_ { head_tags.Add(Xopg_tag_itm.New_css_file(dir.GenSubFil_nest("xo.log.css"))); head_tags.Add(Xopg_tag_itm.New_js_file(dir.GenSubFil_nest("xo.log.js"))); } + public static void Add__xotmpl(Xopg_tag_mgr head_tags, Io_url http_root) { + Io_url dir = http_root.GenSubDir_nest("bin", "any", "xowa", "html", "res", "src", "xowa", "xotmpl"); + head_tags.Add(Xopg_tag_itm.New_js_file(dir.GenSubFil_nest("xo.tmpl.js"))); + } + public static void Add__xoelem(Xopg_tag_mgr head_tags, Io_url http_root) { + Io_url dir = http_root.GenSubDir_nest("bin", "any", "xowa", "html", "res", "src", "xowa", "xoelem"); + head_tags.Add(Xopg_tag_itm.New_js_file(dir.GenSubFil_nest("xo.elem.js"))); + } public static void Add__xoajax(Xopg_tag_mgr head_tags, Io_url http_root, Xoa_app app) { Io_url dir = http_root.GenSubDir_nest("bin", "any", "xowa", "html", "res", "src", "xowa", "xoajax"); head_tags.Add(Xopg_tag_itm.New_js_file(dir.GenSubFil_nest("xo.app.js")));