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]);
+ }
}
}