Cfg: Consolidate data_type and gui_type; Add some basic error validation

pull/620/head
gnosygnu 8 years ago
parent fd12ed88a4
commit 15504c03a7

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx; package gplx;
import gplx.langs.gfs.*; import gplx.langs.gfs.*;
public class Bool_ { public class Bool_ {
public static final String Cls_val_name = "boolean"; public static final String Cls_val_name = "bool";
public static final Class<?> Cls_ref_type = Boolean.class; public static final Class<?> Cls_ref_type = Boolean.class;
public static final boolean N = false , Y = true; public static final boolean N = false , Y = true;
public static final byte N_byte = 0 , Y_byte = 1 , __byte = 127; public static final byte N_byte = 0 , Y_byte = 1 , __byte = 127;

@ -17,22 +17,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package gplx.xowa.addons.apps.cfgs.dbs.tbls; 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.*; package gplx.xowa.addons.apps.cfgs.dbs.tbls; 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 Xocfg_itm_row { public class Xocfg_itm_row {
public Xocfg_itm_row(int id, int scope_id, String data_type, int gui_type, String gui_args, String gui_cls, String key, String dflt) { public Xocfg_itm_row(int id, String key, int scope, String type, String dflt, String html_atrs, String html_cls) {
this.id = id; this.id = id;
this.scope_id = scope_id;
this.data_type = data_type;
this.gui_type = gui_type;
this.gui_args = gui_args;
this.gui_cls = gui_cls;
this.key = key; this.key = key;
this.scope = scope;
this.type = type;
this.dflt = dflt; this.dflt = dflt;
this.html_atrs = html_atrs;
this.html_cls = html_cls;
} }
public int Id() {return id;} private final int id; public int Id() {return id;} private final int id;
public int Scope_id() {return scope_id;} private final int scope_id;
public String Data_type() {return data_type;} private final String data_type;
public int Gui_type() {return gui_type;} private final int gui_type;
public String Gui_args() {return gui_args;} private final String gui_args;
public String Gui_cls() {return gui_cls;} private final String gui_cls;
public String Key() {return key;} private final String key; public String Key() {return key;} private final String key;
public int Scope() {return scope;} private final int scope;
public String Type() {return type;} private final String type;
public String Dflt() {return dflt;} private final String dflt; public String Dflt() {return dflt;} private final String dflt;
public String Html_atrs() {return html_atrs;} private final String html_atrs;
public String Html_cls() {return html_cls;} private final String html_cls;
} }

@ -19,19 +19,18 @@ package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*; import gplx.dbs.utls.*; import gplx.dbs.*; import gplx.dbs.utls.*;
public class Xocfg_itm_tbl implements Db_tbl { public class Xocfg_itm_tbl implements Db_tbl {
private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__itm_id, fld__itm_key, fld__itm_scope_id, fld__itm_data_type, fld__itm_gui_type, fld__itm_gui_cls, fld__itm_gui_args, fld__itm_dflt; private final String fld__itm_id, fld__itm_key, fld__itm_scope, fld__itm_type, fld__itm_dflt, fld__itm_html_atrs, fld__itm_html_cls;
private final Db_conn conn; private final Db_conn conn;
public Xocfg_itm_tbl(Db_conn conn) { public Xocfg_itm_tbl(Db_conn conn) {
this.conn = conn; this.conn = conn;
this.tbl_name = "cfg_itm"; this.tbl_name = "cfg_itm";
this.fld__itm_id = flds.Add_int_pkey("itm_id"); // EX: '2' this.fld__itm_id = flds.Add_int_pkey("itm_id"); // EX: '1'
this.fld__itm_key = flds.Add_str("itm_key", 255); // EX: 'cfg_1' this.fld__itm_key = flds.Add_str("itm_key", 255); // EX: 'cfg_1'
this.fld__itm_scope_id = flds.Add_int("itm_scope_id"); // EX: '1'; ENUM: Xoitm_scope_tid this.fld__itm_scope = flds.Add_int("itm_scope"); // EX: '1'; ENUM: Xoitm_scope_enum
this.fld__itm_data_type = flds.Add_str("itm_data_type", 255); // EX: '1'; ENUM: Type_adp_ this.fld__itm_type = flds.Add_str("itm_type", 255); // EX: '1'; ENUM: Xoitm_type_enum
this.fld__itm_gui_type = flds.Add_int("itm_gui_type"); // EX: '1'; ENUM: Xoitm_gui_tid
this.fld__itm_gui_args = flds.Add_str("itm_gui_args", 255); // EX: '1,40' (numeric); '255' (textbox); 'enum_name' (combo); etc..
this.fld__itm_gui_cls = flds.Add_str("itm_gui_cls", 255); // EX: 'xocfg_custom'
this.fld__itm_dflt = flds.Add_str("itm_dflt", 4096); // EX: 'abc' this.fld__itm_dflt = flds.Add_str("itm_dflt", 4096); // EX: 'abc'
this.fld__itm_html_atrs = flds.Add_str("itm_html_atrs", 255); // EX: 'size="5"'
this.fld__itm_html_cls = flds.Add_str("itm_html_cls", 255); // EX: 'xocfg__bool__readonly'
conn.Rls_reg(this); conn.Rls_reg(this);
} }
public String Tbl_name() {return tbl_name;} private final String tbl_name; public String Tbl_name() {return tbl_name;} private final String tbl_name;
@ -39,8 +38,8 @@ public class Xocfg_itm_tbl implements Db_tbl {
conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds
, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, fld__itm_key, fld__itm_key))); , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, fld__itm_key, fld__itm_key)));
} }
public void Upsert(int itm_id, int scope_id, String db_type, int gui_type, String gui_args, String gui_cls, String itm_key, String itm_dflt) { public void Upsert(int id, String key, int scope, String type, String dflt, String html_atrs, String html_cls) {
Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__itm_id), itm_id, itm_key, scope_id, db_type, gui_type, gui_args, gui_cls, itm_dflt); Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__itm_id), id, key, scope, type, dflt, html_atrs, html_cls);
} }
public int Select_id_or(String key, int or) { public int Select_id_or(String key, int or) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__itm_key).Crt_str(fld__itm_key, key).Exec_select__rls_auto(); Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__itm_key).Crt_str(fld__itm_key, key).Exec_select__rls_auto();
@ -55,13 +54,12 @@ public class Xocfg_itm_tbl implements Db_tbl {
private Xocfg_itm_row Load(Db_rdr rdr) { private Xocfg_itm_row Load(Db_rdr rdr) {
return new Xocfg_itm_row return new Xocfg_itm_row
( rdr.Read_int(fld__itm_id) ( rdr.Read_int(fld__itm_id)
, rdr.Read_int(fld__itm_scope_id)
, rdr.Read_str(fld__itm_data_type)
, rdr.Read_int(fld__itm_gui_type)
, rdr.Read_str(fld__itm_gui_args)
, rdr.Read_str(fld__itm_gui_cls)
, rdr.Read_str(fld__itm_key) , rdr.Read_str(fld__itm_key)
, rdr.Read_int(fld__itm_scope)
, rdr.Read_str(fld__itm_type)
, rdr.Read_str(fld__itm_dflt) , rdr.Read_str(fld__itm_dflt)
, rdr.Read_str(fld__itm_html_atrs)
, rdr.Read_str(fld__itm_html_cls)
); );
} }
public void Rls() {} public void Rls() {}

@ -1,76 +0,0 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
public class Xoitm_gui_tid {
public Xoitm_gui_tid(int uid, String key) {
this.uid = uid;
this.key = key;
}
public int Uid() {return uid;} private final int uid;
public String Key() {return key;} private final String key;
public static final int // SERIALIZED
Tid__bool = 0
, Tid__str = 1
, Tid__int = 2
, Tid__memo = 3
, Tid__list = 4
, Tid__io_cmd = 5
, Tid__io_file = 6
, Tid__io_dir = 7
, Tid__btn = 8
, Tid__gui_binding = 9
;
private static final Hash_adp to_uid_hash = Hash_adp_.New();
private static final Xoitm_gui_tid[] to_key_ary = new Xoitm_gui_tid[10];
public static final Xoitm_gui_tid
Itm__bool = New(Tid__bool , "bool")
, Itm__str = New(Tid__str , "string")
, Itm__int = New(Tid__int , "int")
, Itm__memo = New(Tid__memo , "memo")
, Itm__list = New(Tid__list , "select")
, Itm__io_cmd = New(Tid__io_cmd , "io.cmd")
, Itm__io_file = New(Tid__io_file , "io.file")
, Itm__io_dir = New(Tid__io_dir , "io.dir")
, Itm__btn = New(Tid__btn , "btn")
, Itm__gui_binding = New(Tid__gui_binding , "gui.binding")
;
private static Xoitm_gui_tid New(int uid, String key) {
Xoitm_gui_tid rv = new Xoitm_gui_tid(uid, key);
to_uid_hash.Add(key, rv);
to_key_ary[uid] = rv;
return rv;
}
public static int To_uid(String str) {
Xoitm_gui_tid rv = (Xoitm_gui_tid)to_uid_hash.Get_by_or_fail(str);
return rv.uid;
}
public static String To_key(int uid) {
return to_key_ary[uid].key;
}
public static String Infer_gui_type(String db_type) {
if (String_.Eq(db_type, "bool")) return Itm__bool.key;
else if (String_.Eq(db_type, "int")) return Itm__int.key;
else if (String_.Eq(db_type, "memo")) return Itm__memo.key;
else if (String_.Eq(db_type, "io.cmd")) return Itm__io_cmd.key;
else if (String_.Eq(db_type, "gui.binding")) return Itm__gui_binding.key;
else if (String_.Has_at_bgn(db_type, "list:")) return Itm__list.key;
else if (String_.Eq(db_type, "btn")) return Itm__btn.key;
else return Itm__str.key;
}
}

@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
public class Xoitm_scope_tid { // SERIALIZED public class Xoitm_scope_enum { // SERIALIZED
public static final int Tid__app = 1, Tid__wiki = 2; public static final int Tid__app = 1, Tid__wiki = 2;
public static int To_int(String raw) { public static int To_int(String raw) {
if (String_.Eq(raw, "app")) return Tid__app; if (String_.Eq(raw, "app")) return Tid__app;

@ -16,14 +16,27 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
public class Xoitm_db_tid { public class Xoitm_type_enum {
public static final int Tid__bool = 1, Tid__int = 2, Tid__str = 3, Tid__memo = 4; public static final int
public static int To_int(String s) { Tid__bool = 0
if (String_.Eq(s, "bool")) return Tid__bool; , Tid__int = 1
else if (String_.Eq(s, "int")) return Tid__int; , Tid__str = 2
else if (String_.Eq(s, "string")) return Tid__str; , Tid__memo = 3
else if (String_.Eq(s, "memo")) return Tid__memo; , Tid__list = 4
else return Tid__str; , Tid__btn = 5
// else throw Err_.new_wo_type("xo.cfg_maint:unknown db_type", "db_type", s); , Tid__io_cmd = 6
, Tid__gui_binding = 7
;
public static int To_uid(String v) {
if (String_.Eq(v, Bool_.Cls_val_name)) return Tid__bool;
else if (String_.Eq(v, Int_.Cls_val_name)) return Tid__int;
else if (String_.Eq(v, String_.Cls_val_name)) return Tid__str;
else if (String_.Eq(v, "memo")) return Tid__memo;
else if (String_.Eq(v, "btn")) return Tid__btn;
else if (String_.Eq(v, "io.cmd")) return Tid__io_cmd;
else if (String_.Eq(v, "gui.binding")) return Tid__gui_binding;
else if (String_.Has_at_bgn(v, "list:")) return Tid__list;
else throw Err_.new_wo_type("unknown cfg type enum; v=" + v);
} }
} }

@ -19,11 +19,13 @@ package gplx.xowa.addons.apps.cfgs.mgrs.caches; import gplx.*; import gplx.xowa.
public class Xocfg_cache_grp { public class Xocfg_cache_grp {
private final Hash_adp vals = Hash_adp_.New(); private final Hash_adp vals = Hash_adp_.New();
private final Ordered_hash subs = Ordered_hash_.New(); private final Ordered_hash subs = Ordered_hash_.New();
public Xocfg_cache_grp(String key, String dflt) { public Xocfg_cache_grp(String key, String dflt, String data_type) {
this.key = key; this.key = key;
this.dflt = dflt; this.dflt = dflt;
this.data_type = data_type;
} }
public String Key() {return key;} private final String key; public String Key() {return key;} private final String key;
public String Data_type() {return data_type;} private final String data_type;
public String Dflt() {return dflt;} private String dflt; public String Dflt() {return dflt;} private String dflt;
public void Dflt_(String v) {this.dflt = v;} public void Dflt_(String v) {this.dflt = v;}
public String Get(String ctx) { public String Get(String ctx) {

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package gplx.xowa.addons.apps.cfgs.mgrs.caches; 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.mgrs.*; package gplx.xowa.addons.apps.cfgs.mgrs.caches; 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.mgrs.*;
import gplx.dbs.*; import gplx.dbs.*;
import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*; import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*; import gplx.xowa.addons.apps.cfgs.enums.*;
public class Xocfg_cache_mgr { public class Xocfg_cache_mgr {
private final Hash_adp grps = Hash_adp_.New(); private final Hash_adp grps = Hash_adp_.New();
public Xocfg_cache_mgr() { public Xocfg_cache_mgr() {
@ -47,6 +47,7 @@ public class Xocfg_cache_mgr {
public void Set_wo_save(String ctx, String key, String val) {Set(Bool_.N, ctx, key, val);} public void Set_wo_save(String ctx, String key, String val) {Set(Bool_.N, ctx, key, val);}
public void Set(boolean save, String ctx, String key, String val) { public void Set(boolean save, String ctx, String key, String val) {
Xocfg_cache_grp grp = Grps__get_or_load(key); Xocfg_cache_grp grp = Grps__get_or_load(key);
grp.Pub(ctx, val); // publish first; if fail will throw error
grp.Set(ctx, val); grp.Set(ctx, val);
if (save) { if (save) {
if (String_.Eq(grp.Dflt(), val)) if (String_.Eq(grp.Dflt(), val))
@ -54,7 +55,6 @@ public class Xocfg_cache_mgr {
else else
db_usr.Set_str(ctx, key, val); db_usr.Set_str(ctx, key, val);
} }
grp.Pub(ctx, val);
} }
public void Del(String ctx, String key) { public void Del(String ctx, String key) {
Xocfg_cache_grp grp = Grps__get_or_load(key); Xocfg_cache_grp grp = Grps__get_or_load(key);
@ -87,12 +87,12 @@ public class Xocfg_cache_mgr {
Xocfg_itm_row meta_itm = db_app.Tbl__itm().Select_by_key_or_null(key); Xocfg_itm_row meta_itm = db_app.Tbl__itm().Select_by_key_or_null(key);
if (meta_itm == null) { if (meta_itm == null) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:itm not found; key=~{0}", key); Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:itm not found; key=~{0}", key);
return new Xocfg_cache_grp(key, or); return new Xocfg_cache_grp(key, or, String_.Cls_val_name);
} }
Xocfg_val_row[] itms = db_usr.Tbl__val().Select_all(meta_itm.Key()); Xocfg_val_row[] itms = db_usr.Tbl__val().Select_all(meta_itm.Key());
// make // make
Xocfg_cache_grp rv = new Xocfg_cache_grp(key, meta_itm.Dflt()); Xocfg_cache_grp rv = new Xocfg_cache_grp(key, meta_itm.Dflt(), meta_itm.Type());
int len = itms.length; int len = itms.length;
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
Xocfg_val_row itm = itms[0]; Xocfg_val_row itm = itms[0];

@ -52,8 +52,8 @@ class Xocfg_cache_mgr__fxt {
} }
public Xocfg_cache_sub_mock Sub() {return sub;} private Xocfg_cache_sub_mock sub = new Xocfg_cache_sub_mock(); public Xocfg_cache_sub_mock Sub() {return sub;} private Xocfg_cache_sub_mock sub = new Xocfg_cache_sub_mock();
public void Init__db_add(String ctx, String key, Object val) { public void Init__db_add(String ctx, String key, Object val) {
Xocfg_maint_svc.Create_grp(mgr.Db_app(), id++, "test_grp", "", "", ""); Xocfg_maint_svc.Create_grp(mgr.Db_app(), "test_grp", id++, "", "", "");
Xocfg_maint_svc.Create_itm(mgr.Db_app(), id++, key, "test_grp", "", "", "wiki", "string", "dflt", "string", "", ""); Xocfg_maint_svc.Create_itm(mgr.Db_app(), "test_grp", id++, key, "", "", "wiki", String_.Cls_val_name, "dflt", "", "");
mgr.Db_usr().Set_str(ctx, key, Object_.Xto_str_strict_or_null(val)); mgr.Db_usr().Set_str(ctx, key, Object_.Xto_str_strict_or_null(val));
} }
public void Init__sub(String ctx, String key, String evt) { public void Init__sub(String ctx, String key, String evt) {

@ -18,12 +18,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; 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.xowa.addons.apps.cfgs.specials.edits.*; package gplx.xowa.addons.apps.cfgs.specials.edits.objs; 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.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.langs.mustaches.*; import gplx.langs.mustaches.*;
import gplx.core.gfobjs.*; import gplx.langs.jsons.*; import gplx.core.gfobjs.*; import gplx.langs.jsons.*;
import gplx.xowa.addons.apps.cfgs.mgrs.types.*; import gplx.xowa.addons.apps.cfgs.mgrs.types.*; import gplx.xowa.addons.apps.cfgs.enums.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.*;
public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm { public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
private String gui_type;
private boolean edited; private boolean edited;
private String data_type, gui_args, gui_cls, lang, name, ctx, date; private String type, html_atrs, html_cls, lang, name, ctx, date;
private byte[] val, dflt; // NOTE: data is always escaped b/c it is only consumed by mustache; EX: "&lt;&apos;" not "<'" private byte[] val, dflt; // NOTE: data is always escaped b/c it is only consumed by mustache; EX: "&lt;&apos;" not "<'"
private Xocfg_type_mgr type_mgr; private Xocfg_type_mgr type_mgr;
public Xoedit_itm(Xocfg_type_mgr type_mgr, int id, String key, int sort) { public Xoedit_itm(Xocfg_type_mgr type_mgr, int id, String key, int sort) {
@ -37,12 +36,11 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
public String Help() {return help;} private String help; public String Help() {return help;} private String help;
public int Sort() {return sort;} private final int sort; public int Sort() {return sort;} private final int sort;
public void Load_by_meta(Bry_bfr tmp_bfr, int scope_id, String data_type, String gui_type, String gui_args, String gui_cls, String dflt_str) { public void Load_by_meta(Bry_bfr tmp_bfr, String type, String dflt_str, String html_atrs, String html_cls) {
this.data_type = data_type; this.type = type;
this.gui_type = gui_type;
this.gui_args = gui_args;
this.gui_cls = gui_cls;
this.dflt = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(dflt_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); this.dflt = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(dflt_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N);
this.html_atrs = html_atrs;
this.html_cls = html_cls;
} }
public void Load_by_i18n(String lang, String name, String help) { public void Load_by_i18n(String lang, String name, String help) {
this.lang = lang; this.lang = lang;
@ -54,8 +52,8 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
this.val = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(val_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); this.val = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(val_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N);
this.date = date; this.date = date;
this.edited = true; this.edited = true;
if ( String_.Has(gui_cls, "read"+"only") if ( String_.Has(html_cls, "read"+"only")
|| String_.Eq(gui_type, gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_tid.Itm__btn.Key())) || Xoitm_type_enum.To_uid(type) == Xoitm_type_enum.Tid__btn)
edited = false; edited = false;
} }
public void Set_data_by_dflt() { public void Set_data_by_dflt() {
@ -75,14 +73,14 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
rv.Add_str("ctx", ctx); rv.Add_str("ctx", ctx);
rv.Add_bry("val", val); rv.Add_bry("val", val);
rv.Add_str("date", date); rv.Add_str("date", date);
rv.Add_str("gui", gui_type); rv.Add_str("type", type);
To_html(tmp_bfr, type_mgr); To_html(tmp_bfr, type_mgr);
rv.Add_str("html", tmp_bfr.To_str_and_clear()); rv.Add_str("html", tmp_bfr.To_str_and_clear());
rv.Add_bool("edited", edited); rv.Add_bool("edited", edited);
return rv; return rv;
} }
private void To_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr) { private void To_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr) {
Xoedit_itm_html.Build_html(bfr, type_mgr, key, name, data_type, gui_type, gui_args, gui_cls, val); Xoedit_itm_html.Build_html(bfr, type_mgr, key, name, type, html_atrs, html_cls, val);
} }
public boolean Mustache__write(String k, Mustache_bfr bfr) { public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "id")) bfr.Add_int(id); if (String_.Eq(k, "id")) bfr.Add_int(id);
@ -94,7 +92,7 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
else if (String_.Eq(k, "ctx")) bfr.Add_str_u8(ctx); else if (String_.Eq(k, "ctx")) bfr.Add_str_u8(ctx);
else if (String_.Eq(k, "val")) bfr.Add_bry(val); else if (String_.Eq(k, "val")) bfr.Add_bry(val);
else if (String_.Eq(k, "date")) bfr.Add_str_u8(date); else if (String_.Eq(k, "date")) bfr.Add_str_u8(date);
else if (String_.Eq(k, "gui")) bfr.Add_str_u8(gui_type); else if (String_.Eq(k, "type")) bfr.Add_str_u8(type);
else if (String_.Eq(k, "html")) To_html(bfr.Bfr(), type_mgr); else if (String_.Eq(k, "html")) To_html(bfr.Bfr(), type_mgr);
return true; return true;
} }

@ -19,42 +19,44 @@ package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gp
import gplx.xowa.addons.apps.cfgs.enums.*; import gplx.xowa.addons.apps.cfgs.enums.*;
import gplx.xowa.addons.apps.cfgs.mgrs.types.*; import gplx.xowa.addons.apps.cfgs.mgrs.types.*;
public class Xoedit_itm_html { public class Xoedit_itm_html {
public static void Build_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr, String key, String name, String data_type, String gui_type_key, String gui_args, String gui_cls, byte[] val) { public static void Build_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr, String key, String name, String type, String html_atrs, String html_cls, byte[] val) {
// if gui_args exists, prepend space for html insertion; EX: "type='checkbox'{1}>" with "a=b" -> "type='checkbox' a='b'" x> "type='checkbox'a='b'" // prepend space for html insertion; EX: "type='checkbox'{1}>" with "a=b" -> "type='checkbox' a='b'" x> "type='checkbox'a='b'"
if (String_.Len_gt_0(gui_args)) gui_args = " " + gui_args; if (String_.Len_gt_0(html_atrs)) html_atrs = " " + html_atrs;
if (String_.Len_gt_0(gui_cls)) gui_cls = " " + gui_cls; if (String_.Len_gt_0(html_cls)) html_cls = " " + html_cls;
switch (Xoitm_gui_tid.To_uid(gui_type_key)) {
case Xoitm_gui_tid.Tid__bool: // build html
switch (Xoitm_type_enum.To_uid(type)) {
case Xoitm_type_enum.Tid__bool:
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}\" accesskey=\"d\" class=\"xocfg__bool{2}\" type=\"checkbox\"{1}{4}></input>" ( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg__bool{2}\" type=\"checkbox\"{1}{4}></input>"
, gui_type_key, gui_args, gui_cls, key, Bry_.Eq(val, Bool_.Y_bry) ? " checked=\"checked\"" : ""); , type, html_atrs, html_cls, key, Bry_.Eq(val, Bool_.Y_bry) ? " checked=\"checked\"" : "");
break; break;
case Xoitm_gui_tid.Tid__int: case Xoitm_type_enum.Tid__int:
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}\" accesskey=\"d\" class=\"xocfg__int{2}\" type=\"text\"{1} value=\"{4}\"></input>" ( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg__int{2}\" type=\"text\"{1} value=\"{4}\"></input>"
, gui_type_key, gui_args, gui_cls, key, val); , type, html_atrs, html_cls, key, val);
break; break;
case Xoitm_gui_tid.Tid__str: case Xoitm_type_enum.Tid__str:
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}\" accesskey=\"d\" class=\"xocfg__str{2}\" type=\"text\"{1} value=\"{4}\"></input>" ( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg__str{2}\" type=\"text\"{1} value=\"{4}\"></input>"
, gui_type_key, gui_args, gui_cls, key, val); , type, html_atrs, html_cls, key, val);
break; break;
case Xoitm_gui_tid.Tid__memo: case Xoitm_type_enum.Tid__memo:
if (String_.Len_eq_0(gui_args)) gui_args = " rows=\"4\""; if (String_.Len_eq_0(html_atrs)) html_atrs = " rows=\"4\"";
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<textarea id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}\" accesskey=\"d\" class=\"xocfg__memo{2}\"{1}>{4}</textarea>" ( "<textarea id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg__memo{2}\"{1}>{4}</textarea>"
, gui_type_key, gui_args, gui_cls, key, val); , type, html_atrs, html_cls, key, val);
break; break;
case Xoitm_gui_tid.Tid__list: case Xoitm_type_enum.Tid__list:
// get list of kvs by type // get list of kvs by type
Keyval[] kvs_ary = type_mgr.Lists__get(data_type); Keyval[] kvs_ary = type_mgr.Lists__get(type);
int len = kvs_ary.length; int len = kvs_ary.length;
if (String_.Len_eq_0(gui_args)) gui_args = "size=\"" + Int_.To_str(len) + "\""; if (String_.Len_eq_0(html_atrs)) html_atrs = "size=\"" + Int_.To_str(len) + "\"";
// build html // build html
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<select id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}\" accesskey=\"d\" class=\"xocfg__list{2}\" {1}>\n" ( "<select id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg__list{2}\" {1}>\n"
, gui_type_key, gui_args, gui_cls, key); , type, html_atrs, html_cls, key);
String val_str = String_.new_u8(val); String val_str = String_.new_u8(val);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
Keyval kv = kvs_ary[i]; Keyval kv = kvs_ary[i];
@ -66,29 +68,29 @@ public class Xoedit_itm_html {
} }
bfr.Add_str_u8_fmt("</select>\n"); bfr.Add_str_u8_fmt("</select>\n");
break; break;
case Xoitm_gui_tid.Tid__io_cmd: case Xoitm_type_enum.Tid__io_cmd:
String[] lines = Xocfg_mgr.Parse_io_cmd(String_.new_u8(val)); String[] lines = Xocfg_mgr.Parse_io_cmd(String_.new_u8(val));
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<input class=\"xocfg__io_cmd__exe__txt\" id=\"{3}-exe\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}-exe\" accesskey=\"d\" class=\"{2}\" type=\"text\"{1} value=\"{4}\"></input>\n" ( "<input class=\"xocfg__io_cmd__exe__txt\" id=\"{3}-exe\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}-exe\" accesskey=\"d\" class=\"xocfg__io_cmd__exe__txt{2}\" type=\"text\"{1} value=\"{4}\"></input>\n"
+ "<button class=\"xocfg__io_cmd__exe__btn\" onclick='xowa_io_select(\"file\", \"{3}-exe\", \"Please select a file.\");'>...</button><br/>\n" + "<button class=\"xocfg__io_cmd__exe__btn\" onclick='xo.cfg_edit.io_cmd__select(\"file\", \"{3}-exe\", \"Please select a file.\");'>...</button><br/>\n"
, gui_type_key, gui_args, gui_cls, key, lines[0]); , type, html_atrs, html_cls, key, lines[0]);
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<input class=\"xocfg__io_cmd__arg__txt\" id=\"{3}-arg\" data-xocfg-key=\"{2}\" data-xocfg-gui=\"{0}-arg\" accesskey=\"d\" class=\"{2}\" type=\"text\"{1} value=\"{4}\">\n" ( "<input class=\"xocfg__io_cmd__arg__txt\" id=\"{3}-arg\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}-arg\" accesskey=\"d\" class=\"xocfg__io_cmd__arg__txt{2}\" type=\"text\"{1} value=\"{4}\">\n"
, gui_type_key, gui_args, gui_cls, key, lines[1]); , type, html_atrs, html_cls, key, lines[1]);
break; break;
case Xoitm_gui_tid.Tid__gui_binding: case Xoitm_type_enum.Tid__gui_binding:
String[] flds = Xoitm_gui_binding.To_gui(String_.new_u8(val)); String[] flds = Xoitm_gui_binding.To_gui(String_.new_u8(val));
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<input class=\"xocfg__gui_binding__box__txt\" id=\"{3}-box\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}-box\" accesskey=\"d\" class=\"{2}\" type=\"text\"{1} value=\"{4}\"></input>\n" ( "<input class=\"xocfg__gui_binding__box__txt\" id=\"{3}-box\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}-box\" accesskey=\"d\" class=\"{2}\" type=\"text\"{1} value=\"{4}\"></input>\n"
, gui_type_key, gui_args, gui_cls, key, flds[0]); , type, html_atrs, html_cls, key, flds[0]);
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<input class=\"xocfg__gui_binding__ipt__txt\" id=\"{3}-ipt\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}-ipt\" accesskey=\"d\" class=\"{2}\" type=\"text\"{1} value=\"{4}\"'>\n" ( "<input class=\"xocfg__gui_binding__ipt__txt\" id=\"{3}-ipt\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}-ipt\" accesskey=\"d\" class=\"{2}\" type=\"text\"{1} value=\"{4}\"'>\n"
, gui_type_key, gui_args, gui_cls, key, flds[1]); , type, html_atrs, html_cls, key, flds[1]);
break; break;
case Xoitm_gui_tid.Tid__btn: case Xoitm_type_enum.Tid__btn:
bfr.Add_str_u8_fmt bfr.Add_str_u8_fmt
( "<button id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-gui=\"{0}\" class=\"xocfg__btn{2}\" {1}>{4}</button>" ( "<button id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" class=\"xocfg__btn{2}\" {1}>{4}</button>"
, gui_type_key, gui_args, gui_cls, key, name); , type, html_atrs, html_cls, key, name);
break; break;
default: default:
break; break;

@ -28,12 +28,11 @@ public class Xocfg_edit_special implements Xow_special_page {
Xocfg_edit_loader loader = Xocfg_edit_loader.New(wiki.App()); Xocfg_edit_loader loader = Xocfg_edit_loader.New(wiki.App());
if (String_.Eq(grp, "")) { if (String_.Eq(grp, "")) {
grp = wiki.App().Cfg().Get_str_app("xowa.app.cfg.previous_grp"); grp = wiki.App().Cfg().Get_str_app(Cfg__previous_grp);
if (!loader.Grp_key_exists(grp)) { if (!loader.Grp_key_exists(grp)) {
grp = "xowa.app.security"; grp = "xowa.app.security";
Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:grp_key not found; defaulting to xowa.app.security; key=~{0}", grp); Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:grp_key not found; defaulting to xowa.app.security; key=~{0}", grp);
} }
} }
new Xocfg_edit_html(loader, grp, ctx, lang).Bld_page_by_mustache(wiki.App(), page, this); new Xocfg_edit_html(loader, grp, ctx, lang).Bld_page_by_mustache(wiki.App(), page, this);
} }
@ -42,4 +41,5 @@ public class Xocfg_edit_special implements Xow_special_page {
public Xow_special_meta Special__meta() {return special__meta;} private final Xow_special_meta special__meta; public Xow_special_meta Special__meta() {return special__meta;} private final Xow_special_meta special__meta;
public Xow_special_page Special__clone() {return this;} public Xow_special_page Special__clone() {return this;}
public static final Xow_special_page Prototype = new Xocfg_edit_special(Xow_special_meta.New_xo("XowaCfg", "Options")); public static final Xow_special_page Prototype = new Xocfg_edit_special(Xow_special_meta.New_xo("XowaCfg", "Options"));
public static final String Cfg__previous_grp = "xowa.app.cfg.previous_grp";
} }

@ -27,7 +27,7 @@ public class Xocfg_edit_bridge implements Bridge_cmd_itm {
byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit); byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit);
Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde(); Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde();
switch (proc_id) { switch (proc_id) {
case Proc__upsert: svc.Upsert(args); break; case Proc__update: svc.Update(args); break;
case Proc__revert: svc.Revert(args); break; case Proc__revert: svc.Revert(args); break;
case Proc__load: svc.Load(args); break; case Proc__load: svc.Load(args); break;
default: throw Err_.new_unhandled_default(proc_id); default: throw Err_.new_unhandled_default(proc_id);
@ -35,9 +35,9 @@ public class Xocfg_edit_bridge implements Bridge_cmd_itm {
return Bridge_cmd_mgr.Msg__ok; return Bridge_cmd_mgr.Msg__ok;
} }
private static final byte Proc__upsert = 0, Proc__revert = 1, Proc__load = 2; private static final byte Proc__update = 0, Proc__revert = 1, Proc__load = 2;
private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs() private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs()
.Add_str_byte("upsert" , Proc__upsert) .Add_str_byte("update" , Proc__update)
.Add_str_byte("revert" , Proc__revert) .Add_str_byte("revert" , Proc__revert)
.Add_str_byte("load" , Proc__load) .Add_str_byte("load" , Proc__load)
; ;

@ -151,14 +151,7 @@ public class Xocfg_edit_loader {
Xogui_nde_iter iter = Xogui_nde_iter.New_sql(itm_list); Xogui_nde_iter iter = Xogui_nde_iter.New_sql(itm_list);
while (iter.Move_next()) { while (iter.Move_next()) {
String sql = Db_sql_.Make_by_fmt(String_.Ary String sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT i.itm_id" ( "SELECT *"
, ", i.itm_key"
, ", i.itm_scope_id"
, ", i.itm_data_type"
, ", i.itm_gui_type"
, ", i.itm_gui_args"
, ", i.itm_gui_cls"
, ", i.itm_dflt"
, "FROM cfg_itm i" , "FROM cfg_itm i"
, "WHERE i.itm_key IN ({0})" , "WHERE i.itm_key IN ({0})"
), iter.To_sql_in_key() ), iter.To_sql_in_key()
@ -169,8 +162,7 @@ public class Xocfg_edit_loader {
String key = rdr.Read_str("itm_key"); String key = rdr.Read_str("itm_key");
Xoedit_itm edit_itm = (Xoedit_itm)itm_list.Get_by_or_fail(key); Xoedit_itm edit_itm = (Xoedit_itm)itm_list.Get_by_or_fail(key);
String dflt = dflt_mgr.Get_or(key, rdr.Read_str("itm_dflt")); String dflt = dflt_mgr.Get_or(key, rdr.Read_str("itm_dflt"));
int gui_type = rdr.Read_int("itm_gui_type"); edit_itm.Load_by_meta(tmp_bfr, rdr.Read_str("itm_type"), dflt, rdr.Read_str("itm_html_atrs"), rdr.Read_str("itm_html_cls"));
edit_itm.Load_by_meta(tmp_bfr, rdr.Read_int("itm_scope_id"), rdr.Read_str("itm_data_type"), gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_tid.To_key(gui_type), rdr.Read_str("itm_gui_args"), rdr.Read_str("itm_gui_cls"), dflt);
} }
} }
} }

@ -19,7 +19,7 @@ package gplx.xowa.addons.apps.cfgs.specials.edits.services; import gplx.*; impor
import gplx.langs.jsons.*; import gplx.langs.jsons.*;
import gplx.core.gfobjs.*; import gplx.core.gfobjs.*;
import gplx.xowa.guis.cbks.*; import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.specials.edits.objs.*; import gplx.xowa.guis.cbks.*; import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.specials.edits.objs.*;
import gplx.xowa.addons.apps.cfgs.specials.edits.pages.*; import gplx.xowa.addons.apps.cfgs.mgrs.caches.*; import gplx.xowa.addons.apps.cfgs.specials.edits.pages.*; import gplx.xowa.addons.apps.cfgs.mgrs.caches.*; import gplx.xowa.addons.apps.cfgs.enums.*;
public class Xocfg_edit_svc { public class Xocfg_edit_svc {
private final Xoa_app app; private final Xoa_app app;
private Xocfg_edit_loader edit_loader; private Xocfg_edit_loader edit_loader;
@ -27,29 +27,35 @@ public class Xocfg_edit_svc {
public Xocfg_edit_svc(Xoa_app app) { public Xocfg_edit_svc(Xoa_app app) {
this.app = app; this.app = app;
} }
public void Upsert(Json_nde args) { public void Update(Json_nde args) {
String ctx = args.Get_as_str("ctx"); String ctx = args.Get_as_str("ctx");
String key = args.Get_as_str("key"); String key = args.Get_as_str("key");
String val = args.Get_as_str("val"); String val = args.Get_as_str("val");
String gui = args.Get_as_str("gui"); String type = args.Get_as_str("type");
if (String_.Has_at_bgn(gui, "gui.binding")) { if (String_.Has_at_bgn(type, "gui.binding")) {
val = gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_binding.To_db_str(val); val = Xoitm_gui_binding.To_db_str(val);
} }
app.Cfg().Set_str(ctx, key, val);
Xocfg_cache_grp grp = app.Cfg().Cache_mgr().Grps__get_or_load(key); Xocfg_cache_grp grp = app.Cfg().Cache_mgr().Grps__get_or_load(key);
if (String_.Eq(grp.Dflt(), val)) try {
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.revert__recv", Gfobj_nde.New().Add_str("key", key).Add_str("val", val)); app.Cfg().Set_str(ctx, key, val);
} catch (Exception exc) {
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.update__fail", Gfobj_nde.New().Add_str("key", key).Add_str("new_val", val).Add_str("old_val", grp.Get(ctx)).Add_str("err", Err_.Message_lang(exc)));
return;
}
if (!String_.Eq(type, "btn") && String_.Eq(grp.Dflt(), val))
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.revert__recv", Gfobj_nde.New().Add_str("key", key).Add_str("val", val).Add_str("type", type));
else else
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.upsert__recv", Gfobj_nde.New().Add_str("key", key)); app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.update__pass", Gfobj_nde.New().Add_str("key", key).Add_str("val", val).Add_str("type", type));
} }
public void Revert(Json_nde args) { public void Revert(Json_nde args) {
String ctx = args.Get_as_str("ctx"); String ctx = args.Get_as_str("ctx");
String key = args.Get_as_str("key"); String key = args.Get_as_str("key");
String gui = args.Get_as_str("gui"); String type = args.Get_as_str("type");
app.Cfg().Del(ctx, key); app.Cfg().Del(ctx, key);
String val = app.Cfg().Get_str(ctx, key); String val = app.Cfg().Get_str(ctx, key);
if (String_.Has_at_bgn(gui, "gui.binding")) { if (String_.Has_at_bgn(type, "gui.binding")) {
val = String_.Concat_with_str("|", gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_binding.To_gui(val)); val = String_.Concat_with_str("|", gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_binding.To_gui(val));
} }
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.revert__recv", Gfobj_nde.New().Add_str("key", key).Add_str("val", val)); app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.revert__recv", Gfobj_nde.New().Add_str("key", key).Add_str("val", val));
@ -60,6 +66,6 @@ public class Xocfg_edit_svc {
if (edit_loader == null) edit_loader = Xocfg_edit_loader.New(app); if (edit_loader == null) edit_loader = Xocfg_edit_loader.New(app);
Xoedit_root root = edit_loader.Load_root(key, ctx, "en"); Xoedit_root root = edit_loader.Load_root(key, ctx, "en");
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.load__recv", root.To_nde(Bry_bfr_.New())); app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.load__recv", root.To_nde(Bry_bfr_.New()));
app.Cfg().Set_str_app("xowa.app.cfg.recent_page", key); app.Cfg().Set_str_app(Xocfg_edit_special.Cfg__previous_grp, key);
} }
} }

@ -17,46 +17,44 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package gplx.xowa.addons.apps.cfgs.specials.maints.services; 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.xowa.addons.apps.cfgs.specials.maints.*; package gplx.xowa.addons.apps.cfgs.specials.maints.services; 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.xowa.addons.apps.cfgs.specials.maints.*;
abstract class Xocfg_maint_nde implements gplx.core.brys.Bry_bfr_able { abstract class Xocfg_maint_nde implements gplx.core.brys.Bry_bfr_able {
public Xocfg_maint_nde(int id, String key, String owner, String name, String help) { public Xocfg_maint_nde(String owner, int id, String key, String name, String help) {
this.owner = owner;
this.id = id; this.id = id;
this.key = key; this.key = key;
this.owner = owner;
this.name = name; this.name = name;
this.help = help; this.help = help;
} }
public abstract boolean Type_is_grp(); public abstract boolean Type_is_grp();
public String Owner() {return owner;} private final String owner;
public int Id() {return id;} private final int id; public int Id() {return id;} private final int id;
public String Key() {return key;} private final String key; public String Key() {return key;} private final String key;
public String Owner() {return owner;} private final String owner;
public String Name() {return name;} private final String name; public String Name() {return name;} private final String name;
public String Help() {return help;} private final String help; public String Help() {return help;} private final String help;
public void To_bfr(Bry_bfr bfr) { public void To_bfr(Bry_bfr bfr) {
bfr.Add_str_u8_fmt("{0}|{1}|{2}|{3}|{4}", this.Type_is_grp(), key, owner, name, help); bfr.Add_str_u8_fmt("{0}|{1}|{2}|{3}|{4}", owner, this.Type_is_grp(), key, name, help);
To_bfr_hook(bfr); To_bfr_hook(bfr);
} }
protected abstract void To_bfr_hook(Bry_bfr bfr); protected abstract void To_bfr_hook(Bry_bfr bfr);
} }
class Xocfg_maint_grp extends Xocfg_maint_nde { public Xocfg_maint_grp(int id, String key, String owner, String name, String help) {super(id, key, owner, name, help); class Xocfg_maint_grp extends Xocfg_maint_nde { public Xocfg_maint_grp(String owner, int id, String key, String name, String help) {super(owner, id, key, name, help);
} }
@Override public boolean Type_is_grp() {return true;} @Override public boolean Type_is_grp() {return true;}
@Override protected void To_bfr_hook(Bry_bfr bfr) {} @Override protected void To_bfr_hook(Bry_bfr bfr) {}
} }
class Xocfg_maint_itm extends Xocfg_maint_nde { public Xocfg_maint_itm(int id, String key, String owner, String name, String help, String scope, String db_type, String dflt, String gui_type, String gui_args, String gui_cls) {super(id, key, owner, name, help); class Xocfg_maint_itm extends Xocfg_maint_nde { public Xocfg_maint_itm(String owner, int id, String key, String name, String help, String scope, String type, String dflt, String html_atrs, String html_cls) {super(owner, id, key, name, help);
this.scope = scope; this.scope = scope;
this.db_type = db_type; this.type = type;
this.dflt = dflt; this.dflt = dflt;
this.gui_type = gui_type; this.html_atrs = html_atrs;
this.gui_args = gui_args; this.html_cls = html_cls;
this.gui_cls = gui_cls;
} }
@Override public boolean Type_is_grp() {return false;} @Override public boolean Type_is_grp() {return false;}
public String Scope() {return scope;} private final String scope; public String Scope() {return scope;} private final String scope;
public String Db_type() {return db_type;} private final String db_type; public String Type() {return type;} private final String type;
public String Dflt() {return dflt;} private final String dflt; public String Dflt() {return dflt;} private final String dflt;
public String Gui_type() {return gui_type;} private final String gui_type; public String Html_atrs() {return html_atrs;} private final String html_atrs;
public String Gui_args() {return gui_args;} private final String gui_args; public String Html_cls() {return html_cls;} private final String html_cls;
public String Gui_cls() {return gui_cls;} private final String gui_cls;
@Override protected void To_bfr_hook(Bry_bfr bfr) { @Override protected void To_bfr_hook(Bry_bfr bfr) {
bfr.Add_str_u8_fmt("|{0}|{1}|{2}|{3}|{4}|{5}", scope, db_type, dflt, gui_type, gui_args, gui_cls); bfr.Add_str_u8_fmt("|{0}|{1}|{2}|{3}|{4}", scope, type, dflt, html_atrs, html_cls);
} }
} }

@ -41,20 +41,15 @@ class Xocfg_maint_parser {
// create // create
String nde_type = msg.Key(); String nde_type = msg.Key();
if (String_.Eq(nde_type, "grp")) { if (String_.Eq(nde_type, "grp")) {
return new Xocfg_maint_grp(id, key, owner, name, help); return new Xocfg_maint_grp(owner, id, key, name, help);
} }
else if (String_.Eq(nde_type, "itm")) { else if (String_.Eq(nde_type, "itm")) {
String scope = Get_atr_as_str_or(hash, "scope_", ""); if (String_.Eq(scope, "")) scope = "wiki"; String scope = Get_atr_as_str_or(hash, "scope_", ""); if (String_.Eq(scope, "")) scope = "wiki";
String db_type = Get_atr_as_str_or_fail(hash, "db_type_"); String type = Get_atr_as_str_or_fail(hash, "type_");
String dflt = Get_atr_as_str_or_fail(hash, "dflt_"); String dflt = Get_atr_as_str_or_fail(hash, "dflt_");
String gui_type = Get_atr_as_str_or(hash, "gui_type_", null); String html_atrs = Get_atr_as_str_or(hash, "html_atrs_", "");
String gui_args = Get_atr_as_str_or(hash, "gui_args_", ""); String html_cls = Get_atr_as_str_or(hash, "html_cls_", "");
String gui_cls = Get_atr_as_str_or(hash, "gui_cls_", ""); return new Xocfg_maint_itm(owner, id, key, name, help, scope, type, dflt, html_atrs, html_cls);
if (gui_type == null) {
gui_type = gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_tid.Infer_gui_type(db_type);
}
return new Xocfg_maint_itm(id, key, owner, name, help, scope, db_type, dflt, gui_type, gui_args, gui_cls);
} }
else throw Err_.new_wo_type("xo.cfg_maint:unknown type", "type", nde_type); else throw Err_.new_wo_type("xo.cfg_maint:unknown type", "type", nde_type);
} }

@ -21,12 +21,12 @@ public class Xocfg_maint_parser__tst {
private final Xocfg_maint_parser__fxt fxt = new Xocfg_maint_parser__fxt(); private final Xocfg_maint_parser__fxt fxt = new Xocfg_maint_parser__fxt();
@Test public void Parse_grp() { @Test public void Parse_grp() {
fxt.Exec__parse("grp {id='123'; key='key_1'; owner='owner_1'; name='name_1'; help='help_1'}" fxt.Exec__parse("grp {id='123'; key='key_1'; owner='owner_1'; name='name_1'; help='help_1'}"
, fxt.Make__grp(123, "key_1", "owner_1", "name_1", "help_1") , fxt.Make__grp("owner_1", 123, "key_1", "name_1", "help_1")
); );
} }
@Test public void Parse_itm() { @Test public void Parse_itm() {
fxt.Exec__parse("itm {id='123'; key='key_1'; owner='owner_1'; name='name_1'; help='help_1'; scope='scope_1'; db_type='db_type_1'; dflt='dflt_1'; gui_type='gui_type_1'; gui_args='gui_args_1'; gui_cls='gui_cls_1'}" fxt.Exec__parse("itm {id='123'; key='key_1'; owner='owner_1'; name='name_1'; help='help_1'; scope='scope_1'; type='type_1'; dflt='dflt_1'; html_atrs='html_atrs_1'; html_cls='html_cls_1'}"
, fxt.Make__itm(123, "key_1", "owner_1", "name_1", "help_1", "scope_1", "db_type_1", "dflt_1", "gui_type_1", "gui_args_1", "gui_cls_1") , fxt.Make__itm("owner_1", 123, "key_1", "name_1", "help_1", "scope_1", "type_1", "dflt_1", "html_atrs_1", "html_cls_1")
); );
} }
} }
@ -36,10 +36,10 @@ class Xocfg_maint_parser__fxt {
Xocfg_maint_nde[] actl = parser.Parse(raw); Xocfg_maint_nde[] actl = parser.Parse(raw);
Gftest.Eq__ary(expd, actl); Gftest.Eq__ary(expd, actl);
} }
public Xocfg_maint_grp Make__grp(int id, String key, String owner, String name, String help) { public Xocfg_maint_grp Make__grp(String owner, int id, String key, String name, String help) {
return new Xocfg_maint_grp(id, key, owner, name, help); return new Xocfg_maint_grp(owner, id, key, name, help);
} }
public Xocfg_maint_itm Make__itm(int id, String key, String owner, String name, String help, String scope, String db_type, String dflt, String gui_type, String gui_args, String gui_cls) { public Xocfg_maint_itm Make__itm(String owner, int id, String key, String name, String help, String scope, String type, String dflt, String html_atrs, String html_cls) {
return new Xocfg_maint_itm(id, key, owner, name, help, scope, db_type, dflt, gui_type, gui_args, gui_cls); return new Xocfg_maint_itm(owner, id, key, name, help, scope, type, dflt, html_atrs, html_cls);
} }
} }

@ -37,42 +37,43 @@ public class Xocfg_maint_svc {
db_app.Conn().Txn_bgn("xo__cfg_maint__upsert"); db_app.Conn().Txn_bgn("xo__cfg_maint__upsert");
byte[] anch_find_bry = Bry_.new_a7("<a "), anch_repl_bry = Bry_.new_a7("<a tabindex=\"-1\" "); byte[] anch_find_bry = Bry_.new_a7("<a "), anch_repl_bry = Bry_.new_a7("<a tabindex=\"-1\" ");
for (Xocfg_maint_nde nde : ndes) { for (Xocfg_maint_nde nde : ndes) {
// parse help to html
byte[] help = parser_mgr.Main().Parse_text_to_html(parser_mgr.Ctx(), Bry_.new_u8(nde.Help())); byte[] help = parser_mgr.Main().Parse_text_to_html(parser_mgr.Ctx(), Bry_.new_u8(nde.Help()));
help = Bry_.Replace(help, anch_find_bry, anch_repl_bry); // replace "<a " with "<a tabindex=-1 " else tabbing will go to hidden anchors in help text help = Bry_.Replace(help, anch_find_bry, anch_repl_bry); // replace "<a " with "<a tabindex=-1 " else tabbing will go to hidden anchors in help text
// do insert
if (nde.Type_is_grp()) { if (nde.Type_is_grp()) {
Xocfg_maint_svc.Create_grp(db_app, nde.Id(), nde.Key(), nde.Owner(), nde.Name(), String_.new_u8(help)); Xocfg_maint_svc.Create_grp(db_app, nde.Owner(), nde.Id(), nde.Key(), nde.Name(), String_.new_u8(help));
} }
else { else {
Xocfg_maint_itm itm = (Xocfg_maint_itm)nde; Xocfg_maint_itm itm = (Xocfg_maint_itm)nde;
Xocfg_maint_svc.Create_itm(db_app, nde.Id(), nde.Key(), nde.Owner(), nde.Name(), String_.new_u8(help), itm.Scope(), itm.Db_type(), itm.Dflt(), itm.Gui_type(), itm.Gui_args(), itm.Gui_cls()); Xocfg_maint_svc.Create_itm(db_app, nde.Owner(), nde.Id(), nde.Key(), nde.Name(), String_.new_u8(help), itm.Scope(), itm.Type(), itm.Dflt(), itm.Html_atrs(), itm.Html_cls());
} }
} }
db_app.Conn().Txn_end(); db_app.Conn().Txn_end();
} }
public static void Create_grp(Xocfg_db_app db_app, int grp_id, String key, String owner, String name, String help) { public static void Create_grp(Xocfg_db_app db_app, String owner, int id, String key, String name, String help) {
// insert grp_meta // insert grp_meta
db_app.Tbl__grp().Upsert(grp_id, key); db_app.Tbl__grp().Upsert(id, key);
// insert grp_map // insert grp_map
int owner_id = String_.Len_eq_0(owner) ? Xocfg_grp_row.Id__root : db_app.Tbl__grp().Select_id_by_key_or_fail(owner); int owner_id = String_.Len_eq_0(owner) ? Xocfg_grp_row.Id__root : db_app.Tbl__grp().Select_id_by_key_or_fail(owner);
int map_sort = db_app.Tbl__map().Select_sort_or_next(owner_id, grp_id); int map_sort = db_app.Tbl__map().Select_sort_or_next(owner_id, id);
db_app.Tbl__map().Upsert(owner_id, grp_id, map_sort); db_app.Tbl__map().Upsert(owner_id, id, map_sort);
// insert nde_i18n // insert nde_i18n
db_app.Tbl__txt().Upsert(grp_id, Xoitm_lang_tid.Lang__dflt, name, help); db_app.Tbl__txt().Upsert(id, Xoitm_lang_tid.Lang__dflt, name, help);
} }
public static void Create_itm(Xocfg_db_app db_app, int itm_id, String key, String owner, String name, String help, String scope, String db_type, String dflt, String gui_type, String gui_args, String gui_cls) { public static void Create_itm(Xocfg_db_app db_app, String owner, int id, String key, String name, String help, String scope, String type, String dflt, String html_atrs, String html_cls) {
// insert itm_meta // insert itm_meta
int grp_id = db_app.Tbl__grp().Select_id_by_key_or_fail(owner); db_app.Tbl__itm().Upsert(id, key, Xoitm_scope_enum.To_int(scope), type, dflt, html_atrs, html_cls);
int scope_id = Xoitm_scope_tid.To_int(scope);
int gui_type_id = Xoitm_gui_tid.To_uid(gui_type);
db_app.Tbl__itm().Upsert(itm_id, scope_id, db_type, gui_type_id, gui_args, gui_cls, key, dflt);
// insert grp_map // insert grp_map
int itm_sort = db_app.Tbl__map().Select_sort_or_next(grp_id, itm_id); int grp_id = db_app.Tbl__grp().Select_id_by_key_or_fail(owner);
db_app.Tbl__map().Upsert(grp_id, itm_id, itm_sort); int itm_sort = db_app.Tbl__map().Select_sort_or_next(grp_id, id);
db_app.Tbl__map().Upsert(grp_id, id, itm_sort);
// insert nde_i18n // insert nde_i18n
db_app.Tbl__txt().Upsert(itm_id, Xoitm_lang_tid.Lang__dflt, name, help); db_app.Tbl__txt().Upsert(id, Xoitm_lang_tid.Lang__dflt, name, help);
} }
} }

Loading…
Cancel
Save