diff --git a/400_xowa/src/gplx/langs/mustaches/Mustache_bfr.java b/400_xowa/src/gplx/langs/mustaches/Mustache_bfr.java index 9eb34e9b2..d6442343f 100644 --- a/400_xowa/src/gplx/langs/mustaches/Mustache_bfr.java +++ b/400_xowa/src/gplx/langs/mustaches/Mustache_bfr.java @@ -25,6 +25,7 @@ public class Mustache_bfr { public void Add_long (long v) {bfr.Add_long_variable(v);} public void Add_double (double v) {bfr.Add_double(v);} public void Add_str_u8 (String v) {bfr.Add_str_u8(v);} + public void Add_str_u8_safe (String v) {if (v != null) bfr.Add_str_u8(v);} public void Add_mid (byte[] src, int bgn, int end) {bfr.Add_mid(src, bgn, end);} public void Add_bry (byte[] v) { if (v == null) return; // allow items to have null props diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 150b671cf..c7a111385 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -32,7 +32,7 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final String Version = "3.11.2.1"; + public static final String Version = "3.11.2.2"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys_str; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xogrp_map_tbl.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xogrp_map_tbl.java index 7cd970c6c..5bd8bb159 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xogrp_map_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xogrp_map_tbl.java @@ -32,14 +32,14 @@ public class Xogrp_map_tbl implements Db_tbl { public String Tbl_name() {return tbl_name;} private final String tbl_name; public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Upsert(int map_src, int map_trg, int map_sort) { - Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__map_src), map_src, map_trg, map_sort); + Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__map_src, fld__map_trg), map_src, map_trg, map_sort); } public int Select_next_sort(int owner_id) { - Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__map_src).Crt_int(fld__map_src, owner_id).Exec_select__rls_auto(); + Db_rdr rdr = conn.Stmt_sql("SELECT Max(map_sort) AS map_sort FROM cfg_grp_map WHERE map_src = ?").Crt_int(fld__map_src, owner_id).Exec_select__rls_auto(); try { - return rdr.Move_next() - ? rdr.Read_int(fld__map_sort) + 1 - : 0; + if (!rdr.Move_next()) return 0; + Object max = rdr.Read_obj(fld__map_sort); + return max == null ? 0 : Int_.cast(max) + 1; } finally {rdr.Rls();} } diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xonde_i18n_tbl.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xonde_i18n_tbl.java index 4ffc8e12e..4a4732f85 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xonde_i18n_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xonde_i18n_tbl.java @@ -34,7 +34,7 @@ public class Xonde_i18n_tbl implements Db_tbl { public String Tbl_name() {return tbl_name;} private final String tbl_name; public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Upsert(int nde_tid, int nde_id, String nde_lang, String nde_name, String nde_help) { - Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__nde_tid, fld__nde_id, fld__nde_lang), nde_tid, nde_id, nde_lang, nde_name, nde_help); + Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__nde_id, fld__nde_tid, fld__nde_lang), nde_id, nde_tid, nde_lang, nde_name, nde_help); } public Xonde_i18n_itm Select_by_id_or_null(int id) { Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__nde_id).Crt_int(fld__nde_id, id).Exec_select__rls_auto(); 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 7705037dd..9b7c895c7 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 @@ -18,6 +18,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.*; public class Xogui_grp implements Xogui_nde, Mustache_doc_itm { + private Xogui_itm[] itms = new Xogui_itm[0]; public Xogui_grp(int id, int sort, String key) { this.id = id; this.sort = sort; @@ -39,14 +40,17 @@ public class Xogui_grp implements Xogui_nde, Mustache_doc_itm { public void Grps__add(Xogui_grp grp) { } - public void Itms__add(Xogui_itm itm) { + public void Itms_(Xogui_itm[] v) { + this.itms = v; } - public boolean Mustache__write(String key, Mustache_bfr bfr) { - if (String_.Eq(key, "id")) bfr.Add_int(id); - else if (String_.Eq(key, "key")) bfr.Add_str_u8(key); + 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); + else if (String_.Eq(k, "name")) bfr.Add_str_u8_safe(name); return false; } public Mustache_doc_itm[] Mustache__subs(String key) { + if (String_.Eq(key, "itms")) return itms; return Mustache_doc_itm_.Ary__empty; } } 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 6c2eecf01..a0ba86c48 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 @@ -16,7 +16,8 @@ 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.*; -public class Xogui_itm implements Xogui_nde { +import gplx.langs.mustaches.*; +public class Xogui_itm implements Xogui_nde, Mustache_doc_itm { public Xogui_itm(int id, int sort) { this.id = id; this.sort = sort; @@ -59,4 +60,12 @@ public class Xogui_itm implements Xogui_nde { this.val = dflt; this.date = String_.Empty; } + public boolean Mustache__write(String key, Mustache_bfr bfr) { + if (String_.Eq(key, "name")) bfr.Add_str_u8(name); + else if (String_.Eq(key, "html")) new Xogui_itm_html().Build_html(bfr.Bfr(), name, gui_type, gui_args, val); + return true; + } + public Mustache_doc_itm[] Mustache__subs(String key) { + 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 new file mode 100644 index 000000000..b7b484b70 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/gui/Xogui_itm_html.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.xowa.addons.apps.cfgs.dbs.*; +public class Xogui_itm_html { + public void Build_html(Bry_bfr bfr, String name, int gui_type, String gui_args, String data) { + switch (gui_type) { + case Xoitm_gui_tid.Tid__checkbox: + bfr.Add_str_u8_fmt("", String_.Eq(data, "true") ? " checked='checked'" : ""); + break; + case Xoitm_gui_tid.Tid__numeric: + bfr.Add_str_u8_fmt("", data); + break; + case Xoitm_gui_tid.Tid__textbox: + bfr.Add_str_u8_fmt("", data); + break; + case Xoitm_gui_tid.Tid__memo: + bfr.Add_str_u8_fmt("", data); + break; + case Xoitm_gui_tid.Tid__select: + bfr.Add_str_u8_fmt(""); + break; + case Xoitm_gui_tid.Tid__fs_file: + bfr.Add_str_u8_fmt("", 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 7e789eb01..1f0b40ce6 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 @@ -34,6 +34,7 @@ public class Xogui_mgr { 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); // load tree by selecting subs until no more owners while (owner_hash.Count() > 0) { @@ -50,31 +51,33 @@ public class Xogui_mgr { } private void Load_subs(Xogui_nde_hash grp_regy, Xogui_nde_hash itm_regy, Ordered_hash owner_hash, Xogui_grp owner) { String sql = Db_sql_.Make_by_fmt(String_.Ary - ( "SELECT m.trg_id" - , ", m.sort_id" + ( "SELECT m.map_trg" + , ", m.map_sort" , ", t.grp_key" , "FROM cfg_grp_map m" - , " LEFT JOIN cfg_grp_meta t ON m.trg_id = t.grp_id" - , "WHERE m.src_id = {0}" + , " LEFT JOIN cfg_grp_meta t ON m.map_trg = t.grp_id" + , "WHERE m.map_src = {0}" ), owner.Id() ); Db_rdr rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto(); + List_adp itms_list = List_adp_.New(); while (rdr.Move_next()) { String grp_key = rdr.Read_str("grp_key"); // nde is grp if (grp_key == null) { - Xogui_itm gui_itm = new Xogui_itm(rdr.Read_int("trg_id"), rdr.Read_int("sort_id")); - owner.Itms__add(gui_itm); + 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); } // nde is grp else { - Xogui_grp gui_grp = new Xogui_grp(rdr.Read_int("trg_id"), rdr.Read_int("sort_id"), grp_key); + 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); } } + 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); @@ -152,7 +155,7 @@ public class Xogui_mgr { , ", h.nde_name" , ", h.nde_help" , ", h.nde_lang" - , "FROM cfg_itm_meta t" + , "FROM cfg_nde_i18n h" , "WHERE h.nde_id IN ({0})" , "AND h.nde_lang = '{1}'" ), cur_iter.To_sql_in() @@ -162,7 +165,7 @@ public class Xogui_mgr { // read and set i18n Db_rdr rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto(); while (rdr.Move_next()) { - Xogui_nde gui_itm = (Xogui_itm)cur_regy.Get_at(rdr.Read_int("nde_id")); + Xogui_nde gui_itm = (Xogui_nde)cur_regy.Get_by_or_fail(rdr.Read_int("nde_id")); gui_itm.Load_by_i18n(rdr.Read_str("nde_lang"), rdr.Read_str("nde_name"), rdr.Read_str("nde_help")); cur_regy.Deleted__add(gui_itm); } 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 5798d54dc..5f97f53f9 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 @@ -62,6 +62,7 @@ class Xogui_nde_iter { public String To_sql_in() { Bry_bfr bfr = Bry_bfr_.New(); int end = bgn + max; + if (end > hash.Len()) end = hash.Len(); for (int i = bgn; i < end; i++) { Xogui_nde nde = hash.Get_at(i); if (i != bgn) bfr.Add_byte_comma(); diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/items/Xocfg_item_bridge.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/items/Xocfg_item_bridge.java index 25ffaea21..10f94d006 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/items/Xocfg_item_bridge.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/items/Xocfg_item_bridge.java @@ -35,12 +35,16 @@ public class Xocfg_item_bridge implements gplx.xowa.htmls.bridges.Bridge_cmd_itm private void Save(Json_nde args) { String data = args.Get_as_str("data"); gplx.xowa.addons.apps.cfgs.dbs.Xocfg_itm_bldr itm_bldr = new gplx.xowa.addons.apps.cfgs.dbs.Xocfg_itm_bldr(new gplx.xowa.addons.apps.cfgs.dbs.Xocfg_db_mgr(app.User().User_db_mgr().Conn())); - String[] ary = String_.Split(data, "|"); - if (String_.Eq(ary[0], "grp")) { - itm_bldr.Create_grp(ary[1], ary[2], ary[3], ary[4]); - } - else { - itm_bldr.Create_itm(ary[1], ary[2], ary[3], ary[4], ary[5], ary[6], ary[7], ary[8]); + String[] lines = String_.Split(data, "\n"); + for (String line : lines) { + String[] ary = String_.Split(line, "|"); + if (ary.length < 4) continue; + if (String_.Eq(ary[0], "grp")) { + itm_bldr.Create_grp(ary[1], ary[2], ary[3], ary[4]); + } + else { + itm_bldr.Create_itm(ary[1], ary[2], ary[3], ary[4], ary[5], ary[6], ary[7], ary[8]); + } } }