From 0b5aa9aefefbfa21982923d362c64d7adedbcd20 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Sun, 3 May 2015 22:30:22 -0400 Subject: [PATCH] v2.5.1.1 --- 100_core/src/gplx/core/threads/Gfo_lock.java | 28 + .../gplx/core/threads/Thread_adp.java} | 10 +- .../gplx/core/threads/Thread_adp_.java} | 14 +- 100_core/src_110_primitive/gplx/Bry_.java | 1 + 100_core/src_110_primitive/gplx/Bry_fmtr.java | 166 ++-- 100_core/src_210_env/gplx/Env_.java | 8 +- 100_core/src_210_env/gplx/ProcessAdp.java | 4 +- 150_gfui/src_200_ipt/gplx/gfui/IptArg_.java | 2 + 150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java | 31 +- 150_gfui/src_200_ipt/gplx/gfui/IptKey.java | 6 +- .../src_200_ipt/gplx/gfui/IptKeyStrMgr.java | 4 +- 150_gfui/src_200_ipt/gplx/gfui/IptKey_.java | 49 +- .../src_200_ipt/gplx/gfui/IptKey__tst.java | 30 + .../src_420_box_basic/gplx/gfui/GfuiBtn.java | 1 + .../src_420_box_basic/gplx/gfui/GfuiLbl.java | 5 +- .../src_420_box_basic/gplx/gfui/GfuiLbl_.java | 5 + 150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java | 4 +- 150_gfui/src_700_env/gplx/gfui/Gfui_kit.java | 1 + .../src_700_env/gplx/gfui/Gfui_kit_base.java | 5 + 150_gfui/src_700_env/gplx/gfui/Swt_kit.java | 17 +- 150_gfui/xtn/gplx/gfui/Swt_btn.java | 10 +- 150_gfui/xtn/gplx/gfui/Swt_core_cmds.java | 5 +- 150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java | 17 +- 150_gfui/xtn/gplx/gfui/Swt_html.java | 6 +- 150_gfui/xtn/gplx/gfui/Swt_lbl.java | 44 + 150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java | 2 +- 150_gfui/xtn/gplx/gfui/Swt_win.java | 48 +- .../{ => core}/threads/Gfo_async_cmd_itm.java | 2 +- .../{ => core}/threads/Gfo_async_cmd_mkr.java | 2 +- .../{ => core}/threads/Gfo_async_mgr.java | 4 +- .../gplx/core}/threads/Gfo_thread_cmd.java | 2 +- .../gplx/core}/threads/Gfo_thread_cmd_.java | 2 +- .../core}/threads/Gfo_thread_cmd_base.java | 2 +- .../threads/Gfo_thread_cmd_download.java | 4 +- .../core}/threads/Gfo_thread_cmd_replace.java | 2 +- .../core}/threads/Gfo_thread_cmd_unzip.java | 2 +- .../{ => core}/threads/Gfo_thread_pool.java | 4 +- .../{ => core}/threads/Gfo_thread_wkr.java | 2 +- 400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v1.java | 1 - .../src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java | 4 +- 400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java | 11 +- 400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java | 2 +- 400_xowa/src/gplx/gfui/Gfui_bnd_parser.java | 2 +- 400_xowa/src/gplx/json/Json_doc.java | 2 +- 400_xowa/src/gplx/json/Json_itm_int.java | 2 +- 400_xowa/src/gplx/json/Json_parser.java | 4 +- 400_xowa/src/gplx/xowa/Xoa_app.java | 10 +- 400_xowa/src/gplx/xowa/Xoa_app_.java | 39 +- 400_xowa/src/gplx/xowa/Xoa_app_fxt.java | 2 +- 400_xowa/src/gplx/xowa/Xoae_app.java | 26 +- 400_xowa/src/gplx/xowa/apps/Xoa_app_type.java | 35 + .../src/gplx/xowa/apps/Xoa_thread_mgr.java | 2 +- .../src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java | 53 +- 400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java | 3 +- .../xowa/bldrs/cmds/Xob_dump_mgr_base.java | 10 +- .../bldrs/cmds/files/Xob_fsdb_make_cmd.java | 13 +- .../bldrs/cmds/files/Xob_lnki_temp_wkr.java | 10 +- .../cmds/files/Xob_xfer_regy_update_cmd.java | 17 +- .../xowa/bldrs/cmds/texts/Xob_init_base.java | 2 +- .../bldrs/cmds/texts/Xob_search_base.java | 19 +- .../bldrs/cmds/texts/Xob_word_parser.java | 118 +++ .../bldrs/cmds/texts/Xob_word_parser_tst.java | 102 +++ .../bldrs/cmds/texts/sqls/Xob_css_cmd.java | 26 +- .../cmds/texts/sqls/Xob_search_sql_cmd.java | 2 +- .../cmds/texts/tdbs/Xob_search_base_tst.java | 2 +- .../cmds/utils/Xob_decompress_bz2_cmd.java | 4 +- .../xowa/bldrs/xmls/Xob_import_marker.java | 2 +- .../src/gplx/xowa/cfgs2/Xocfg_bnd_mgr.java | 7 +- .../src/gplx/xowa/files/Xof_file_wkr.java | 3 +- .../gplx/xowa/files/Xof_lnki_file_mgr.java | 2 +- .../gplx/xowa/files/Xog_redlink_thread.java | 2 +- .../src/gplx/xowa/files/Xow_file_mgr.java | 5 +- .../xowa/files/bins/Xof_bin_skip_mgr.java | 44 +- .../files/bins/Xof_bin_wkr__fsdb_sql.java | 3 +- .../files/bins/Xof_bin_wkr__http_wmf.java | 6 +- .../xowa/files/caches/Xof_cache_mgr2.java | 2 +- .../xowa/files/fsdb/Xof_fsdb_mgr__sql.java | 6 +- .../files/fsdb/fs_roots/Fs_root_fsdb_mgr.java | 2 +- .../xowa/files/fsdb/tsts/Xof_file_fxt.java | 4 +- .../src/gplx/xowa/files/gui/Js_img_mgr.java | 2 +- .../xowa/files/origs/Xob_orig_tbl_bldr.java | 2 +- .../src/gplx/xowa/gui/bnds/Xog_bnd_win.java | 90 ++ .../src/gplx/xowa/gui/menus/Xog_menu_mgr.java | 2 +- .../gplx/xowa/gui/views/Load_page_wkr.java | 81 ++ .../src/gplx/xowa/gui/views/Xog_html_itm.java | 48 +- .../gplx/xowa/gui/views/Xog_html_js_cbk.java | 4 +- .../xowa/gui/views/Xog_tab_close_lnr.java | 2 +- .../xowa/gui/views/Xog_tab_close_mgr.java | 4 +- .../src/gplx/xowa/gui/views/Xog_tab_itm.java | 61 +- .../xowa/gui/views/Xog_tab_itm_read_mgr.java | 11 +- .../src/gplx/xowa/gui/views/Xog_tab_mgr.java | 10 +- .../src/gplx/xowa/gui/views/Xog_win_itm.java | 12 +- .../gplx/xowa/html/Xoh_page_wtr_mgr_base.java | 26 + .../gplx/xowa/html/Xoh_page_wtr_mgr_tst.java | 2 +- .../src/gplx/xowa/html/Xoh_page_wtr_wkr.java | 10 +- .../gplx/xowa/html/Xoh_page_wtr_wkr_tst.java | 4 +- ...ge_wtr_mgr.java => Xohe_page_wtr_mgr.java} | 94 +- .../src/gplx/xowa/html/Xohv_page_wtr_mgr.java | 20 + 400_xowa/src/gplx/xowa/html/Xow_html_mgr.java | 4 +- .../gplx/xowa/html/css/Xowd_css_core_mgr.java | 4 +- .../gplx/xowa/html/hdumps/Xohd_hdump_rdr.java | 17 +- .../gplx/xowa/html/hdumps/Xohd_hdump_wtr.java | 2 +- .../xowa/html/hdumps/Xohd_hdump_wtr_tst.java | 6 +- .../hdumps/bldrs/Xob_redlink_mkr_cmd.java | 71 +- .../html/hdumps/core/Xohd_data_itm__base.java | 2 +- .../core/Xohd_data_itm__gallery_itm.java | 3 +- .../html/hdumps/core/Xohd_data_itm__img.java | 2 + .../hdumps/data/Xohd_page_html_mgr__load.java | 15 +- .../xowa/html/hzips/Xodump_stats_tbl.java | 3 +- .../xowa/html/hzips/Xow_hzip_itm__anchor.java | 7 +- .../xowa/html/modules/Xoh_module_itm_.java | 35 + .../modules/Xoh_module_itm__collapsible.java | 2 +- .../html/modules/Xoh_module_itm__css.java | 2 +- .../html/modules/Xoh_module_itm__gallery.java | 2 +- .../html/modules/Xoh_module_itm__globals.java | 8 +- .../html/modules/Xoh_module_itm__hiero.java | 2 +- .../html/modules/Xoh_module_itm__mathjax.java | 2 +- .../modules/Xoh_module_itm__navframe.java | 4 +- .../html/modules/Xoh_module_itm__popups.java | 2 +- .../Xoh_module_itm__search_suggest.java | 2 +- .../modules/Xoh_module_itm__timeline.java | 2 +- .../Xoh_module_itm__title_rewrite.java | 34 + .../html/modules/Xoh_module_itm__toc.java | 2 +- .../modules/Xoh_module_itm__top_icon.java | 2 +- .../xowa/html/modules/Xoh_module_mgr.java | 44 +- .../xowa/html/modules/Xoh_module_mgr_tst.java | 8 +- .../html/modules/popups/Xow_popup_mgr.java | 51 +- .../gplx/xowa/html/portal/Xow_portal_mgr.java | 2 +- .../xowa/html/sidebar/Xowh_sidebar_mgr.java | 15 +- .../html/sidebar/Xowh_sidebar_mgr_tst.java | 1 + .../src/gplx/xowa/langs/Xol_lang_itm_.java | 824 +++++++++--------- .../src/gplx/xowa/pages/Xopg_html_data.java | 9 +- .../gplx/xowa/servers/tcp/Xosrv_server.java | 6 +- .../search/Xog_search_suggest_mgr.java | 10 +- .../xowa/specials/search/Xosrh_qry_itm.java | 2 +- .../xowa/specials/search/Xosrh_scanner.java | 2 +- .../gplx/xowa/specials/search/Xows_core.java | 11 +- .../specials/search/Xows_db_matcher_bldr.java | 5 +- .../xowa/specials/search/Xows_db_wkr.java | 87 +- .../xowa/specials/search/Xows_html_wkr.java | 59 +- .../specials/search/Xows_html_wkr_tst.java | 8 +- .../specials/search/Xows_page__search.java | 2 +- .../xowa/specials/search/Xows_ui_async.java | 8 +- .../specials/search/Xows_ui_async_tst.java | 4 +- .../xowa/specials/search/Xows_ui_cmd.java | 25 +- .../search/parsers/Xow_search_scanner.java | 2 +- .../src/gplx/xowa/users/Xou_fsys_mgr.java | 24 +- .../src/gplx/xowa/users/data/Xoud_db_mgr.java | 2 +- .../xowa/users/data/Xoud_history_mgr.java | 2 +- .../src/gplx/xowa/users/prefs/Prefs_mgr.java | 7 +- .../wikis/data/tbls/Xowd_search_word_tbl.java | 4 +- .../xowa/wikis/modules/Xow_module_mgr.java | 12 +- .../xowa/xtns/gallery/Gallery_mgr_base.java | 6 +- .../gallery/Gallery_mgr_base_basic_tst.java | 2 +- .../xtns/gallery/Gallery_mgr_packed_base.java | 2 +- .../src/gplx/xowa/xtns/hieros/Hiero_xnde.java | 2 +- .../src/gplx/xowa/xtns/imaps/Imap_xnde.java | 2 +- .../xtns/indicators/Indicator_html_bldr.java | 21 +- .../indicators/Indicator_html_bldr_tst.java | 16 +- .../xowa/xtns/indicators/Indicator_xnde.java | 10 +- .../xtns/indicators/Indicator_xnde_tst.java | 2 +- .../src/gplx/xowa/xtns/math/Math_nde.java | 2 +- .../src/gplx/xowa/xtns/pfuncs/Pf_func_.java | 8 +- .../xowa/xtns/proofreadPage/Pp_pages_nde.java | 15 +- .../proofreadPage/Pp_pages_nde_basic_tst.java | 21 + .../engines/process/Process_server.java | 5 +- .../xtns/scribunto/libs/Scrib_lib_mw.java | 2 +- .../xtns/scribunto/libs/Scrib_lib_title.java | 2 +- .../scribunto/libs/Scrib_lib_title_tst.java | 4 +- .../xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java | 2 +- .../xtns/wdatas/pfuncs/Wdata_pf_property.java | 4 +- .../xtns/xowa_cmds/Xox_xowa_html_cmd_tst.java | 2 +- 400_xowa/src/gplx/xowa2/apps/Xoav_app.java | 18 +- .../src/gplx/xowa2/apps/Xoav_wiki_mgr.java | 6 +- 400_xowa/src/gplx/xowa2/gui/Xog_page.java | 6 +- .../src/gplx/xowa2/gui/Xogv_tab_base.java | 1 + 400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java | 53 +- .../wikis/specials/Xosp_special_mgr.java | 2 +- 400_xowa/src_060_utl/gplx/Int_ary_parser.java | 6 +- .../src_060_utl/gplx/NumberParser_tst.java | 89 -- .../{NumberParser.java => Number_parser.java} | 67 +- .../src_060_utl/gplx/Number_parser_tst.java | 103 +++ 400_xowa/src_060_utl/gplx/Url_encoder.java | 18 +- 400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java | 21 +- .../src_120_wiki/gplx/xowa/Xowe_wiki.java | 32 +- .../gplx/xowa/Xow_data_mgr.java | 2 +- .../gplx/xowa/Xofo_lnki_parser.java | 2 +- .../gplx/xowa/Xof_meta_thumb_parser.java | 8 +- .../gplx/xowa/Xof_xfer_queue.java | 4 +- .../gplx/xowa/Xof_xfer_queue_html_fxt.java | 2 +- .../gplx/xowa/Xoa_css_extractor.java | 29 +- .../gplx/xowa/Xoi_cmd_base.java | 4 +- .../gplx/xowa/Xoi_cmd_dumpfile.java | 2 +- .../gplx/xowa/Xoi_cmd_mgr.java | 6 +- .../gplx/xowa/Xoi_cmd_wiki.java | 4 +- .../gplx/xowa/Xoi_cmd_wiki_import.java | 4 +- .../gplx/xowa/Xoi_cmd_wiki_tst.java | 8 +- 400_xowa/src_300_html/gplx/xowa/Xoa_page.java | 3 +- 400_xowa/src_310_url/gplx/xowa/Xoa_url.java | 2 + .../src_310_url/gplx/xowa/Xoa_url_parser.java | 4 +- .../src_440_lnki/gplx/xowa/Xop_lnki_type.java | 12 +- .../src_440_lnki/gplx/xowa/Xop_lnki_wkr.java | 6 +- .../src_440_lnki/gplx/xowa/Xop_lnki_wkr_.java | 8 +- .../src_490_xnde/gplx/xowa/Xop_xatr_itm.java | 1 + .../src_490_xnde/gplx/xowa/Xop_xnde_wkr.java | 2 +- .../src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java | 14 +- .../en.wikipedia.org-text.xowa | Bin 36864 -> 36864 bytes 207 files changed, 2339 insertions(+), 1460 deletions(-) create mode 100644 100_core/src/gplx/core/threads/Gfo_lock.java rename 100_core/{src_210_env/gplx/threads/ThreadAdp.java => src/gplx/core/threads/Thread_adp.java} (77%) rename 100_core/{src_210_env/gplx/threads/ThreadAdp_.java => src/gplx/core/threads/Thread_adp_.java} (66%) create mode 100644 150_gfui/src_200_ipt/gplx/gfui/IptKey__tst.java create mode 100644 150_gfui/xtn/gplx/gfui/Swt_lbl.java rename 400_xowa/src/gplx/{ => core}/threads/Gfo_async_cmd_itm.java (94%) rename 400_xowa/src/gplx/{ => core}/threads/Gfo_async_cmd_mkr.java (94%) rename 400_xowa/src/gplx/{ => core}/threads/Gfo_async_mgr.java (90%) rename 400_xowa/{src_240_install/gplx => src/gplx/core}/threads/Gfo_thread_cmd.java (93%) rename 400_xowa/{src_240_install/gplx => src/gplx/core}/threads/Gfo_thread_cmd_.java (93%) rename 400_xowa/{src_240_install/gplx => src/gplx/core}/threads/Gfo_thread_cmd_base.java (96%) rename 400_xowa/{src_240_install/gplx => src/gplx/core}/threads/Gfo_thread_cmd_download.java (94%) rename 400_xowa/{src_240_install/gplx => src/gplx/core}/threads/Gfo_thread_cmd_replace.java (96%) rename 400_xowa/{src_240_install/gplx => src/gplx/core}/threads/Gfo_thread_cmd_unzip.java (97%) rename 400_xowa/src/gplx/{ => core}/threads/Gfo_thread_pool.java (92%) rename 400_xowa/src/gplx/{ => core}/threads/Gfo_thread_wkr.java (92%) create mode 100644 400_xowa/src/gplx/xowa/apps/Xoa_app_type.java create mode 100644 400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_word_parser.java create mode 100644 400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_word_parser_tst.java create mode 100644 400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_win.java create mode 100644 400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java create mode 100644 400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr_base.java rename 400_xowa/src/gplx/xowa/html/{Xoh_page_wtr_mgr.java => Xohe_page_wtr_mgr.java} (70%) create mode 100644 400_xowa/src/gplx/xowa/html/Xohv_page_wtr_mgr.java create mode 100644 400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm_.java create mode 100644 400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__title_rewrite.java delete mode 100644 400_xowa/src_060_utl/gplx/NumberParser_tst.java rename 400_xowa/src_060_utl/gplx/{NumberParser.java => Number_parser.java} (62%) create mode 100644 400_xowa/src_060_utl/gplx/Number_parser_tst.java diff --git a/100_core/src/gplx/core/threads/Gfo_lock.java b/100_core/src/gplx/core/threads/Gfo_lock.java new file mode 100644 index 000000000..378156273 --- /dev/null +++ b/100_core/src/gplx/core/threads/Gfo_lock.java @@ -0,0 +1,28 @@ +/* +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.core.threads; import gplx.*; import gplx.core.*; +import java.util.concurrent.locks.*; +public class Gfo_lock { + private final ReentrantLock lock = new ReentrantLock(true); + public void Lock() { + lock.lock(); + } + public void Unlock() { + lock.unlock(); + } +} diff --git a/100_core/src_210_env/gplx/threads/ThreadAdp.java b/100_core/src/gplx/core/threads/Thread_adp.java similarity index 77% rename from 100_core/src_210_env/gplx/threads/ThreadAdp.java rename to 100_core/src/gplx/core/threads/Thread_adp.java index 1c8c13f27..bc8c999ec 100644 --- a/100_core/src_210_env/gplx/threads/ThreadAdp.java +++ b/100_core/src/gplx/core/threads/Thread_adp.java @@ -15,15 +15,15 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; import java.lang.*; -public class ThreadAdp implements Runnable { +public class Thread_adp implements Runnable { private String name; private GfoInvkAble invk; private String cmd; private GfoMsg msg; - @gplx.Internal protected ThreadAdp(String name, GfoInvkAble invk, String cmd, GfoMsg msg) { + @gplx.Internal protected Thread_adp(String name, GfoInvkAble invk, String cmd, GfoMsg msg) { this.name = name; this.invk = invk; this.cmd = cmd; this.msg = msg; this.ctor_ThreadAdp(); } - public ThreadAdp Start() {thread.start(); return this;} + public Thread_adp Start() {thread.start(); return this;} public void Interrupt() {thread.interrupt();} public void Join() { try { @@ -45,5 +45,5 @@ public class ThreadAdp implements Runnable { invk.Invk(GfsCtx._, 0, cmd, msg); } public Thread Under_thread() {return thread;} private Thread thread; - public static final ThreadAdp Null = new ThreadAdp(ThreadAdp_.Name_null, GfoInvkAble_.Null, "", GfoMsg_.Null); + public static final Thread_adp Null = new Thread_adp(Thread_adp_.Name_null, GfoInvkAble_.Null, "", GfoMsg_.Null); } diff --git a/100_core/src_210_env/gplx/threads/ThreadAdp_.java b/100_core/src/gplx/core/threads/Thread_adp_.java similarity index 66% rename from 100_core/src_210_env/gplx/threads/ThreadAdp_.java rename to 100_core/src/gplx/core/threads/Thread_adp_.java index 131d7e1f7..cd09b634a 100644 --- a/100_core/src_210_env/gplx/threads/ThreadAdp_.java +++ b/100_core/src/gplx/core/threads/Thread_adp_.java @@ -15,8 +15,8 @@ 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.threads; import gplx.*; -public class ThreadAdp_ { +package gplx.core.threads; import gplx.*; import gplx.core.*; +public class Thread_adp_ { public static void Sleep(int milliseconds) { try {Thread.sleep(milliseconds);} catch (InterruptedException e) {throw Err_.err_key_(e, "gplx.Thread", "thread interrupted").Add("milliseconds", milliseconds);} } @@ -25,12 +25,12 @@ public class ThreadAdp_ { try {o.wait();} catch (InterruptedException e) {throw Err_.err_key_(e, "gplx.Thread", "thread wait");} } - public static ThreadAdp invk_(GfoInvkAble invk, String cmd) {return invk_(Name_null, invk, cmd);} - public static ThreadAdp invk_(String name, GfoInvkAble invk, String cmd) {return new ThreadAdp(name, invk, cmd, GfoMsg_.Null);} - public static ThreadAdp invk_msg_(GfoInvkAble invk, GfoMsg msg) {return invk_msg_(Name_null, invk, msg);} - public static ThreadAdp invk_msg_(String name, GfoInvkAble invk, GfoMsg msg) {return new ThreadAdp(name, invk, msg.Key(), msg);} + public static Thread_adp invk_(GfoInvkAble invk, String cmd) {return invk_(Name_null, invk, cmd);} + public static Thread_adp invk_(String name, GfoInvkAble invk, String cmd) {return new Thread_adp(name, invk, cmd, GfoMsg_.Null);} + public static Thread_adp invk_msg_(GfoInvkAble invk, GfoMsg msg) {return invk_msg_(Name_null, invk, msg);} + public static Thread_adp invk_msg_(String name, GfoInvkAble invk, GfoMsg msg) {return new Thread_adp(name, invk, msg.Key(), msg);} public static void Run_invk_msg(String name, GfoInvkAble invk, GfoMsg m) { - ThreadAdp_.invk_msg_(name, invk, m).Start(); + Thread_adp_.invk_msg_(name, invk, m).Start(); } public static final String Name_null = null; } diff --git a/100_core/src_110_primitive/gplx/Bry_.java b/100_core/src_110_primitive/gplx/Bry_.java index df3f3287a..da0f6302f 100644 --- a/100_core/src_110_primitive/gplx/Bry_.java +++ b/100_core/src_110_primitive/gplx/Bry_.java @@ -624,6 +624,7 @@ public class Bry_ { } public static int Xto_int_or(byte[] ary, int or) {return Xto_int_or(ary, null, 0, ary.length, or);} public static int Xto_int_or(byte[] ary, int bgn, int end, int or) {return Xto_int_or(ary, null, bgn, end, or);} + public static int Xto_int_or(byte[] ary, byte[] ignore_ary, int or) {return Xto_int_or(ary, ignore_ary, 0, ary.length, or);} public static int Xto_int_or(byte[] ary, byte[] ignore_ary, int bgn, int end, int or) { if ( ary == null || end == bgn // null-len diff --git a/100_core/src_110_primitive/gplx/Bry_fmtr.java b/100_core/src_110_primitive/gplx/Bry_fmtr.java index 0cafad165..bce917ee1 100644 --- a/100_core/src_110_primitive/gplx/Bry_fmtr.java +++ b/100_core/src_110_primitive/gplx/Bry_fmtr.java @@ -121,98 +121,100 @@ public class Bry_fmtr { public int Missing_adj() {return missing_adj;} public Bry_fmtr Missing_adj_(int v) {missing_adj = v; return this;} int missing_adj; public boolean Fail_when_invalid_escapes() {return fail_when_invalid_escapes;} public Bry_fmtr Fail_when_invalid_escapes_(boolean v) {fail_when_invalid_escapes = v; return this;} private boolean fail_when_invalid_escapes = true; public Bry_fmtr Compile() { - Bry_bfr lkp_bfr = Bry_bfr.new_(16); - int fmt_len = fmt.length; int fmt_end = fmt_len - 1; int fmt_pos = 0; - byte[] trg_bry = new byte[fmt_len]; int trg_pos = 0; - boolean lkp_is_active = false, lkp_is_numeric = true; - byte nxt_byte, tmp_byte; - ListAdp list = ListAdp_.new_(); - fmt_args_exist = false; - while (true) { - if (fmt_pos > fmt_end) break; - byte cur_byte = fmt[fmt_pos]; - if (lkp_is_active) { - if (cur_byte == char_arg_end) { - if (lkp_is_numeric) - list.Add(Bry_fmtr_itm.arg_(lkp_bfr.XtoInt(0) - baseInt)); + synchronized (this) { // THREAD: DATE:2015-04-29 + Bry_bfr lkp_bfr = Bry_bfr.new_(16); + int fmt_len = fmt.length; int fmt_end = fmt_len - 1; int fmt_pos = 0; + byte[] trg_bry = new byte[fmt_len]; int trg_pos = 0; + boolean lkp_is_active = false, lkp_is_numeric = true; + byte nxt_byte, tmp_byte; + ListAdp list = ListAdp_.new_(); + fmt_args_exist = false; + while (true) { + if (fmt_pos > fmt_end) break; + byte cur_byte = fmt[fmt_pos]; + if (lkp_is_active) { + if (cur_byte == char_arg_end) { + if (lkp_is_numeric) + list.Add(Bry_fmtr_itm.arg_(lkp_bfr.XtoInt(0) - baseInt)); + else { + byte[] key_fmt = lkp_bfr.Xto_bry(); + Object idx_ref = keys.Fetch(Bry_obj_ref.new_(key_fmt)); + if (idx_ref == null) { + int lkp_bfr_len = lkp_bfr.Len(); + byte[] lkp_bry = lkp_bfr.Bfr(); + trg_bry[trg_pos++] = char_escape; + trg_bry[trg_pos++] = char_arg_bgn; + for (int i = 0; i < lkp_bfr_len; i++) + trg_bry[trg_pos++] = lkp_bry[i]; + trg_bry[trg_pos++] = char_arg_end; + } + else { + list.Add(Bry_fmtr_itm.arg_(((Int_obj_val)idx_ref).Val() - baseInt)); + } + } + lkp_is_active = false; + lkp_bfr.Clear(); + fmt_args_exist = true; + } else { - byte[] key_fmt = lkp_bfr.Xto_bry(); - Object idx_ref = keys.Fetch(Bry_obj_ref.new_(key_fmt)); - if (idx_ref == null) { - int lkp_bfr_len = lkp_bfr.Len(); - byte[] lkp_bry = lkp_bfr.Bfr(); - trg_bry[trg_pos++] = char_escape; - trg_bry[trg_pos++] = char_arg_bgn; - for (int i = 0; i < lkp_bfr_len; i++) - trg_bry[trg_pos++] = lkp_bry[i]; - trg_bry[trg_pos++] = char_arg_end; + lkp_bfr.Add_byte(cur_byte); + switch (cur_byte) { + case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4: + case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: + break; + default: + lkp_is_numeric = false; + break; + } + } + fmt_pos += 1; + } + else if (cur_byte == char_escape) { + if (fmt_pos == fmt_end) { + if (fail_when_invalid_escapes) + throw Err_.new_("escape char encountered but no more chars left"); + else { + trg_bry[trg_pos] = cur_byte; + break; + } + } + nxt_byte = fmt[fmt_pos + 1]; + if (nxt_byte == char_arg_bgn) { + if (trg_pos > 0) {list.Add(Bry_fmtr_itm.dat_(trg_bry, trg_pos)); trg_pos = 0;} // something pending; add it to list + int eval_lhs_bgn = fmt_pos + 2; + if (eval_lhs_bgn < fmt_len && fmt[eval_lhs_bgn] == char_eval_bgn) { // eval found + fmt_pos = Compile_eval_cmd(fmt, fmt_len, eval_lhs_bgn, list); + continue; } else { - list.Add(Bry_fmtr_itm.arg_(((Int_obj_val)idx_ref).Val() - baseInt)); + lkp_is_active = true; + lkp_is_numeric = true; } } - lkp_is_active = false; - lkp_bfr.Clear(); - fmt_args_exist = true; + else { // ~{0}; ~~ -> ~; ~n -> newLine; ~t -> tab + if (nxt_byte == char_escape) tmp_byte = char_escape; + else if (nxt_byte == char_escape_nl) tmp_byte = Byte_ascii.NewLine; + else if (nxt_byte == char_escape_tab) tmp_byte = Byte_ascii.Tab; + else { + if (fail_when_invalid_escapes) throw Err_.new_("unknown escape code").Add("code", Char_.XbyInt(nxt_byte)).Add("fmt_pos", fmt_pos + 1); + else + tmp_byte = cur_byte; + } + trg_bry[trg_pos++] = tmp_byte; + } + fmt_pos += 2; } else { - lkp_bfr.Add_byte(cur_byte); - switch (cur_byte) { - case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4: - case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: - break; - default: - lkp_is_numeric = false; - break; - } + trg_bry[trg_pos++] = cur_byte; + fmt_pos += 1; } - fmt_pos += 1; - } - else if (cur_byte == char_escape) { - if (fmt_pos == fmt_end) { - if (fail_when_invalid_escapes) - throw Err_.new_("escape char encountered but no more chars left"); - else { - trg_bry[trg_pos] = cur_byte; - break; - } - } - nxt_byte = fmt[fmt_pos + 1]; - if (nxt_byte == char_arg_bgn) { - if (trg_pos > 0) {list.Add(Bry_fmtr_itm.dat_(trg_bry, trg_pos)); trg_pos = 0;} // something pending; add it to list - int eval_lhs_bgn = fmt_pos + 2; - if (eval_lhs_bgn < fmt_len && fmt[eval_lhs_bgn] == char_eval_bgn) { // eval found - fmt_pos = Compile_eval_cmd(fmt, fmt_len, eval_lhs_bgn, list); - continue; - } - else { - lkp_is_active = true; - lkp_is_numeric = true; - } - } - else { // ~{0}; ~~ -> ~; ~n -> newLine; ~t -> tab - if (nxt_byte == char_escape) tmp_byte = char_escape; - else if (nxt_byte == char_escape_nl) tmp_byte = Byte_ascii.NewLine; - else if (nxt_byte == char_escape_tab) tmp_byte = Byte_ascii.Tab; - else { - if (fail_when_invalid_escapes) throw Err_.new_("unknown escape code").Add("code", Char_.XbyInt(nxt_byte)).Add("fmt_pos", fmt_pos + 1); - else - tmp_byte = cur_byte; - } - trg_bry[trg_pos++] = tmp_byte; - } - fmt_pos += 2; - } - else { - trg_bry[trg_pos++] = cur_byte; - fmt_pos += 1; } + if (lkp_is_active) throw Err_.new_("idx mode not closed"); + if (trg_pos > 0) {list.Add(Bry_fmtr_itm.dat_(trg_bry, trg_pos)); trg_pos = 0;} + itms = (Bry_fmtr_itm[])list.Xto_ary(Bry_fmtr_itm.class); + itms_len = itms.length; + return this; } - if (lkp_is_active) throw Err_.new_("idx mode not closed"); - if (trg_pos > 0) {list.Add(Bry_fmtr_itm.dat_(trg_bry, trg_pos)); trg_pos = 0;} - itms = (Bry_fmtr_itm[])list.Xto_ary(Bry_fmtr_itm.class); - itms_len = itms.length; - return this; } int Compile_eval_cmd(byte[] fmt, int fmt_len, int eval_lhs_bgn, ListAdp list) { int eval_lhs_end = Bry_finder.Find_fwd(fmt, char_eval_end, eval_lhs_bgn + Int_.Const_dlm_len, fmt_len); if (eval_lhs_end == Bry_.NotFound) throw Err_mgr._.fmt_(GRP_KEY, "eval_lhs_end_invalid", "could not find eval_lhs_end: ~{0}", String_.new_utf8_(fmt, eval_lhs_bgn, fmt_len)); diff --git a/100_core/src_210_env/gplx/Env_.java b/100_core/src_210_env/gplx/Env_.java index dae367bad..a7641147e 100644 --- a/100_core/src_210_env/gplx/Env_.java +++ b/100_core/src_210_env/gplx/Env_.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -import gplx.threads.*; +import gplx.core.threads.*; public class Env_ { public static void Init(String[] args, String appNameAndExt, Class type) { mode_testing = false; @@ -30,10 +30,8 @@ public class Env_ { appArgs = args; appUrl = JarAdp_.Url_type(type); } - public static void Init_drd(String[] args, Io_url url) { + public static void Init_drd() { mode_testing = mode_debug = false; - appArgs = args; - appUrl = url; } public static void Init_testing() {mode_testing = true;} public static boolean Mode_testing() {return mode_testing;} static boolean mode_testing = true; @@ -93,7 +91,7 @@ public class Env_ { return System.getProperty(key); } static final String Env_prop_key__user_language = "user.language"; public static void Term_add(GfoInvkAble invk, String cmd) { - ThreadAdp thread = ThreadAdp_.invk_(invk, cmd); + Thread_adp thread = Thread_adp_.invk_(invk, cmd); Runtime.getRuntime().addShutdownHook(thread.Under_thread()); } } diff --git a/100_core/src_210_env/gplx/ProcessAdp.java b/100_core/src_210_env/gplx/ProcessAdp.java index 22602ef36..d011d0745 100644 --- a/100_core/src_210_env/gplx/ProcessAdp.java +++ b/100_core/src_210_env/gplx/ProcessAdp.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -import gplx.threads.*; +import gplx.core.threads.*; import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -147,7 +147,7 @@ public class ProcessAdp implements GfoInvkAble, RlsAble { while (thread.isAlive()) { thread_run = true; long prv = Env_.TickCount(); - ThreadAdp_.Sleep(thread_interval); + Thread_adp_.Sleep(thread_interval); // try {thread.join(thread_interval);} // catch (InterruptedException e) {throw Err_.err_key_(e, "gplx.ProcessAdp", "thread interrupted at join");} long cur = Env_.TickCount(); diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptArg_.java b/150_gfui/src_200_ipt/gplx/gfui/IptArg_.java index dc0218862..7f0a9c33b 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptArg_.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptArg_.java @@ -19,6 +19,8 @@ package gplx.gfui; import gplx.*; public class IptArg_ { public static final IptArg[] Ary_empty = new IptArg[0]; public static final IptArg Null = null; + public static final String Wildcard_key = "wildcard"; + public static IptArg Wildcard = new IptKey(Int_.MaxValue, Wildcard_key); public static boolean Is_null_or_none(IptArg arg) {return arg == Null || arg == IptKey_.None;} public static IptArg[] Ary(IptArg... v) {return v;} public static IptArg[] parse_ary_or_empty(String v) { diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java b/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java index 77a94891a..a2ea48c1c 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java @@ -21,7 +21,7 @@ public class IptBndMgr implements SrlAble { public void EventsToFwd_set(IptEventType v) {eventsToFwd = v;} IptEventType eventsToFwd = IptEventType_.KeyDown; public void EventsToFwd_add(IptEventType v) {eventsToFwd = eventsToFwd.Add(v);} @gplx.Internal protected boolean Has(IptEventType type) {return IptEventType_.Has(curTypes, type);} - @gplx.Internal protected void Clear() {hash.Clear(); curTypes = IptEventType_.None; ClearLists(); chainMgr.Clear();} + public void Clear() {hash.Clear(); curTypes = IptEventType_.None; ClearLists(); chainMgr.Clear();} public void Add(IptBnd bnd) { for (IptBndHash list : regy) if (IptEventType_.Has(bnd.EventTypes(), list.EventType())) @@ -40,7 +40,7 @@ public class IptBndMgr implements SrlAble { cfg.Owners_del(ptr.CfgKey()); for (IptBndHash list : regy) { for (int j = 0; j < list.Count(); j++) { - IptBndListItm itmList = list.GetAt(j); + IptBndListItm itmList = list.Get_at(j); for (int k = 0; k < itmList.Count(); k++) { IptBnd bnd = itmList.FetchAt(k); if (String_.Eq(ptr.BndKey(), bnd.Key())) { @@ -60,7 +60,7 @@ public class IptBndMgr implements SrlAble { IptBnd old = null; for (IptBndHash list : regy) { for (int j = 0; j < list.Count(); j++) { - IptBndListItm itmList = list.GetAt(j); + IptBndListItm itmList = list.Get_at(j); for (int i = 0; i < itmList.Count(); i++) { IptBnd bnd = itmList.FetchAt(i); if (String_.Eq(key, bnd.Key())) { @@ -89,7 +89,7 @@ public class IptBndMgr implements SrlAble { IptBndHash list = regy[i]; int list_len = list.Count(); for (int j = 0; j < list_len; j++) { - IptBndListItm bnds = list.GetAt(j); + IptBndListItm bnds = list.Get_at(j); int bnds_len = bnds.Count(); for (int k = 0; k < bnds_len; k++) { IptBnd itm_bnd = bnds.FetchAt(k); @@ -129,7 +129,7 @@ public class IptBndMgr implements SrlAble { IptBndHash list = regy[AryIdx(evData.EventType())]; String key = evData.EventArg().Key(); if (!String_.Eq(chainMgr.ActiveKey(), "")) key = chainMgr.ActiveKey() + key; - IptBndListItm itm = list.Get(key); + IptBndListItm itm = list.Get_by(key); String chainP = ""; if (evData.EventType() == IptEventType_.KeyDown) { chainP = chainMgr.Process(evData.EventArg()); @@ -170,20 +170,27 @@ public class IptBndMgr implements SrlAble { } } class IptBndHash implements SrlAble { + private IptBndListItm wildcard_list; public IptEventType EventType() {return eventType;} IptEventType eventType; public int Count() {return hash.Count();} - public IptBndListItm Get(String iptKey) {return (IptBndListItm)hash.Fetch(iptKey);} - public IptBndListItm GetAt(int i) {return (IptBndListItm)hash.FetchAt(i);} + public IptBndListItm Get_by(String key) {return wildcard_list == null ? (IptBndListItm)hash.Fetch(key) : wildcard_list;} + public IptBndListItm Get_at(int i) {return (IptBndListItm)hash.FetchAt(i);} public void Add(IptBnd bnd) { for (int i = 0; i < bnd.Ipts().Count(); i++) { IptArg arg = (IptArg)bnd.Ipts().FetchAt(i); if (!IptArg_.EventType_match(arg, eventType)) continue; // bnd may have multiple ipts of different evTypes; only add bnd if evType matches - IptBndListItm itm = (IptBndListItm)hash.Fetch(arg.Key()); - if (itm == null) { - itm = new IptBndListItm(arg.Key()); - hash.Add(arg.Key(), itm); + if (String_.Eq(arg.Key(), IptArg_.Wildcard_key)) { + if (wildcard_list == null) wildcard_list = new IptBndListItm(IptArg_.Wildcard_key); + wildcard_list.Add(bnd); + } + else { + IptBndListItm itm = (IptBndListItm)hash.Fetch(arg.Key()); + if (itm == null) { + itm = new IptBndListItm(arg.Key()); + hash.Add(arg.Key(), itm); + } + itm.Add(bnd); } - itm.Add(bnd); } } public void Del(IptBnd bnd) { diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKey.java b/150_gfui/src_200_ipt/gplx/gfui/IptKey.java index 4b2541005..a5fd45790 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptKey.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKey.java @@ -17,13 +17,13 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; public class IptKey implements IptArg { - public String Key() {return key;} private String key; + @gplx.Internal protected IptKey(int val, String key) {this.val = val; this.key = key;} + public String Key() {return key;} private final String key; + public int Val() {return val;} private final int val; public boolean Eq(IptArg comp) {return String_.Eq(key, comp.Key());} public String XtoUiStr() {return IptKeyStrMgr._.XtoStr(this);} public IptKey Add(IptKey comp) {return IptKey_.add_(this, comp);} public boolean Mod_shift() {return Enm_.HasInt(val, IptKey_.Shift.Val());} public boolean Mod_ctrl() {return Enm_.HasInt(val, IptKey_.Ctrl.Val());} public boolean Mod_alt() {return Enm_.HasInt(val, IptKey_.Alt.Val());} - @gplx.Internal protected int Val() {return val;} int val; - @gplx.Internal protected IptKey(int val, String key) {this.val = val; this.key = key;} } diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKeyStrMgr.java b/150_gfui/src_200_ipt/gplx/gfui/IptKeyStrMgr.java index 6b24c9b17..1d33bb34e 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptKeyStrMgr.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKeyStrMgr.java @@ -24,8 +24,8 @@ class IptKeyStrMgr { } public String XtoStr(IptKey key) { if (literals == null) Init(); - Object rvObj = literals.Fetch(key.Val()); - return rvObj == null ? String_.Empty : (String)rvObj; + Object rv = literals.Fetch(key.Val()); + return rv == null ? String_.Empty : (String)rv; } public void XtoIptKeyAry(ListAdp list) { if (literals == null) Init(); diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java b/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java index 375202a80..9ccb1dc19 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java @@ -17,9 +17,11 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; import java.awt.event.KeyEvent; -public class IptKey_ { +import gplx.core.primitives.*; +public class IptKey_ { private static EnmMgr enmMgr = EnmMgr.new_().BitRngBgn_(65536).BitRngEnd_(262144).Prefix_("key."); public static IptKey[] Ary(IptKey... ary) {return ary;} + public static final IptKey[] Ary_empty = new IptKey[0]; public static IptKey as_(Object obj) {return obj instanceof IptKey ? (IptKey)obj : null;} public static IptKey cast_(Object obj) {try {return (IptKey)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, IptKey.class, obj);}} public static IptKey add_(IptKey... ary) { @@ -99,4 +101,49 @@ public class IptKey_ { , Quote = new_(222, "quote") , Shift = new_(KeyCode_Shift, "shift"), Ctrl = new_(KeyCode_Ctrl, "ctrl"), Alt = new_(KeyCode_Alt, "alt") ; + private static OrderedHash ui_str_hash; + public static OrderedHash Ui_str_hash() { + if (ui_str_hash == null) { + ui_str_hash = OrderedHash_.new_(); + All_add(ui_str_hash + , IptKey_.Back, IptKey_.Tab, IptKey_.Clear, IptKey_.Enter + , IptKey_.Pause, IptKey_.CapsLock, IptKey_.Escape, IptKey_.Space + , IptKey_.PageUp, IptKey_.PageDown, IptKey_.End, IptKey_.Home + , IptKey_.Left, IptKey_.Up, IptKey_.Right, IptKey_.Down + , IptKey_.PrintScreen, IptKey_.Insert, IptKey_.Delete + , IptKey_.D0, IptKey_.D1, IptKey_.D2, IptKey_.D3, IptKey_.D4 + , IptKey_.D5, IptKey_.D6, IptKey_.D7, IptKey_.D8, IptKey_.D9 + , IptKey_.A, IptKey_.B, IptKey_.C, IptKey_.D, IptKey_.E + , IptKey_.F, IptKey_.G, IptKey_.H, IptKey_.I, IptKey_.J + , IptKey_.K, IptKey_.L, IptKey_.M, IptKey_.N, IptKey_.O + , IptKey_.P, IptKey_.Q, IptKey_.R, IptKey_.S, IptKey_.T + , IptKey_.U, IptKey_.V, IptKey_.W, IptKey_.X, IptKey_.Y + , IptKey_.Z + , IptKey_.F1, IptKey_.F2, IptKey_.F3, IptKey_.F4, IptKey_.F5, IptKey_.F6 + , IptKey_.F7, IptKey_.F8, IptKey_.F9, IptKey_.F10, IptKey_.F11, IptKey_.F12 + , IptKey_.NumLock, IptKey_.ScrollLock + , IptKey_.Semicolon, IptKey_.Equal, IptKey_.Comma, IptKey_.Minus, IptKey_.Period, IptKey_.Slash, IptKey_.Tick + , IptKey_.OpenBracket, IptKey_.Back, IptKey_.CloseBracket, IptKey_.Quote + ); + } + return ui_str_hash; + } + private static void All_add(OrderedHash hash, IptKey... ary) { + int len = ary.length; + for (int i = 0; i < len; ++i) { + IptKey key = ary[i]; + hash.AddReplace(Int_obj_ref.new_(key.Val()), key); + } + } + public static String To_str(int val) { + String mod_str = "", rv = ""; + boolean mod_c = Enm_.HasInt(val, IptKey_.Ctrl.Val()); if (mod_c) {mod_str += "c"; val = Enm_.FlipInt(Bool_.N, val, IptKey_.Ctrl.Val());} + boolean mod_a = Enm_.HasInt(val, IptKey_.Alt.Val()); if (mod_a) {mod_str += "a"; val = Enm_.FlipInt(Bool_.N, val, IptKey_.Alt.Val());} + boolean mod_s = Enm_.HasInt(val, IptKey_.Shift.Val()); if (mod_s) {mod_str += "s"; val = Enm_.FlipInt(Bool_.N, val, IptKey_.Shift.Val());} + if (String_.Len_gt_0(mod_str)) + rv = "mod." + mod_str + "+"; + IptKey key = (IptKey)IptKey_.Ui_str_hash().Fetch(Int_obj_ref.new_(val)); + String key_str = key == null ? "key." + Int_.Xto_str(val) : key.Key(); + return rv + key_str; + } } diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKey__tst.java b/150_gfui/src_200_ipt/gplx/gfui/IptKey__tst.java new file mode 100644 index 000000000..ed9d66883 --- /dev/null +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKey__tst.java @@ -0,0 +1,30 @@ +/* +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.gfui; import gplx.*; +import org.junit.*; +public class IptKey__tst { + private final IptKey__fxt fxt = new IptKey__fxt(); + @Test public void To_str() { + fxt.Test_to_str(196608, "mod.cs+key.0"); + } +} +class IptKey__fxt { + public void Test_to_str(int keycode, String expd) { + Tfds.Eq(expd, IptKey_.To_str(keycode)); + } +} diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn.java index 33db1c0f7..867f84c21 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn.java @@ -68,4 +68,5 @@ public class GfuiBtn extends GfuiElemBase { } catch (Exception e) {GfuiEnv_.ShowMsg(Err_.Message_gplx(e));} } public static final String Invk_btn_img = "btn_img", Invk_btn_img_ = "btn_img_"; + public static final String CFG_border_on_ = "border_on_"; } diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl.java index aa5de2729..ad22c6bc8 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl.java @@ -31,6 +31,9 @@ public class GfuiLbl extends GfuiElemBase { // standard label does not support t super.ctor_GfuiBox_base(ctorArgs); this.CustomDraw_set(true); } - GfuiBorderMgr focusBorder = GfuiBorderMgr.new_(); + @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) { + super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs); + this.CustomDraw_set(true); + } @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_._.lbl_();} } diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl_.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl_.java index b6e99be40..4a292359b 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl_.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl_.java @@ -23,6 +23,11 @@ public class GfuiLbl_ { rv.TextMgr().AlignH_(GfuiAlign_.Mid); return rv; } + public static GfuiLbl kit_(Gfui_kit kit, String key, GxwElem elm, KeyValHash ctorArgs) { + GfuiLbl rv = new GfuiLbl(); + rv.ctor_kit_GfuiElemBase(kit, key, elm, ctorArgs); + return rv; + } public static GfuiLbl prefix_(String key, GfuiElem owner, String text) { GfuiLbl rv = sub_(key, owner); rv.Text_(text); diff --git a/150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java b/150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java index 478091eba..4e3be22ee 100644 --- a/150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java +++ b/150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; import gplx.gfml.*; -import gplx.threads.*; +import gplx.core.threads.*; import java.awt.AWTKeyStroke; import java.awt.Font; import java.awt.Graphics; @@ -81,7 +81,7 @@ public class GfuiEnv_ { public static void ShowMsg(String message) {javax.swing.JOptionPane.showMessageDialog(null, message, "", javax.swing.JOptionPane.INFORMATION_MESSAGE, null);} public static void BringToFront(ProcessAdp process) {} public static void DoEvents(int milliseconds) { - ThreadAdp_.Sleep(milliseconds); + Thread_adp_.Sleep(milliseconds); } public static void Run(GfuiWin form) {javax.swing.SwingUtilities.invokeLater(new GfuiFormRunner(form));} public static FontAdp System_font() { diff --git a/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java b/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java index 1af8a4ac3..cb6c09160 100644 --- a/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java @@ -38,6 +38,7 @@ public interface Gfui_kit extends GfoInvkAble { Gfui_tab_mgr New_tab_mgr(String key, GfuiElem owner, KeyVal... args); GfuiTextBox New_text_box(String key, GfuiElem owner, KeyVal... args); GfuiBtn New_btn(String key, GfuiElem owner, KeyVal... args); + GfuiLbl New_lbl(String key, GfuiElem owner, KeyVal... args); Gfui_dlg_file New_dlg_file(byte type, String msg); Gfui_dlg_msg New_dlg_msg(String msg); ImageAdp New_img_load(Io_url path); diff --git a/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java b/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java index ea91771a6..1aedadd0c 100644 --- a/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java +++ b/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java @@ -67,6 +67,11 @@ public abstract class Gfui_kit_base implements Gfui_kit { owner.SubElems().Add(rv); return rv; } + @gplx.Virtual public GfuiLbl New_lbl(String key, GfuiElem owner, KeyVal... args) { + GfuiLbl rv = GfuiLbl_.kit_(this, key, New_btn_impl(), ctor_args); + owner.SubElems().Add(rv); + return rv; + } @gplx.Virtual public GfuiStatusBox New_status_box(String key, GfuiElem owner, KeyVal... args) { GfuiStatusBox rv = GfuiStatusBox_.kit_(this, key, this.Factory().text_memo_()); owner.SubElems().Add(rv); diff --git a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java index 834b66460..4a34fd205 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java @@ -42,7 +42,9 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.omg.PortableServer.THREAD_POLICY_ID; -import gplx.threads.*; + +import gplx.core.threads.Thread_adp_; +import gplx.core.threads.*; public class Swt_kit implements Gfui_kit { private final KeyValHash ctor_args = KeyValHash.new_(); private final KeyValHash ctor_args_null = KeyValHash.new_(); private final HashAdp kit_args = HashAdp_.new_(); private Swt_msg_wkr_stop msg_wkr_stop; @@ -125,7 +127,9 @@ public class Swt_kit implements Gfui_kit { } public GfuiInvkCmd New_cmd_sync (GfoInvkAble invk) {return new Swt_gui_cmd(this, gui_wtr, display, invk, Bool_.N);} public GfuiInvkCmd New_cmd_async(GfoInvkAble invk) {return new Swt_gui_cmd(this, gui_wtr, display, invk, Bool_.Y);} - public GfuiWin New_win_utl(String key, GfuiWin owner, KeyVal... args) {return GfuiWin_.kit_(this, key, new Swt_win(shell), ctor_args_null); } + public GfuiWin New_win_utl(String key, GfuiWin owner, KeyVal... args) { + return GfuiWin_.kit_(this, key, new Swt_win(shell), ctor_args_null); + } public GfuiWin New_win_app(String key, KeyVal... args) { Swt_win win = new Swt_win(display); this.shell = win.UnderShell(); @@ -137,6 +141,11 @@ public class Swt_kit implements Gfui_kit { owner.SubElems().Add(rv); return rv; } + public GfuiLbl New_lbl(String key, GfuiElem owner, KeyVal... args) { + GfuiLbl rv = GfuiLbl_.kit_(this, key, new Swt_lbl(Swt_control_.cast_or_fail(owner), ctor_args), ctor_args); + owner.SubElems().Add(rv); + return rv; + } public Gfui_html New_html(String key, GfuiElem owner, KeyVal... args) { ctor_args.Clear(); // check cfg for browser type @@ -262,7 +271,7 @@ class Swt_shell_close_lnr implements Listener, GfoInvkAble { } if (kit.Kit_sync_cmd_exists()) { // sync cmd is running; cannot shut down app else app just hangs; DATE:2015-04-13 event.doit = false; // cancel shutdown - ThreadAdp_.invk_(this, Invk_wait_for_sync_cmd).Start(); // wait for sync_cmd to end in background thread; call shutdown again when it does + Thread_adp_.invk_(this, Invk_wait_for_sync_cmd).Start(); // wait for sync_cmd to end in background thread; call shutdown again when it does } } private void Wait_for_sync_cmd() { // THREAD:non-GUI @@ -273,7 +282,7 @@ class Swt_shell_close_lnr implements Listener, GfoInvkAble { usr_dlg.Log_many("", "", "swt:sync cmd done; shutting down"); break; } - ThreadAdp_.Sleep(loop_wait); + Thread_adp_.Sleep(loop_wait); loop_count++; } if (loop_count == loop_max) diff --git a/150_gfui/xtn/gplx/gfui/Swt_btn.java b/150_gfui/xtn/gplx/gfui/Swt_btn.java index 74b3fa498..713f434bd 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_btn.java +++ b/150_gfui/xtn/gplx/gfui/Swt_btn.java @@ -57,18 +57,19 @@ class Swt_btn implements GxwElem, Swt_control { @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return null;} } class Swt_btn_no_border implements GxwElem, Swt_control { + private ImageAdp btn_img; private Composite box_grp; private Label box_btn; public Swt_btn_no_border(Swt_control owner_control, KeyValHash ctorArgs) { Composite owner = owner_control.Under_composite(); Make_btn_no_border(owner.getDisplay(), owner.getShell(), owner); - core = new Swt_core_cmds(box_btn); + this.core = new Swt_core_cmds(box_btn); box_btn.addKeyListener(new Swt_lnr_key(this)); box_btn.addMouseListener(new Swt_lnr_mouse(this)); } @Override public Control Under_control() {return box_btn;} @Override public Control Under_menu_control() {return box_btn;} @Override public String TextVal() {return box_btn.getText();} @Override public void TextVal_set(String v) {box_btn.setText(v);} - @Override public GxwCore_base Core() {return core;} Swt_core_cmds core; - @Override public GxwCbkHost Host() {return host;} @Override public void Host_set(GxwCbkHost host) {this.host = host;} GxwCbkHost host; + @Override public GxwCore_base Core() {return core;} private final Swt_core_cmds core; + @Override public GxwCbkHost Host() {return host;} @Override public void Host_set(GxwCbkHost host) {this.host = host;} private GxwCbkHost host; @Override public Composite Under_composite() {return null;} @Override public void EnableDoubleBuffering() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { @@ -82,9 +83,6 @@ class Swt_btn_no_border implements GxwElem, Swt_control { int dif = 6; box_btn.setImage((Image)v.Resize(size.Width() - dif, size.Height() - dif).Under()); } - ImageAdp btn_img; - Composite box_grp; - Label box_btn; void Make_btn_no_border(Display display, Shell shell, Control owner) { box_grp = new Composite(shell, SWT.FLAT); box_btn = new Label(shell, SWT.FLAT); diff --git a/150_gfui/xtn/gplx/gfui/Swt_core_cmds.java b/150_gfui/xtn/gplx/gfui/Swt_core_cmds.java index f06092dd1..193e73f05 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_core_cmds.java +++ b/150_gfui/xtn/gplx/gfui/Swt_core_cmds.java @@ -26,10 +26,11 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; class Swt_core_cmds extends GxwCore_base { + Control control; private boolean compositeAble = false; public Swt_core_cmds(Control control) { - compositeAble = control instanceof Composite; + this.compositeAble = control instanceof Composite; this.control = control; - } Control control; boolean compositeAble = false; + } @Override public int Width() {return control.getSize().x;} @Override public void Width_set(int v) {if (Cfg_resize_disabled) return; control.setSize(v, this.Height());} @Override public int Height() {return control.getSize().y;} @Override public void Height_set(int v) {if (Cfg_resize_disabled) return; control.setSize(this.Width(), v);} @Override public int X() {return control.getLocation().x;} @Override public void X_set(int v) {control.setLocation(v, this.Y());} diff --git a/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java b/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java index b87367878..af424b931 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java +++ b/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java @@ -25,6 +25,8 @@ import gplx.GfoMsg_; import gplx.GfsCtx; import gplx.String_; import gplx.Tfds; + +import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseEvent; @@ -50,17 +52,24 @@ class Swt_lnr_resize implements Listener { } public Swt_lnr_resize(Swt_win win) {this.win = win;} Swt_win win; } +class Swt_lnr_traverse implements Listener { + @Override public void handleEvent(Event e) { + if (e.detail == SWT.TRAVERSE_ESCAPE) + e.doit = false; + } +} class Swt_lnr_key implements KeyListener { public Swt_lnr_key(GxwElem elem) {this.elem = elem;} GxwElem elem; // static int counter = 0; @Override public void keyPressed(KeyEvent ev) { - IptEvtDataKey data = XtoKeyData(ev); - if (!elem.Host().KeyDownCbk(data)) { + IptEvtDataKey ipt_data = XtoKeyData(ev); + if (!elem.Host().KeyDownCbk(ipt_data) || ipt_data.Handled()) ev.doit = false; - } } @Override public void keyReleased(KeyEvent ev) { - if (!elem.Host().KeyUpCbk(XtoKeyData(ev))) ev.doit = false; + IptEvtDataKey ipt_data = XtoKeyData(ev); + if (!elem.Host().KeyUpCbk(ipt_data) || ipt_data.Handled()) + ev.doit = false; } IptEvtDataKey XtoKeyData(KeyEvent ev) { int val = ev.keyCode; diff --git a/150_gfui/xtn/gplx/gfui/Swt_html.java b/150_gfui/xtn/gplx/gfui/Swt_html.java index dcc534cf4..05c0b4cd4 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_html.java +++ b/150_gfui/xtn/gplx/gfui/Swt_html.java @@ -17,9 +17,10 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.core.primitives.*; +import gplx.core.threads.Thread_adp_; + import java.security.acl.Owner; import gplx.*; -import gplx.threads.ThreadAdp_; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.*; import org.eclipse.swt.events.*; @@ -28,7 +29,6 @@ import org.eclipse.swt.widgets.*; import java.security.acl.Owner; import gplx.*; -import gplx.threads.ThreadAdp_; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.*; import org.eclipse.swt.events.*; @@ -99,7 +99,7 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { while (count < 5) { boolean rv = Eval_script_as_bool(kit.Html_cfg().Elem_img_update(elem_id, elem_src, elem_width, elem_height)); if (rv) return rv; - ThreadAdp_.Sleep(100); + Thread_adp_.Sleep(100); count++; } return false; diff --git a/150_gfui/xtn/gplx/gfui/Swt_lbl.java b/150_gfui/xtn/gplx/gfui/Swt_lbl.java new file mode 100644 index 000000000..2339ffff8 --- /dev/null +++ b/150_gfui/xtn/gplx/gfui/Swt_lbl.java @@ -0,0 +1,44 @@ +/* +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.gfui; import gplx.*; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; + +class Swt_lbl implements GxwElem, Swt_control { + private Label lbl; + public Swt_lbl(Swt_control owner, KeyValHash ctorArgs) { + lbl = new Label(owner.Under_composite(), SWT.CENTER); + core = new Swt_core_cmds(lbl); + lbl.addKeyListener(new Swt_lnr_key(this)); + lbl.addMouseListener(new Swt_lnr_mouse(this)); + } + @Override public Control Under_control() {return lbl;} + @Override public Control Under_menu_control() {return lbl;} + @Override public String TextVal() {return lbl.getText();} @Override public void TextVal_set(String v) { + lbl.setText(v); + } + @Override public GxwCore_base Core() {return core;} GxwCore_base core; + @Override public GxwCbkHost Host() {return host;} @Override public void Host_set(GxwCbkHost host) {this.host = host;} GxwCbkHost host; + @Override public Composite Under_composite() {return null;} + @Override public void EnableDoubleBuffering() {} + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return null;} +} diff --git a/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java b/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java index c8d305acd..37c03ba53 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java +++ b/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; -import gplx.threads.ThreadAdp_; +import gplx.core.threads.Thread_adp_; import org.eclipse.swt.*; import org.eclipse.swt.custom.*; diff --git a/150_gfui/xtn/gplx/gfui/Swt_win.java b/150_gfui/xtn/gplx/gfui/Swt_win.java index 719a76875..fd311870a 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_win.java +++ b/150_gfui/xtn/gplx/gfui/Swt_win.java @@ -20,6 +20,7 @@ package gplx.gfui; import java.io.FileInputStream; import java.io.FileNotFoundException; +import gplx.Bool_; import gplx.GfoInvkAbleCmd; import gplx.GfoMsg; import gplx.GfsCtx; @@ -32,24 +33,26 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; class Swt_win implements GxwWin, Swt_control { + private Swt_lnr_resize resize_lnr; private Swt_lnr_show show_lnr; // use ptr to dispose later + void ctor(boolean window_is_dialog, Shell shell, Display display) { + this.shell = shell; + this.display = display; + this.ctrl_mgr = new Swt_core_cmds(shell); + this.show_lnr = new Swt_lnr_show(this); + this.resize_lnr = new Swt_lnr_resize(this); + shell.addListener(SWT.Show, show_lnr); + shell.addListener(SWT.Resize, resize_lnr); + if (window_is_dialog) { + shell.addListener(SWT.Traverse, new Swt_lnr_traverse()); + } + } public Display UnderDisplay() {return display;} private Display display; public Shell UnderShell() {return shell;} private Shell shell; @Override public Control Under_control() {return shell;} @Override public Composite Under_composite() {return shell;} @Override public Control Under_menu_control() {return shell;} - public Swt_win(Shell owner) {ctor(new Shell(owner, SWT.RESIZE | SWT.DIALOG_TRIM), owner.getDisplay());} - public Swt_win(Display display) {ctor(new Shell(display), display); } - Swt_lnr_show showLnr; // use ptr to dispose later - void ctor(Shell shell, Display display) { - this.shell = shell; - this.display = display; - ctrlMgr = new Swt_core_cmds(shell); - showLnr = new Swt_lnr_show(this); - resizeLnr = new Swt_lnr_resize(this); - shell.addListener(SWT.Show, showLnr); - shell.addListener(SWT.Resize, resizeLnr); - } - Swt_lnr_resize resizeLnr; + public Swt_win(Shell owner) {ctor(Bool_.Y, new Shell(owner, SWT.RESIZE | SWT.DIALOG_TRIM), owner.getDisplay());} + public Swt_win(Display display) {ctor(Bool_.N, new Shell(display), display); } public void ShowWin() {shell.setVisible(true);} public void HideWin() {shell.setVisible(false);} public boolean Maximized() {return shell.getMaximized();} public void Maximized_(boolean v) {shell.setMaximized(v);} @@ -70,15 +73,12 @@ class Swt_win implements GxwWin, Swt_control { } catch (FileNotFoundException e1) {e1.printStackTrace();} shell.setImage(image); } - public void OpenedCmd_set(GfoInvkAbleCmd v) {whenLoadedCmd = v;} GfoInvkAbleCmd whenLoadedCmd = GfoInvkAbleCmd.Null; - public void Opened() {whenLoadedCmd.Invk();} - public GxwCore_base Core() {return ctrlMgr;} GxwCore_base ctrlMgr; - public GxwCbkHost Host() {return host;} public void Host_set(GxwCbkHost host) {this.host = host;} GxwCbkHost host = GxwCbkHost_.Null; - public String TextVal() { - return shell.getText();} - public void TextVal_set(String v) { - shell.setText(v); - } + public void OpenedCmd_set(GfoInvkAbleCmd v) {when_loaded_cmd = v;} private GfoInvkAbleCmd when_loaded_cmd = GfoInvkAbleCmd.Null; + public void Opened() {when_loaded_cmd.Invk();} + public GxwCore_base Core() {return ctrl_mgr;} private GxwCore_base ctrl_mgr; + public GxwCbkHost Host() {return host;} public void Host_set(GxwCbkHost host) {this.host = host;} private GxwCbkHost host = GxwCbkHost_.Null; + public String TextVal() {return shell.getText();} + public void TextVal_set(String v) {shell.setText(v);} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return this;} public void SendKeyDown(IptKey key) {} public void SendMouseMove(int x, int y) {} @@ -89,7 +89,7 @@ class Swt_win implements GxwWin, Swt_control { //public void windowDeactivated(WindowEvent e) {} //public void windowDeiconified(WindowEvent e) {host.SizeChangedCbk();} //public void windowIconified(WindowEvent e) {host.SizeChangedCbk();} - //public void windowOpened(WindowEvent e) {whenLoadedCmd.Invk();} + //public void windowOpened(WindowEvent e) {when_loaded_cmd.Invk();} //@Override public void processKeyEvent(KeyEvent e) {if (GxwCbkHost_.ExecKeyEvent(host, e)) super.processKeyEvent(e);} //@Override public void processMouseEvent(MouseEvent e) {if (GxwCbkHost_.ExecMouseEvent(host, e)) super.processMouseEvent(e);} //@Override public void processMouseWheelEvent(MouseWheelEvent e) {if (GxwCbkHost_.ExecMouseWheel(host, e)) super.processMouseWheelEvent(e);} @@ -102,7 +102,7 @@ class Swt_win implements GxwWin, Swt_control { public void TaskbarVisible_set(boolean val) {} public void TaskbarParkingWindowFix(GxwElem form) {} void ctor_GxwForm() { // this.setLayout(null); // use gfui layout - // this.ctrlMgr.BackColor_set(ColorAdp_.White); // default form backColor to white + // this.ctrl_mgr.BackColor_set(ColorAdp_.White); // default form backColor to white // this.setUndecorated(true); // remove icon, titleBar, minimize, maximize, close, border // this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // JAVA: cannot cancel alt+f4; set Close to noop, and manually control closing by calling this.CloseForm // enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); diff --git a/400_xowa/src/gplx/threads/Gfo_async_cmd_itm.java b/400_xowa/src/gplx/core/threads/Gfo_async_cmd_itm.java similarity index 94% rename from 400_xowa/src/gplx/threads/Gfo_async_cmd_itm.java rename to 400_xowa/src/gplx/core/threads/Gfo_async_cmd_itm.java index 55e115f3d..8363645e4 100644 --- a/400_xowa/src/gplx/threads/Gfo_async_cmd_itm.java +++ b/400_xowa/src/gplx/core/threads/Gfo_async_cmd_itm.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; public class Gfo_async_cmd_itm implements GfoInvkAble { private GfoInvkAble invk; private String invk_key; private GfoMsg msg = GfoMsg_.new_cast_(""); public Gfo_async_cmd_itm Init(GfoInvkAble invk, String invk_key, Object... args) { diff --git a/400_xowa/src/gplx/threads/Gfo_async_cmd_mkr.java b/400_xowa/src/gplx/core/threads/Gfo_async_cmd_mkr.java similarity index 94% rename from 400_xowa/src/gplx/threads/Gfo_async_cmd_mkr.java rename to 400_xowa/src/gplx/core/threads/Gfo_async_cmd_mkr.java index d7cb0548b..655ab5a46 100644 --- a/400_xowa/src/gplx/threads/Gfo_async_cmd_mkr.java +++ b/400_xowa/src/gplx/core/threads/Gfo_async_cmd_mkr.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; class Gfo_async_cmd_mkr { // private Gfo_async_cmd_itm[] free = Gfo_async_cmd_itm.Ary_empty, used = Gfo_async_cmd_itm.Ary_empty; // private int free_bgn = 0, free_end = 0, ary_len = 0; diff --git a/400_xowa/src/gplx/threads/Gfo_async_mgr.java b/400_xowa/src/gplx/core/threads/Gfo_async_mgr.java similarity index 90% rename from 400_xowa/src/gplx/threads/Gfo_async_mgr.java rename to 400_xowa/src/gplx/core/threads/Gfo_async_mgr.java index 0b30c4ad0..165d7d31c 100644 --- a/400_xowa/src/gplx/threads/Gfo_async_mgr.java +++ b/400_xowa/src/gplx/core/threads/Gfo_async_mgr.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; import gplx.core.primitives.*; public class Gfo_async_mgr implements GfoInvkAble { private ListAdp queue = ListAdp_.new_(); @@ -29,7 +29,7 @@ public class Gfo_async_mgr implements GfoInvkAble { synchronized (running) { if (running.Val_n()) { running.Val_y_(); - gplx.threads.ThreadAdp_.invk_(Invk_run, this, Invk_run).Start(); + gplx.core.threads.Thread_adp_.invk_(Invk_run, this, Invk_run).Start(); } } } diff --git a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd.java b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd.java similarity index 93% rename from 400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd.java rename to 400_xowa/src/gplx/core/threads/Gfo_thread_cmd.java index 3860e64d5..1c92e8abd 100644 --- a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; public interface Gfo_thread_cmd extends GfoInvkAble { void Cmd_ctor(); String Async_key(); diff --git a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_.java b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_.java similarity index 93% rename from 400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_.java rename to 400_xowa/src/gplx/core/threads/Gfo_thread_cmd_.java index ad5c3f978..18e22ec3d 100644 --- a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; public class Gfo_thread_cmd_ { public static final int Async_sleep_interval_1_second = 1000; public static final byte Init_ok = 0, Init_cancel_step = 1, Init_cancel_all = 2; diff --git a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_base.java b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_base.java similarity index 96% rename from 400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_base.java rename to 400_xowa/src/gplx/core/threads/Gfo_thread_cmd_base.java index ba4257afc..d5a6536b0 100644 --- a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_base.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_base.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; import gplx.gfui.*; public class Gfo_thread_cmd_base implements Gfo_thread_cmd { @gplx.Virtual public String Async_key() {return "undefined";} diff --git a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_download.java b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_download.java similarity index 94% rename from 400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_download.java rename to 400_xowa/src/gplx/core/threads/Gfo_thread_cmd_download.java index 5ae483ecb..c0dfc6846 100644 --- a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_download.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_download.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; import gplx.gfui.*; public class Gfo_thread_cmd_download implements Gfo_thread_cmd { public Gfo_thread_cmd Ctor(Gfo_usr_dlg usr_dlg, Gfui_kit kit) {this.usr_dlg = usr_dlg; this.kit = kit; xrg.Prog_dlg_(usr_dlg); return this;} @@ -50,7 +50,7 @@ public class Gfo_thread_cmd_download implements Gfo_thread_cmd { } public void Async_prog_run(int async_sleep_sum) {} public boolean Async_running() {return xrg.Prog_running();} - public void Async_run() {ThreadAdp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_bldr_download, this, Invk_async_bgn).Start();} + public void Async_run() {Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_bldr_download, this, Invk_async_bgn).Start();} private void Download() { download_pass = true; if (!xrg.Exec()) { diff --git a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_replace.java b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_replace.java similarity index 96% rename from 400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_replace.java rename to 400_xowa/src/gplx/core/threads/Gfo_thread_cmd_replace.java index 047792cff..201e020a4 100644 --- a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_replace.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_replace.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; import gplx.gfui.*; public class Gfo_thread_cmd_replace implements Gfo_thread_cmd { public Gfo_thread_cmd Init(Gfo_usr_dlg usr_dlg, Gfui_kit kit, Io_url fil) { diff --git a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_unzip.java b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_unzip.java similarity index 97% rename from 400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_unzip.java rename to 400_xowa/src/gplx/core/threads/Gfo_thread_cmd_unzip.java index b4edc34a9..73f9bd4c3 100644 --- a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_unzip.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_unzip.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; import gplx.gfui.*; import gplx.xowa.bldrs.cmds.utils.*; public class Gfo_thread_cmd_unzip implements Gfo_thread_cmd { public Gfo_thread_cmd_unzip Init(Gfo_usr_dlg usr_dlg, Gfui_kit kit, ProcessAdp bzip2_process, ProcessAdp zip_process, ProcessAdp gz_process, Io_url src, Io_url trg) { diff --git a/400_xowa/src/gplx/threads/Gfo_thread_pool.java b/400_xowa/src/gplx/core/threads/Gfo_thread_pool.java similarity index 92% rename from 400_xowa/src/gplx/threads/Gfo_thread_pool.java rename to 400_xowa/src/gplx/core/threads/Gfo_thread_pool.java index 14cec4694..dd20de9b6 100644 --- a/400_xowa/src/gplx/threads/Gfo_thread_pool.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_pool.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; public class Gfo_thread_pool implements GfoInvkAble { private Object thread_lock = new Object(); private ListAdp queue = ListAdp_.new_(); @@ -41,7 +41,7 @@ public class Gfo_thread_pool implements GfoInvkAble { running = true; wkr = (Gfo_thread_wkr)ListAdp_.Pop_first(queue); } - ThreadAdp_.Run_invk_msg(wkr.Name(), this, run_msg.Clear().Add("v", wkr)); + Thread_adp_.Run_invk_msg(wkr.Name(), this, run_msg.Clear().Add("v", wkr)); } private void Run_wkr(Gfo_thread_wkr wkr) { try {wkr.Exec();} diff --git a/400_xowa/src/gplx/threads/Gfo_thread_wkr.java b/400_xowa/src/gplx/core/threads/Gfo_thread_wkr.java similarity index 92% rename from 400_xowa/src/gplx/threads/Gfo_thread_wkr.java rename to 400_xowa/src/gplx/core/threads/Gfo_thread_wkr.java index a0d9bdac1..49e273c9a 100644 --- a/400_xowa/src/gplx/threads/Gfo_thread_wkr.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_wkr.java @@ -15,7 +15,7 @@ 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.threads; import gplx.*; +package gplx.core.threads; import gplx.*; import gplx.core.*; public interface Gfo_thread_wkr { String Name(); void Exec(); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v1.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v1.java index b7fed59ed..1774e3b00 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v1.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v1.java @@ -62,7 +62,6 @@ class Fsdb_db_mgr__v1_bldr { Fsdb_db_file db_abc = new_db(mnt_dir.GenSubFil(Fsdb_db_mgr__v1.Abc_name)); Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(db_abc.Conn(), "fsdb_cfg"); cfg_tbl.Create_tbl(); Fsm_mnt_mgr.Patch(cfg_tbl); - Fsm_mnt_mgr.Patch_core(cfg_tbl); Fsm_atr_tbl dba_tbl = new Fsm_atr_tbl(db_abc.Conn(), schema_is_1); dba_tbl.Create_tbl(); dba_tbl.Insert(mnt_id, mnt_name); Fsm_bin_tbl dbb_tbl = new Fsm_bin_tbl(db_abc.Conn(), schema_is_1, mnt_id); dbb_tbl.Create_tbl(); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java index 55665af29..4c1c5da1a 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java @@ -61,10 +61,8 @@ public class Fsdb_db_mgr__v2_bldr { Fsdb_db_file rv = new Fsdb_db_file(core_url, core_conn); Db_cfg_tbl cfg_tbl = rv.Tbl__cfg(); cfg_tbl.Create_tbl(); - cfg_tbl.Insert_int(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_next_id , 1); // start next_id at 1 - cfg_tbl.Insert_yn(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_schema_thm_page , Bool_.Y); // new dbs automatically have page and time in fsdb_xtn_tm - cfg_tbl.Insert_yn(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_patch_next_id , Bool_.Y); // new dbs automatically have correct next_id Fsm_mnt_mgr.Patch(cfg_tbl); + Fsm_mnt_mgr.Patch_core(cfg_tbl); Xof_orig_tbl orig_tbl = new Xof_orig_tbl(core_conn, schema_is_1); orig_tbl.Create_tbl(); if (mnt_id == Fsm_mnt_mgr.Mnt_idx_main) { Fsm_mnt_tbl mnt_tbl = new Fsm_mnt_tbl(core_conn, schema_is_1); mnt_tbl.Create_tbl(); diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java index 69e64e342..f2b847990 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java @@ -26,18 +26,21 @@ public class Fsm_cfg_mgr { Db_cfg_hash hash = Grps_get_or_load(Grp_core); this.next_id = hash.Get(Key_next_id).To_int_or(-1); if (next_id == -1) throw Err_.new_("next_id not found in cfg"); this.schema_thm_page = hash.Get(Key_schema_thm_page).To_yn_or_n(); - this.patch_next_id = hash.Get(Key_patch_next_id).To_yn_or_n(); + this.patch__next_id = hash.Get(Key_patch__next_id).To_yn_or_n(); + this.patch__page_gt_1 = hash.Get(Key_patch__page_gt_1).To_yn_or_n(); } public Db_cfg_tbl Tbl() {return tbl;} public int Next_id() {return next_id++;} private int next_id = 1; public void Next_id_commit() {tbl.Update_int("core", "next_id", next_id);} public boolean Schema_thm_page() {return schema_thm_page;} private boolean schema_thm_page = true; - public boolean Patch_next_id() {return patch_next_id;} private boolean patch_next_id = true; + public boolean Patch_next_id() {return patch__next_id;} private boolean patch__next_id = true; public void Patch_next_id_exec(int last_id) { if (last_id >= next_id) next_id = last_id + 1; - tbl.Insert_yn(Grp_core, Key_patch_next_id, Bool_.Y); + tbl.Insert_yn(Grp_core, Key_patch__next_id, Bool_.Y); } + public boolean Patch__page_gt_1() {return patch__page_gt_1;} private boolean patch__page_gt_1 = false; + public void Patch__save(String cfg_key) {tbl.Insert_yn(Fsm_cfg_mgr.Grp_core, cfg_key, Bool_.Y);} public Db_cfg_hash Grps_get_or_load(String grp_key) { Db_cfg_hash rv = (Db_cfg_hash)grp_hash.Fetch(grp_key); if (rv == null) { @@ -47,5 +50,5 @@ public class Fsm_cfg_mgr { return rv; } public static final String Grp_core = "core"; - public static final String Key_next_id = "next_id", Key_schema_thm_page = "schema.thm.page", Key_patch_next_id = "patch.next_id"; + public static final String Key_next_id = "next_id", Key_schema_thm_page = "schema.thm.page", Key_patch__next_id = "patch.next_id", Key_patch__page_gt_1 = "patch.page_gt_1"; } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java index 54d0d3387..fe4d33668 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java @@ -51,7 +51,7 @@ public class Fsm_mnt_mgr implements GfoInvkAble { public static void Patch_core(Db_cfg_tbl cfg_tbl) { cfg_tbl.Insert_int (Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_next_id , 1); // start next_id at 1 cfg_tbl.Insert_yn (Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_schema_thm_page , Bool_.Y); // new dbs automatically have page and time in fsdb_xtn_tm - cfg_tbl.Insert_yn (Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_patch_next_id , Bool_.Y); // new dbs automatically have correct next_id + cfg_tbl.Insert_yn (Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_patch__next_id , Bool_.Y); // new dbs automatically have correct next_id } public static final String Cfg_grp_core = "core", Cfg_key_mnt_insert_idx = "mnt.insert_idx"; // SERIALIZED } diff --git a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java index fadd92730..28eada9eb 100644 --- a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java +++ b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java @@ -93,7 +93,7 @@ public class Gfui_bnd_parser { private void Process_sym(boolean src_is_gfui, Gfui_bnd_tkn sym_tkn, int itm_bgn, int itm_end) { Hash_adp_bry regy = src_is_gfui ? gfui_regy : norm_regy; Gfui_bnd_tkn tkn = (Gfui_bnd_tkn)regy.Get_by_mid(src, itm_bgn, itm_end); - if (tkn == null) throw Err_.new_fmt_("unknown key: key={0}", String_.new_utf8_(src, itm_bgn, itm_end)); + if (tkn == null) return; int mod_adj = Mod_val_null; switch (tkn.Tid()) { case Gfui_bnd_tkn.Tid_mod_c: mod_adj = Gfui_bnd_tkn.Tid_mod_c; break; diff --git a/400_xowa/src/gplx/json/Json_doc.java b/400_xowa/src/gplx/json/Json_doc.java index f5e18d4be..3d4011735 100644 --- a/400_xowa/src/gplx/json/Json_doc.java +++ b/400_xowa/src/gplx/json/Json_doc.java @@ -19,7 +19,7 @@ package gplx.json; import gplx.*; public class Json_doc { public void Ctor(byte[] src, Json_itm_nde root) {this.src = src; this.root = root;} public Bry_bfr Bfr() {return bfr;} Bry_bfr bfr = Bry_bfr.new_(); - public NumberParser Utl_num_parser() {return utl_num_parser;} NumberParser utl_num_parser = new NumberParser(); + public Number_parser Utl_num_parser() {return utl_num_parser;} Number_parser utl_num_parser = new Number_parser(); public byte[] Str_utf8_bry() {return str_utf8_bry;} private byte[] str_utf8_bry = new byte[6]; public byte[] Src() {return src;} private byte[] src; public Json_itm_nde Root() {return root;} Json_itm_nde root; diff --git a/400_xowa/src/gplx/json/Json_itm_int.java b/400_xowa/src/gplx/json/Json_itm_int.java index 63f13b763..70db09d1c 100644 --- a/400_xowa/src/gplx/json/Json_itm_int.java +++ b/400_xowa/src/gplx/json/Json_itm_int.java @@ -21,7 +21,7 @@ public class Json_itm_int extends Json_itm_base { @Override public byte Tid() {return Json_itm_.Tid_int;} public int Data_as_int() { if (data_is_null) { - data = doc.Utl_num_parser().Parse(doc.Src(), Src_bgn(), Src_end()).AsInt(); + data = doc.Utl_num_parser().Parse(doc.Src(), Src_bgn(), Src_end()).Rv_as_int(); data_is_null = false; } return data; diff --git a/400_xowa/src/gplx/json/Json_parser.java b/400_xowa/src/gplx/json/Json_parser.java index 2084c1898..a0fa7e07e 100644 --- a/400_xowa/src/gplx/json/Json_parser.java +++ b/400_xowa/src/gplx/json/Json_parser.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.json; import gplx.*; public class Json_parser { public Json_factory Factory() {return factory;} private Json_factory factory = new Json_factory(); - private byte[] src; private int src_len, pos; private NumberParser num_parser = new NumberParser(); + private byte[] src; private int src_len, pos; private Number_parser num_parser = new Number_parser(); private static final byte[] Bry_bool_rue = Bry_.new_ascii_("rue"), Bry_bool_alse = Bry_.new_ascii_("alse"), Bry_null_ull = Bry_.new_ascii_("ull"); public Json_doc Parse(byte[] src) { Json_doc doc = new Json_doc(); @@ -127,7 +127,7 @@ public class Json_parser { } } num_parser.Parse(src, num_bgn, pos); - return num_parser.HasFrac() + return num_parser.Has_frac() ? factory.Decimal(doc, num_bgn, pos) : factory.Int(doc, num_bgn, pos); } diff --git a/400_xowa/src/gplx/xowa/Xoa_app.java b/400_xowa/src/gplx/xowa/Xoa_app.java index 349c5f50c..2c2fcd63f 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app.java +++ b/400_xowa/src/gplx/xowa/Xoa_app.java @@ -16,18 +16,22 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.apps.fsys.*; +import gplx.xowa.apps.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*; import gplx.xowa.urls.encoders.*; import gplx.xowa.wmfs.*; +import gplx.xowa.html.wtrs.*; public interface Xoa_app { + Xoa_app_type App_type(); Xoa_fsys_mgr Fsys_mgr(); - Xof_cache_mgr File_mgr__cache_mgr(); - Xof_img_mgr File_mgr__img_mgr(); + Xof_cache_mgr File__cache_mgr(); + Xof_img_mgr File__img_mgr(); Xowmf_mgr Wmf_mgr(); Gfo_usr_dlg Usr_dlg(); Bry_bfr_mkr Utl__bfr_mkr(); Url_encoder_mgr Utl__encoder_mgr(); Xoh_href_parser Html__href_parser(); + Xoh_lnki_bldr Html__lnki_bldr(); + Xoa_css_extractor Html__css_installer(); boolean Xwiki_mgr__missing(byte[] domain); } diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index cf6e4822b..76ebccca6 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -26,7 +26,7 @@ public class Xoa_app_ { boot_mgr.Run(args); } public static final String Name = "xowa"; - public static final String Version = "2.4.4.1"; + public static final String Version = "2.5.1.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys; public static String User_agent = ""; @@ -38,19 +38,12 @@ public class Xoa_app_ { rv.Log_wtr().Queue_enabled_(true); return rv; } - - public static byte Mode() {return mode;} public static void Mode_(byte v) {mode = v;} private static byte mode = Xoa_app_.Mode_console; - public static boolean Mode_is_gui() {return mode == Xoa_app_.Mode_gui;} public static Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public static void Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v;} private static Gfo_usr_dlg usr_dlg; public static Bry_bfr_mkr Utl__bfr_mkr() {return utl__bry_bfr_mkr;} private static final Bry_bfr_mkr utl__bry_bfr_mkr = new Bry_bfr_mkr(); public static Url_encoder_mgr Utl__encoder_mgr() {return utl__encoder_mgr;} private static final Url_encoder_mgr utl__encoder_mgr = new Url_encoder_mgr(); public static Io_stream_zip_mgr Utl__zip_mgr() {return utl__zip_mgr;} private static final Io_stream_zip_mgr utl__zip_mgr = new Io_stream_zip_mgr(); -// public static Xof_url_bldr Utl__url_bldr() {return utl__url_bldr;} private static final Xof_url_bldr utl__url_bldr = Xof_url_bldr.new_v2_(); - public static Xoa_gfs_mgr Gfs_mgr() {return gfs_mgr;} public static void Gfs_mgr_(Xoa_gfs_mgr v) {gfs_mgr = v;} private static Xoa_gfs_mgr gfs_mgr; - - public static final byte Mode_console = 0, Mode_gui = 1, Mode_http = 2; -} +} class Xoa_app_boot_mgr { private Gfo_usr_dlg usr_dlg; private Gfo_log_wtr log_wtr; private String chkpoint = "null"; public void Run(String[] args) { @@ -125,7 +118,7 @@ class Xoa_app_boot_mgr { return rv; } private void Run_app(App_cmd_mgr args_mgr) { - boolean app_mode_gui = false; + boolean app_type_is_gui = false; Xoae_app app = null; try { // init vars @@ -143,12 +136,13 @@ class Xoa_app_boot_mgr { Xoa_app_.Op_sys = args_mgr.Args_get("bin_dir_name").Val_as_str_or(Bin_dir_name()); Xoa_app_.User_agent = String_.Format("XOWA/{0} ({1}) [gnosygnu@gmail.com]", Xoa_app_.Version, Xoa_app_.Op_sys); String cmd_text = args_mgr.Args_get("cmd_text").Val_as_str_or(null); - app_mode_gui = String_.Eq(app_mode, "gui"); + Xoa_app_type app_type = Xoa_app_type.parse(app_mode); + app_type_is_gui = app_type.Uid_is_gui(); // init app Db_conn_bldr.I.Reg_default_sqlite(); - app = new Xoae_app(usr_dlg, root_dir, user_dir, Xoa_app_.Op_sys); usr_dlg.Log_wtr().Queue_enabled_(false); log_wtr.Log_msg_to_session_fmt("app.init"); - app.Fsys_mgr().Wiki_dir_(wiki_dir); + app = new Xoae_app(usr_dlg, app_type, root_dir, wiki_dir, root_dir.GenSubDir("file"), user_dir, root_dir.GenSubDir_nest("user", "anonymous", "wiki"), Xoa_app_.Op_sys); + usr_dlg.Log_wtr().Queue_enabled_(false); log_wtr.Log_msg_to_session_fmt("app.init"); try { app.Sys_cfg().Lang_(System_lang()); if (launch_url != null) @@ -166,26 +160,23 @@ class Xoa_app_boot_mgr { try {app.Gfs_mgr().Run_url(cmd_file); chkpoint = "run_url";} catch (Exception e) { usr_dlg.Warn_many("", "", "script file failed: ~{0} ~{1} ~{2}", chkpoint, cmd_file.Raw(), Err_.Message_gplx(e)); - if (app_mode_gui) + if (app_type_is_gui) GfuiEnv_.ShowMsg(Err_.Message_gplx(e)); } gplx.xowa.apps.setups.Xoa_setup_mgr.Delete_old_files(app); // launch app.Launch(); chkpoint = "launch"; - if (String_.Eq(app_mode, "server")) { - Xoa_app_.Mode_(Xoa_app_.Mode_http); + if (app_type.Uid_is_tcp()) app.Tcp_server().Run(); - } - else if (String_.Eq(app_mode, "http_server")) { - Xoa_app_.Mode_(Xoa_app_.Mode_http); + else if (app_type.Uid_is_http()) app.Http_server().Run(); - } else { - if (cmd_text != null) + if (cmd_text != null) { + gplx.xowa.servers.Gxw_html_server.Init_gui_for_server(app, null); // NOTE: must init kit else "app.shell.fetch_page" will fail; DATE:2015-04-30 ConsoleAdp._.WriteLine_utf8(Object_.Xto_str_strict_or_empty(app.Gfs_mgr().Run_str(cmd_text))); - if (app_mode_gui) { - Xoa_app_.Mode_(Xoa_app_.Mode_gui); + } + if (app_type_is_gui) { app.Gui_mgr().Run(); chkpoint = "run"; } else // teardown app, else lua will keep process running @@ -194,7 +185,7 @@ class Xoa_app_boot_mgr { } catch (Exception e) {usr_dlg.Warn_many("", "", "app launch failed: ~{0} ~{1}", chkpoint, Err_.Message_gplx(e));} finally { - if (app != null && app_mode_gui) // only cancel if app_mode_gui is true; (force cmd_line to end process) + if (app != null && app_type_is_gui) // only cancel if app_type_is_gui is true; (force cmd_line to end process) app.Setup_mgr().Cmd_mgr().Canceled_y_(); } } diff --git a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java index b0f3b6510..69277b5e6 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java @@ -26,7 +26,7 @@ public class Xoa_app_fxt { public static Xoae_app app_(String op_sys, Io_url root_dir) { Io_url user_dir = root_dir.GenSubDir_nest("user", "test_user"); Gfo_log_wtr_base._.Log_dir_(user_dir.GenSubDir_nest("tmp", "current")); - Xoae_app app = new Xoae_app(Gfo_usr_dlg_base.test_(), root_dir, user_dir, op_sys); + Xoae_app app = new Xoae_app(Gfo_usr_dlg_base.test_(), Xoa_app_type.Itm_cmd, root_dir, root_dir.GenSubDir("wiki"), root_dir.GenSubDir("file"), user_dir, root_dir.GenSubDir_nest("user", "anonymous", "wiki"), op_sys); app.Setup_mgr().Dump_mgr().Data_storage_format_(gplx.ios.Io_stream_.Tid_raw); // TEST: set data_storage_format to file, else bldr tests will fails (expects plain text) GfsCore._.Clear(); // NOTE: must clear GfsCore._.AddCmd(app, Xoae_app.Invk_app); // NOTE: must add app to GfsCore; app.Gfs_mgr() always adds current app to GfsCore; note this causes old test to leave behind GfsCore for new test diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index 6de4b587f..b334c641b 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_app.java @@ -16,20 +16,22 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.core.btries.*; import gplx.core.flds.*; import gplx.ios.*; import gplx.threads.*; +import gplx.core.btries.*; import gplx.core.flds.*; import gplx.ios.*; import gplx.core.threads.*; import gplx.xowa.apps.*; import gplx.xowa.apps.caches.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.apis.*; import gplx.xowa.urls.encoders.*; import gplx.xowa.apps.progs.*; import gplx.xowa.langs.*; import gplx.xowa.specials.*; import gplx.xowa.cfgs2.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*; import gplx.xowa.wikis.*; import gplx.xowa.users.*; import gplx.xowa.gui.*; import gplx.xowa.cfgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.html.tocs.*; import gplx.xowa.fmtrs.*; import gplx.xowa.html.*; +import gplx.xowa.html.wtrs.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.math.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.servers.tcp.*; import gplx.xowa.servers.http.*; import gplx.xowa.wmfs.*; public class Xoae_app implements Xoa_app, GfoInvkAble { - public Xoae_app(Gfo_usr_dlg usr_dlg, Io_url root_dir, Io_url user_dir, String bin_dir_name) { - Xoa_app_.Usr_dlg_(usr_dlg); + public Xoae_app(Gfo_usr_dlg usr_dlg, Xoa_app_type app_type, Io_url root_dir, Io_url wiki_dir, Io_url file_dir, Io_url user_dir, Io_url css_dir, String bin_dir_name) { + Xoa_app_.Usr_dlg_(usr_dlg); + this.app_type = app_type; Io_url.Http_file_str_encoder = Xoa_app_.Utl__encoder_mgr().Fsys(); - fsys_mgr = new Xoa_fsys_mgr(bin_dir_name, root_dir); + fsys_mgr = new Xoa_fsys_mgr(bin_dir_name, root_dir, wiki_dir, file_dir, css_dir); log_wtr = usr_dlg.Log_wtr(); cfg_mgr = new Xoa_cfg_mgr(this); api_root = new Xoapi_root(this); @@ -58,19 +60,19 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { http_server = new Http_server_mgr(this); cfg_regy = new Xocfg_regy(this); html_mgr = new Xoh_html_mgr(this); -// queue_file = new Xop_queue_mgr(this); + this.html__lnki_bldr = new Xoh_lnki_bldr(this, href_parser); } - public byte Mode() {return Xoa_app_.Mode();} + public Xoa_app_type App_type() {return app_type;} private final Xoa_app_type app_type; public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xoa_fsys_mgr fsys_mgr; - public Xof_cache_mgr File_mgr__cache_mgr() {return file_mgr.Cache_mgr();} - public Xof_img_mgr File_mgr__img_mgr() {return file_mgr.Img_mgr();} + public Xof_cache_mgr File__cache_mgr() {return file_mgr.Cache_mgr();} + public Xof_img_mgr File__img_mgr() {return file_mgr.Img_mgr();} public Xoh_href_parser Html__href_parser() {return href_parser;} private Xoh_href_parser href_parser; + public Xoh_lnki_bldr Html__lnki_bldr() {return html__lnki_bldr;} private final Xoh_lnki_bldr html__lnki_bldr; + public Xoa_css_extractor Html__css_installer() {return html__css_installer;} private final Xoa_css_extractor html__css_installer = new Xoa_css_extractor(); public Xowmf_mgr Wmf_mgr() {return wmf_mgr;} private final Xowmf_mgr wmf_mgr = new Xowmf_mgr(); public Bry_bfr_mkr Utl__bfr_mkr() {return Xoa_app_.Utl__bfr_mkr();} public Url_encoder_mgr Utl__encoder_mgr() {return Xoa_app_.Utl__encoder_mgr();} - - public Xoa_css_extractor Css_installer() {return css_installer;} private final Xoa_css_extractor css_installer = new Xoa_css_extractor(); public Xoa_wiki_mgr Wiki_mgr() {return wiki_mgr;} private Xoa_wiki_mgr wiki_mgr; public Xou_user_mgr User_mgr() {return user_mgr;} private Xou_user_mgr user_mgr; public Xof_file_mgr File_mgr() {return file_mgr;} private Xof_file_mgr file_mgr = new Xof_file_mgr(); @@ -124,7 +126,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { public Xop_amp_mgr Parser_amp_mgr() {return parser_amp_mgr;} private Xop_amp_mgr parser_amp_mgr = new Xop_amp_mgr(); private Xoa_fmtr_mgr fmtr_mgr; - public NumberParser Utl_num_parser() {return utl_num_parser;} private NumberParser utl_num_parser = new NumberParser(); + public Number_parser Utl_num_parser() {return utl_num_parser;} private Number_parser utl_num_parser = new Number_parser(); public void Init_by_app() { stage = Xoa_stage_.Tid_init; prog_mgr.Init_by_app(url_cmd_eval); @@ -133,7 +135,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { gui_mgr.Init_by_app(); user.Init_by_app(this); file_mgr.Init_by_app(this); - css_installer.Init_by_app(this); + html__css_installer.Init_by_app(this); wiki_mgr.Init_by_app(); gplx.xowa.utls.upgrades.Xoa_upgrade_mgr.Check(this); ctg_mgr.Init_by_app(this); diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_app_type.java b/400_xowa/src/gplx/xowa/apps/Xoa_app_type.java new file mode 100644 index 000000000..60e767f5e --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/Xoa_app_type.java @@ -0,0 +1,35 @@ +/* +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.apps; import gplx.*; import gplx.xowa.*; +public class Xoa_app_type { + Xoa_app_type(int uid) {this.uid = uid;} + public int Uid() {return uid;} private final int uid; + public boolean Uid_is_gui() {return uid == Uid_gui;} + public boolean Uid_is_tcp() {return uid == Uid_tcp;} + public boolean Uid_is_http() {return uid == Uid_http;} + private static final int Uid_cmd = 1, Uid_gui = 2, Uid_tcp = 3, Uid_http = 4; + private static final String Key_cmd = "cmd", Key_gui = "gui", Key_tcp = "server", Key_http = "http_server"; + public static final Xoa_app_type Itm_cmd = new Xoa_app_type(Uid_cmd), Itm_gui = new Xoa_app_type(Uid_gui), Itm_tcp = new Xoa_app_type(Uid_tcp), Itm_http = new Xoa_app_type(Uid_http); + public static Xoa_app_type parse(String s) { + if (String_.Eq(s, Key_cmd)) return Itm_cmd; + else if (String_.Eq(s, Key_gui)) return Itm_gui; + else if (String_.Eq(s, Key_tcp)) return Itm_tcp; + else if (String_.Eq(s, Key_http)) return Itm_http; + else return Itm_cmd; // default to cmd as per early behaviour; handles mistaken "--app_mode wrong" + } +} diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_thread_mgr.java b/400_xowa/src/gplx/xowa/apps/Xoa_thread_mgr.java index 025cd6f10..967829905 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoa_thread_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/Xoa_thread_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.apps; import gplx.*; import gplx.xowa.*; -import gplx.threads.*; +import gplx.core.threads.*; public class Xoa_thread_mgr { public Gfo_thread_pool Page_load_mgr() {return page_load_mgr;} private Gfo_thread_pool page_load_mgr = new Gfo_thread_pool(); public Gfo_thread_pool File_load_mgr() {return file_load_mgr;} private Gfo_thread_pool file_load_mgr = new Gfo_thread_pool(); diff --git a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java index b46f366bc..18b0e258a 100644 --- a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java @@ -17,35 +17,32 @@ along with this program. If not, see . */ package gplx.xowa.apps.fsys; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; public class Xoa_fsys_mgr implements GfoInvkAble { - public Xoa_fsys_mgr(String plat_name, Io_url root_dir) { - Init_by_boot(plat_name, root_dir); + public Xoa_fsys_mgr(String plat_name, Io_url root_dir, Io_url wiki_dir, Io_url file_dir, Io_url css_dir) { + this.root_dir = root_dir; + this.wiki_dir = wiki_dir; + this.file_dir = file_dir; + this.css_dir = css_dir; + this.bin_plat_dir = root_dir.GenSubDir("bin").GenSubDir(plat_name); + this.bin_any_dir = root_dir.GenSubDir("bin").GenSubDir("any"); + this.bin_xowa_dir = bin_any_dir.GenSubDir("xowa"); + this.bin_xtns_dir = bin_any_dir.GenSubDir_nest("xowa", "xtns"); + this.cfg_lang_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "lang", "core"); + this.cfg_wiki_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "wiki", "core"); } - public Io_url Root_dir() {return root_dir;} private Io_url root_dir; - public byte[] Root_dir_bry() {return root_dir_bry;} private byte[] root_dir_bry; - public Io_url File_dir() {return file_dir;} private Io_url file_dir; - public Io_url Wiki_dir() {return wiki_dir;} public void Wiki_dir_(Io_url v) {wiki_dir = v;} private Io_url wiki_dir; - public Io_url Bin_plat_dir() {return bin_plat_dir;} private Io_url bin_plat_dir; - public Io_url Bin_any_dir() {return bin_any_dir;} private Io_url bin_any_dir; - public Io_url Bin_xowa_dir() {return bin_xowa_dir;} private Io_url bin_xowa_dir; - public Io_url Bin_xtns_dir() {return bin_xtns_dir;} private Io_url bin_xtns_dir; - public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private Io_url cfg_lang_core_dir; - public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private Io_url cfg_wiki_core_dir; - public Io_url Bin_data_os_cfg_fil() {return bin_plat_dir.GenSubFil_nest("xowa", "cfg", Xoa_gfs_mgr.Cfg_os);} - private void Init_by_boot(String plat_name, Io_url root_dir) { - this.root_dir = root_dir; - root_dir_bry = root_dir.To_http_file_bry(); - file_dir = root_dir.GenSubDir("file"); - bin_plat_dir = root_dir.GenSubDir("bin").GenSubDir(plat_name); - bin_any_dir = root_dir.GenSubDir("bin").GenSubDir("any"); - bin_xowa_dir = bin_any_dir.GenSubDir("xowa"); - bin_xtns_dir = bin_any_dir.GenSubDir_nest("xowa", "xtns"); - cfg_lang_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "lang", "core"); - cfg_wiki_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "wiki", "core"); - Wiki_dir_ (root_dir.GenSubDir("wiki")); - } - public void Init_by_app(GfoInvkAble app_mgr_invk) {// for gfs and app.launcher - this.app_mgr_invk = app_mgr_invk; - } private GfoInvkAble app_mgr_invk; + public Io_url Root_dir() {return root_dir;} private final Io_url root_dir; + public Io_url Wiki_dir() {return wiki_dir;} private final Io_url wiki_dir; + public Io_url File_dir() {return file_dir;} private final Io_url file_dir; + public Io_url Css_dir() {return css_dir;} private final Io_url css_dir; + public Io_url Bin_plat_dir() {return bin_plat_dir;} private final Io_url bin_plat_dir; + public Io_url Bin_any_dir() {return bin_any_dir;} private final Io_url bin_any_dir; + public Io_url Bin_xowa_dir() {return bin_xowa_dir;} private final Io_url bin_xowa_dir; + public Io_url Bin_xtns_dir() {return bin_xtns_dir;} private final Io_url bin_xtns_dir; + public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private final Io_url cfg_lang_core_dir; + public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private final Io_url cfg_wiki_core_dir; + public Io_url Bin_data_os_cfg_fil() {return bin_plat_dir.GenSubFil_nest("xowa", "cfg", Xoa_gfs_mgr.Cfg_os);} + public Io_url Wiki_css_dir(String wiki) {return css_dir.GenSubDir_nest(wiki, "html");} // EX: /xowa/temp/simple.wikipedia.org/html/xowa_common.css + public Io_url Wiki_file_dir(String wiki) {return file_dir.GenSubDir_nest(wiki);} // EX: /xowa/temp/simple.wikipedia.org/orig/ + public void Init_by_app(GfoInvkAble app_mgr_invk) {this.app_mgr_invk = app_mgr_invk;} private GfoInvkAble app_mgr_invk; // for gfs and app.launcher public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_apps)) return app_mgr_invk; else if (ctx.Match(k, Invk_root_dir)) return root_dir; diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java b/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java index 9fa2e6f83..c043a7402 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java @@ -31,6 +31,7 @@ public class Xob_db_file { public static Xob_db_file new__wiki_image(Io_url dir) {return new_(dir, Name__wiki_image);} public static Xob_db_file new__wiki_redirect(Io_url dir) {return new_(dir, Name__wiki_redirect);} public static Xob_db_file new__temp_log(Io_url dir) {return new_(dir, Name__temp_log);} + public static Xob_db_file new__redlink(Io_url dir) {return new_(dir, Name__redlink);} public static Xob_db_file new_(Io_url dir, String name) { Io_url url = dir.GenSubFil(name); Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(url); @@ -43,6 +44,6 @@ public class Xob_db_file { public static final String Name__wiki_image = "xowa.wiki.image.sqlite3", Name__wiki_redirect = "xowa.wiki.redirect.sqlite3" , Name__file_make = "xowa.file.make.sqlite3", Name__temp_log = "xowa.temp.log.sqlite3" - , Name__page_regy = "xowa.file.page_regy.sqlite3" + , Name__page_regy = "xowa.file.page_regy.sqlite3", Name__redlink = "xowa.temp.redlink.sqlite3" ; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java index 489eb56b9..257e1aac2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java @@ -41,7 +41,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo root = ctx.Tkn_mkr().Root(Bry_.Empty); wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql wiki.Db_mgr_as_sql().Core_data_mgr().Init_by_load(gplx.xowa.wikis.Xow_fsys_mgr.Find_core_fil(wiki)); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable conn which is closed) - wiki.File_mgr__orig_mgr().Wkrs_del(Xof_orig_wkr_.Tid_wmf_api); + wiki.File__orig_mgr().Wkrs_del(Xof_orig_wkr_.Tid_wmf_api); db_fsys_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); db_ary = Xob_dump_mgr_base_.Init_text_files_ary(db_fsys_mgr); poll_interval = poll_mgr.Poll_interval(); @@ -247,8 +247,12 @@ class Xob_dump_mgr_base_ { if (len == 1) return new Xowd_db_file[] {core_data_mgr.Dbs__get_at(0)}; // single file: return core; note that there are no Tid = Text for (int i = 0; i < len; i++) { Xowd_db_file file = core_data_mgr.Dbs__get_at(i); - if (file.Tid() == Xowd_db_file_.Tid_text) - text_files_list.Add(file); + switch (file.Tid()) { + case Xowd_db_file_.Tid_text: + case Xowd_db_file_.Tid_text_solo: + text_files_list.Add(file); + break; + } } return (Xowd_db_file[])text_files_list.Xto_ary_and_clear(Xowd_db_file.class); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java index fc9e3f524..a6fd97882 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java @@ -25,7 +25,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { private Xof_bin_mgr src_bin_mgr; private Xof_bin_wkr__fsdb_sql src_fsdb_wkr; private boolean src_bin_mgr__cache_enabled = Bool_.N; private String src_bin_mgr__fsdb_version; private String[] src_bin_mgr__fsdb_skip_wkrs; private boolean src_bin_mgr__wmf_enabled; private Fsm_mnt_itm trg_mnt_itm; private Fsm_cfg_mgr trg_cfg_mgr; private Fsm_atr_fil trg_atr_fil; private Fsm_bin_fil trg_bin_fil; private long trg_bin_db_max; private final Xof_bin_updater trg_bin_updater = new Xof_bin_updater(); private Xob_tier_namer tier_namer; private int[] ns_ids; private int prv_lnki_tier_id = -1; - private long download_size_max = Io_mgr.Len_mb_long; private int[] download_keep_tier_ids = Int_.Ary(0); + private long download_size_max = Io_mgr.Len_mb_long * 5; private int[] download_keep_tier_ids = Int_.Ary(0); private Xobu_poll_mgr poll_mgr; private int poll_interval; private long time_bgn; private int select_interval = 2500, progress_interval = 1, commit_interval = 1, delete_interval = 5000; private boolean exec_done, resume_enabled; private int exec_count, exec_count_max = Int_.MaxValue, exec_fail, exec_fail_max = 10000; // 115 errors over 900k images @@ -34,8 +34,8 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { public Xob_fsdb_make_cmd(Xob_bldr bldr, Xowe_wiki wiki) { this.Cmd_ctor(bldr, wiki); this.poll_mgr = new Xobu_poll_mgr(bldr.App()); - wiki.File_mgr__fsdb_mode().Tid_make_y_(); - this.src_bin_mgr = new Xof_bin_mgr(new Fsm_mnt_mgr(), wiki.File_mgr__repo_mgr(), app.File_mgr__cache_mgr(), app.File_mgr__img_mgr().Wkr_resize_img()); + wiki.File__fsdb_mode().Tid_make_y_(); + this.src_bin_mgr = new Xof_bin_mgr(new Fsm_mnt_mgr(), wiki.File__repo_mgr(), app.File__cache_mgr(), app.File__img_mgr().Wkr_resize_img()); } public String Cmd_key() {return Xob_cmd_keys.Key_file_fsdb_make;} public void Cmd_bgn(Xob_bldr bldr) { @@ -44,12 +44,12 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { this.tier_namer = new Xob_tier_namer(wiki.Domain_str(), ns_ids); // src_bin_mgr if (src_bin_mgr__fsdb_version != null) { - this.src_fsdb_wkr = Xof_bin_wkr__fsdb_sql.new_(wiki.File_mgr__mnt_mgr()); + this.src_fsdb_wkr = Xof_bin_wkr__fsdb_sql.new_(wiki.File__mnt_mgr()); src_bin_mgr.Wkrs__add(src_fsdb_wkr); src_fsdb_wkr.Mnt_mgr().Ctor_by_load(new_src_bin_db_mgr(wiki, src_bin_mgr__fsdb_version)); src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Txn_bgn(); // NOTE: txn on atr speeds up from 50 -> 300; DATE:2015-03-21 if (src_bin_mgr__fsdb_skip_wkrs != null) { - src_fsdb_wkr.Skip_mgr_init(src_bin_mgr__fsdb_skip_wkrs); + src_fsdb_wkr.Skip_mgr_init(src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Cfg_mgr(), src_bin_mgr__fsdb_skip_wkrs); } if (src_bin_mgr__cache_enabled) { usr_dlg.Prog_many("", "", "src_bin_mgr.cache.bgn"); @@ -255,6 +255,9 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { bldr_cfg_tbl.Conn().Txn_sav(); trg_cfg_mgr.Next_id_commit(); trg_atr_fil.Conn().Txn_sav(); + if (src_bin_mgr__fsdb_version != null && src_bin_mgr__fsdb_skip_wkrs != null) { + src_fsdb_wkr.Skip_mgr().Skip_term(src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Cfg_mgr()); + } if (!trg_mnt_itm.Db_mgr().File__solo_file()) trg_bin_fil.Conn().Txn_sav(); if (exit_after_commit) exit_now = true; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java index 74a2599db..311d398cc 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java @@ -47,8 +47,8 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink @Override protected void Cmd_bgn_end() { ns_file_is_case_match_all = Ns_file_is_case_match_all(wiki); // NOTE: must call after wiki.init wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read).Ctgs_enabled_(false); // disable categories else progress messages written (also for PERF) - if (wiki.File_mgr__bin_mgr() != null) - wiki.File_mgr__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // remove wmf wkr, else will try to download images during parsing + if (wiki.File__bin_mgr() != null) + wiki.File__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // remove wmf wkr, else will try to download images during parsing commons_wiki = app.Wiki_mgr().Get_by_key_or_make(Xow_domain_.Domain_bry_commons); Xop_log_mgr log_mgr = ctx.App().Log_mgr(); log_mgr.Log_dir_(wiki.Fsys_mgr().Root_dir()); // put log in wiki dir, instead of user.temp @@ -64,13 +64,13 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink gplx.xowa.xtns.scores.Score_xnde.Log_wkr = log_mgr.Make_wkr(); gplx.xowa.xtns.hieros.Hiero_xnde.Log_wkr = log_mgr.Make_wkr(); Xof_fsdb_mgr__sql trg_fsdb_mgr = new Xof_fsdb_mgr__sql(); - wiki.File_mgr__fsdb_mode().Tid_make_y_(); + wiki.File__fsdb_mode().Tid_make_y_(); Fsdb_db_mgr__v2 fsdb_core = Fsdb_db_mgr__v2_bldr.I.Make(wiki, Bool_.Y); trg_fsdb_mgr.Init_by_wiki(wiki); Fsm_mnt_mgr trg_mnt_mgr = trg_fsdb_mgr.Mnt_mgr(); wiki.File_mgr().Init_file_mgr_by_load(wiki); // must happen after fsdb.make - wiki.File_mgr__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // must happen after init_file_mgr_by_load; remove wmf wkr, else will try to download images during parsing - wiki.File_mgr__orig_mgr().Wkrs_del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api); + wiki.File__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // must happen after init_file_mgr_by_load; remove wmf wkr, else will try to download images during parsing + wiki.File__orig_mgr().Wkrs_del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api); trg_mnt_mgr = new Fsm_mnt_mgr(); trg_mnt_mgr.Ctor_by_load(fsdb_core); trg_mnt_mgr.Mnts__get_insert_idx_(Fsm_mnt_mgr.Mnt_idx_main); Fsm_mnt_mgr.Patch(trg_mnt_mgr.Mnts__get_main().Cfg_mgr().Tbl()); // NOTE: see fsdb_make; DATE:2014-04-26 diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java index 356303f56..050072e54 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java @@ -33,14 +33,15 @@ public class Xob_xfer_regy_update_cmd extends Xob_itm_basic_base implements Xob_ private void Copy_atrs_to_make_db(Db_conn make_db_provider) { wiki.File_mgr().Init_file_mgr_by_load(wiki); Fsm_mnt_itm fsdb_abc_mgr = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Mnts__get_main(); // 0 = fsdb.main - Db_conn conn = fsdb_abc_mgr.Atr_mgr().Db__core().Conn(); // 0 = fsdb.atr.00 + Db_conn conn = fsdb_abc_mgr.Atr_mgr().Db__core().Conn(); // 0 = fsdb.atr.00 Io_url fsdb_atr_url = ((gplx.dbs.engines.sqlite.Sqlite_conn_info)conn.Conn_info()).Url(); Sqlite_engine_.Tbl_create_and_delete(make_db_provider, Xob_fsdb_regy_tbl.Tbl_name, Xob_fsdb_regy_tbl.Tbl_sql); Sqlite_engine_.Db_attach(make_db_provider, "fsdb_db", fsdb_atr_url.Raw()); make_db_provider.Txn_bgn(); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Insert_fsdb_fil); + String fsdb_thm_tbl = "fsdb_thm"; String insert_sql_fsdb_thm = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Mnts__get_main().Cfg_mgr().Schema_thm_page() // Cfg_get(Fsm_cfg_mgr.Grp_core).Get_yn_or_n(Fsm_cfg_mgr.Key_schema_thm_page) - ? Xob_fsdb_regy_tbl.Insert_fsdb_thm + ? String_.Format(Xob_fsdb_regy_tbl.Insert_fsdb_thm, fsdb_thm_tbl) : Xob_fsdb_regy_tbl.Insert_fsdb_thm_v0 ; make_db_provider.Exec_sql(insert_sql_fsdb_thm); @@ -110,7 +111,7 @@ class Xob_fsdb_regy_tbl { , ", f.fil_id" , ", t.thm_id" , "FROM fsdb_db.fsdb_fil f" - , " JOIN fsdb_db.fsdb_xtn_thm t ON f.fil_id = t.thm_owner_id" + , " JOIN fsdb_db.{0} t ON f.fil_id = t.thm_owner_id" , " JOIN fsdb_db.fsdb_dir d ON f.fil_owner_id = d.dir_id" , ";" ) @@ -128,18 +129,18 @@ class Xob_fsdb_regy_tbl { , ", f.fil_id" , ", t.thm_id" , "FROM fsdb_db.fsdb_fil f" - , " JOIN fsdb_db.fsdb_xtn_thm t ON f.fil_id = t.thm_owner_id" + , " JOIN fsdb_db.{0} t ON f.fil_id = t.thm_owner_id" , " JOIN fsdb_db.fsdb_dir d ON f.fil_owner_id = d.dir_id" , ";" ) , Update_regy_fil = String_.Concat_lines_nl ( "REPLACE INTO xfer_regy " - , "( lnki_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" + , "( lnki_id, lnki_tier_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" , ", file_is_orig, orig_w, orig_h, file_w, file_h, lnki_time, lnki_page, lnki_count" , ", xfer_status" , ")" , "SELECT " - , " lnki_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" + , " lnki_id, lnki_tier_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" , ", file_is_orig, orig_w, orig_h, file_w, file_h, lnki_time, lnki_page, lnki_count" , ", CASE WHEN f.fsdb_name IS NOT NULL THEN 1 ELSE 0 END" , "FROM xfer_regy x" @@ -150,12 +151,12 @@ class Xob_fsdb_regy_tbl { ) , Update_regy_thm = String_.Concat_lines_nl ( "REPLACE INTO xfer_regy " - , "( lnki_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" + , "( lnki_id, lnki_tier_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" , ", file_is_orig, orig_w, orig_h, file_w, file_h, lnki_time, lnki_page, lnki_count" , ", xfer_status" , ")" , "SELECT " - , " lnki_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" + , " lnki_id, lnki_tier_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" , ", file_is_orig, orig_w, orig_h, file_w, file_h, lnki_time, lnki_page, lnki_count" , ", CASE WHEN f.fsdb_name IS NOT NULL THEN 1 ELSE 0 END" , "FROM xfer_regy x" diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_init_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_init_base.java index 3883168db..b0df293bf 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_init_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_init_base.java @@ -41,7 +41,7 @@ public abstract class Xob_init_base implements Xob_cmd, GfoInvkAble { public void Cmd_end() { wiki.Appe().Gui_mgr().Html_mgr().Portal_mgr().Wikis().Itms_reset(); // dirty wiki list so that next refresh will load itm if (wiki.Appe().Setup_mgr().Dump_mgr().Css_wiki_update()) { - Io_url url = wiki.Appe().User().Fsys_mgr().Wiki_html_dir(wiki.Domain_str()).GenSubFil(Xoa_css_extractor.Css_wiki_name); + Io_url url = wiki.Appe().Fsys_mgr().Wiki_css_dir(wiki.Domain_str()).GenSubFil(Xoa_css_extractor.Css_wiki_name); usr_dlg.Log_many("", "", "deleting css: ~{0}", url.Raw()); Io_mgr._.DeleteFil_args(url).MissingFails_off().Exec(); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java index d50c0c9f1..f17495dfd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java @@ -20,6 +20,7 @@ import gplx.core.primitives.*; import gplx.ios.*; import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { + private final OrderedHash list = OrderedHash_.new_(); private Xol_lang lang; public abstract String Wkr_key(); public abstract Io_make_cmd Make_cmd_site(); public void Wkr_ini(Xob_bldr bldr) {} @@ -35,7 +36,7 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ // if (page.Ns_id() != Xow_ns_.Id_main) return; // limit to main ns for now try { byte[] ttl = page.Ttl_page_db(); - byte[][] words = Split(lang, list, dump_bfr, ttl); + byte[][] words = Split_ttl_into_words(lang, list, dump_bfr, ttl); Xob_tmp_wtr wtr = tmp_wtr_mgr.Get_or_new(ns_main == null ? page.Ns() : ns_main); int words_len = words.length; int row_len = 0; @@ -60,9 +61,8 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ if (delete_temp) Io_mgr._.DeleteDirDeep(temp_dir); } public void Wkr_print() {} - OrderedHash list = OrderedHash_.new_(); Xol_lang lang; - static final int row_fixed_len = 5 + 1 + 1 + 1; // 5=rowId; 1=|; 1=NmsOrd; 1=| - public static byte[][] Split(Xol_lang lang, OrderedHash list, Bry_bfr bfr, byte[] ttl) { + // private static final int row_fixed_len = 5 + 1 + 1 + 1; // 5=rowId; 1=|; 1=NmsOrd; 1=| + public static byte[][] Split_ttl_into_words(Xol_lang lang, OrderedHash list, Bry_bfr bfr, byte[] ttl) { if (lang != null) // null lang passed in by searcher ttl = lang.Case_mgr().Case_build_lower(ttl); int ttl_len = ttl.length; Bry_obj_ref word_ref = Bry_obj_ref.new_(Bry_.Empty); @@ -70,17 +70,19 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ while (true) { if (word_done || i == ttl_len) { if (bfr.Len() > 0) { - byte[] word = bfr.Xto_bry(); + byte[] word = bfr.Xto_bry_and_clear(); word_ref.Val_(word); - if (!list.Has(word_ref)) list.Add(word_ref, word); - bfr.ClearAndReset(); + if (!list.Has(word_ref)) list.Add(word_ref, word); // don't add same word twice; EX: Title of "Can Can" should only have "Can" in index } if (i == ttl_len) break; word_done = false; } byte b = ttl[i]; switch (b) { - case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: case Byte_ascii.Space: case Byte_ascii.Underline: + case Byte_ascii.Underline: // underline is word-breaking; EX: A_B -> A, B + case Byte_ascii.Space: // should not occur, but just in case (only underscores) + case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: // should not occur in titles, but just in case + case Byte_ascii.Dash: // treat hypenated words separately case Byte_ascii.Dot: // treat abbreviations as separate words; EX: A.B.C. case Byte_ascii.Bang: case Byte_ascii.Hash: case Byte_ascii.Dollar: case Byte_ascii.Percent: @@ -100,7 +102,6 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ break; } } - bfr.ClearAndReset(); byte[][] rv = (byte[][])list.Xto_ary(byte[].class); list.Clear(); list.ResizeBounds(16); return rv; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_word_parser.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_word_parser.java new file mode 100644 index 000000000..2bc11001d --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_word_parser.java @@ -0,0 +1,118 @@ +/* +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.bldrs.cmds.texts; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.core.btries.*; import gplx.xowa.langs.cases.*; +class Xob_word_parser { + private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs_(); + private final Bry_bfr bfr = Bry_bfr.new_(32); + private Xob_word_mgr word_mgr; private Xol_case_mgr case_mgr; + private byte[] src; // private int bgn, end, src_len; + private boolean dirty; private int word_bgn; + public void Init_for_ttl(Xob_word_mgr word_mgr, Xol_case_mgr case_mgr) { + this.word_mgr = word_mgr; this.case_mgr = case_mgr; + trie.Clear(); + Init_tkn(Xob_word_tkn.new_(" ").Split_y_()); + Init_tkn(Xob_word_tkn.new_("_").Split_y_()); + Init_tkn(Xob_word_tkn.new_("..").Split_y_().Extend_y_()); + } + private void Init_tkn(Xob_word_tkn tkn) {trie.Add_obj(tkn.Key(), tkn);} + private void Mgr__add(int word_end) { + byte[] word = dirty ? bfr.Xto_bry_and_clear() : Bry_.Mid(src, word_bgn, word_end); + word_mgr.Add(word); + word_bgn = -1; + } + public void Parse(byte[] src, int bgn, int end, int src_len) { + this.src = src; // this.bgn = bgn; this.end = end; this.src_len = src_len; + this.dirty = false; this.word_bgn = -1; + this.src = case_mgr.Case_build_lower(src); + int pos = bgn; + while (true) { + boolean add_to_word = false; + boolean is_last = pos == end; + if (is_last) { // do split + Mgr__add(end); + break; + } + byte b = src[pos]; + Object o = trie.Match_bgn_w_byte(b, src, pos, end); + int new_pos = -1; + if (o == null) { // unknown sequence; word-char + add_to_word = true; + new_pos = pos + 1; + } + else { + int tkn_end = trie.Match_pos(); + Xob_word_tkn tkn = (Xob_word_tkn)o; + if (tkn.Split()) { // "A b" -> "A", "b" + add_to_word = false; + if (word_bgn != -1) // handle sequences like "... " where "..." sets word_bgn to -1 + Mgr__add(pos); + tkn_end = Bry_finder.Find_fwd_while(src, tkn_end, end, tkn.Key_last_byte()); + if (tkn.Extend()) { + word_bgn = pos; + Mgr__add(tkn_end); + } + pos = tkn_end; + continue; + } + add_to_word = true; + new_pos = tkn_end; + } + if (add_to_word) { + if (dirty) + bfr.Add_byte(src[pos]); + else { + if (word_bgn == -1) + word_bgn = pos; + } + } + pos = new_pos; + } + } +} +class Xob_word_tkn { + public Xob_word_tkn(byte[] key) {this.key = key; this.key_last_byte = key[key.length - 1];} + public byte[] Key() {return key;} private final byte[] key; + public byte Key_last_byte() {return key_last_byte;} private final byte key_last_byte; + public boolean Split() {return split;} public Xob_word_tkn Split_y_() {split = true; return this;} private boolean split; + public boolean Extend() {return extend;} public Xob_word_tkn Extend_y_() {extend = true; return this;} private boolean extend; + public static Xob_word_tkn new_(String v) {return new Xob_word_tkn(Bry_.new_utf8_(v));} +} +class Xob_word_mgr { + private final OrderedHash hash = OrderedHash_.new_bry_(); + public void Clear() {hash.Clear();} + public int Len() {return hash.Count();} + public Xob_word_itm Get_at(int i) {return (Xob_word_itm)hash.FetchAt(i);} + public void Add(byte[] word) { + Xob_word_itm itm = (Xob_word_itm)hash.Fetch(word); + if (itm == null) { + itm = new Xob_word_itm(word); + hash.Add(word, itm); + } + itm.Count_add_1_(); + } +} +class Xob_word_itm { + public Xob_word_itm(byte[] word) { + this.word = word; + this.count = 0; + } + public byte[] Word() {return word;} private final byte[] word; + public int Count() {return count;} private int count; public void Count_add_1_() {++count;} + @gplx.Internal protected Xob_word_itm Count_(int v) {this.count = v; return this;} +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_word_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_word_parser_tst.java new file mode 100644 index 000000000..2c3291616 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_word_parser_tst.java @@ -0,0 +1,102 @@ +/* +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.bldrs.cmds.texts; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import org.junit.*; import gplx.xowa.langs.cases.*; +public class Xob_word_parser_tst { + private final Xob_word_parser_fxt fxt = new Xob_word_parser_fxt(); + @Before public void init() {fxt.Init();} + @Test public void Basic_1() { + fxt.Clear().Test_split("abcd", "abcd"); + } + @Test public void Basic_many() { + fxt.Clear().Test_split("abc d ef", "abc", "d", "ef"); + } + @Test public void Split_many() { + fxt.Clear().Test_split("a b", "a", "b"); + } + @Test public void Lowercase() { + fxt.Clear().Test_split("A B C", "a", "b", "c"); + } + @Test public void Dupe() { + fxt.Clear().Test_split("a a a", fxt.Make_word("a", 3)); + } + @Test public void Dupe_lowercase() { + fxt.Clear().Test_split("a A", fxt.Make_word("a", 2)); + } + @Test public void Dot_acronym() { // EX: "History of U.S.A. Science " + fxt.Clear().Test_split("abc D.E.F. ghi", "abc", "d.e.f.", "ghi"); + } + @Test public void Dot_name() { // EX: "H. G. Wells" + fxt.Clear().Test_split("a. b. last", "a.", "b.", "last"); + } + @Test public void Dot_internet() { // EX: "en.wikipedia.org" + fxt.Clear().Test_split("a.com", "a.com"); + } + @Test public void Dot_ellipsis() { // EX: "Nights into Dreams..." + fxt.Clear().Test_split("a... bc d", "a", "...", "bc", "d"); + } +// tst_Split("a-b.c", "a", "b", "c"); +// tst_Split("a A", "a"); +// tst_Split("a_b", "a", "b"); +// tst_Split("a (b)", "a", "b"); +} +class Xob_word_parser_fxt { + private final Xob_word_parser word_parser = new Xob_word_parser(); + private final Xob_word_mgr word_mgr = new Xob_word_mgr(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(32); + private Xol_case_mgr case_mgr; + public void Init() { + case_mgr = Xol_case_mgr_.Ascii(); + word_parser.Init_for_ttl(word_mgr, case_mgr); + } + public Xob_word_parser_fxt Clear() { + word_mgr.Clear(); + return this; + } + public Xob_word_itm Make_word(String raw, int count) {return new Xob_word_itm(Bry_.new_utf8_(raw)).Count_(count);} + public void Test_split(String src, String... expd_words) { + int len = expd_words.length; + Xob_word_itm[] ary = new Xob_word_itm[len]; + for (int i = 0; i < len; ++i) { + ary[i] = Make_word(expd_words[i], 1); + } + Test_split(src, ary); + } + public void Test_split(String src, Xob_word_itm... expd_words) { + byte[] src_bry = Bry_.new_utf8_(src); + word_parser.Parse(src_bry, 0, src_bry.length, src_bry.length); + Tfds.Eq_str_lines(To_str(expd_words), To_str(word_mgr)); + } + private String To_str(Xob_word_itm[] word_ary) { + int len = word_ary.length; + for (int i = 0; i < len; ++i) { + if (i != 0) tmp_bfr.Add_byte_nl(); + Xob_word_itm word = word_ary[i]; + tmp_bfr.Add(word.Word()).Add_byte_pipe(); + tmp_bfr.Add_int_variable(word.Count()); + } + return tmp_bfr.Xto_str_and_clear(); + } + private String To_str(Xob_word_mgr word_mgr) { + int len = word_mgr.Len(); + Xob_word_itm[] ary = new Xob_word_itm[len]; + for (int i = 0; i < len; ++i) + ary[i] = word_mgr.Get_at(i); + return To_str(ary); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java index a3c2fbf66..dd9cdb35b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java @@ -16,29 +16,37 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -import gplx.xowa.bldrs.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.xowa.bldrs.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.html.css.*; public class Xob_css_cmd implements Xob_cmd { private final Xob_bldr bldr; private final Xowe_wiki wiki; private final Gfo_usr_dlg usr_dlg; + private Io_url css_dir; private String css_key; public Xob_css_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki; this.usr_dlg = wiki.Appe().Usr_dlg();} public String Cmd_key() {return Xob_cmd_keys.Key_text_css;} - public void Cmd_init(Xob_bldr bldr) {} - public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_init(Xob_bldr bldr) { + if (css_dir == null) css_dir = wiki.App().Fsys_mgr().Wiki_css_dir(wiki.Domain_str()); // EX: /xowa/user/anonymous/wiki/en.wikipedia.org + if (css_key == null) css_key = Xowd_css_core_mgr.Key_default; + } public void Cmd_run() { usr_dlg.Plog_many("", "", Cmd_key() + ":bgn;"); - Io_url css_dir = bldr.App().User().Fsys_mgr().Wiki_html_dir(wiki.Domain_str()); // EX: /xowa/user/anonymous/wiki/en.wikipedia.org - bldr.App().Css_installer().Install_assert(Bool_.N, wiki, css_dir); + bldr.App().Html__css_installer().Install(wiki, null); // download from wmf usr_dlg.Plog_many("", "", Cmd_key() + ":css_dir; dir=~{0}", css_dir.Raw()); - wiki.Init_db_mgr();// NOTE: must follow Install_assert b/c Init_assert also calls Install_assert; else will download any css from db + wiki.Init_db_mgr(); // NOTE: must follow Install b/c Init_assert also calls Install; else will download any css from db Xowd_db_file core_db = wiki.Db_mgr_as_sql().Core_data_mgr().Db__core(); core_db.Conn().Txn_bgn(); core_db.Tbl__css_core().Create_tbl(); core_db.Tbl__css_file().Create_tbl(); - gplx.xowa.html.css.Xowd_css_core_mgr.Set(core_db.Tbl__css_core(), core_db.Tbl__css_file(), css_dir); - core_db.Tbl__cfg().Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xowd_db_file_schema_props.Key__tbl_css_core, Bool_.Y); + gplx.xowa.html.css.Xowd_css_core_mgr.Set(core_db.Tbl__css_core(), core_db.Tbl__css_file(), css_dir, css_key); + core_db.Tbl__cfg().Update_yn(Xow_cfg_consts.Grp__wiki_schema, Xowd_db_file_schema_props.Key__tbl_css_core, Bool_.Y); core_db.Conn().Txn_end(); usr_dlg.Plog_many("", "", Cmd_key() + ":end;"); } + public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_end() {} public void Cmd_term() {} - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Rv_unhandled;} + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_css_dir_)) css_dir = m.ReadIoUrl("v"); + else if (ctx.Match(k, Invk_css_key_)) css_key = m.ReadStr("v"); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk_css_dir_ = "css_dir_", Invk_css_key_ = "css_key_"; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java index 4a9fa1d71..be5b833fb 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java @@ -46,7 +46,7 @@ public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd { while (page_rdr.Move_next()) { int page_id = page_rdr.Read_int(fld_page_id); byte[] ttl = page_rdr.Read_bry_by_str(fld_page_ttl); - byte[][] words = Xob_search_base.Split(lang, hash, bfr, ttl); + byte[][] words = Xob_search_base.Split_ttl_into_words(lang, hash, bfr, ttl); int words_len = words.length; for (int i = 0; i < words_len; i++) { byte[] word = words[i]; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java index 5285c64cf..f03f29fe6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java @@ -47,7 +47,7 @@ public class Xob_search_base_tst { } private Xob_fxt fxt = new Xob_fxt().Ctor_mem(); private void tst_Split(String raw, String... expd) { OrderedHash list = OrderedHash_.new_(); Bry_bfr bfr = Bry_bfr.new_(); - byte[][] actl_bry = Xob_search_base.Split(fxt.App().Lang_mgr().Lang_en(), list, bfr, Bry_.new_utf8_(raw)); + byte[][] actl_bry = Xob_search_base.Split_ttl_into_words(fxt.App().Lang_mgr().Lang_en(), list, bfr, Bry_.new_utf8_(raw)); String[] actl = new String[actl_bry.length]; for (int i = 0; i < actl_bry.length; i++) actl[i] = String_.new_utf8_(actl_bry[i]); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_decompress_bz2_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_decompress_bz2_cmd.java index 697514b32..cfe4df6cf 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_decompress_bz2_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_decompress_bz2_cmd.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; -import gplx.ios.*; import gplx.threads.*; import gplx.xowa.bldrs.*; +import gplx.ios.*; import gplx.core.threads.*; import gplx.xowa.bldrs.*; public class Xob_decompress_bz2_cmd extends Xob_itm_basic_base implements Xob_cmd { public Xob_decompress_bz2_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} public String Cmd_key() {return Xob_cmd_keys.Key_decompress_bz2;} @@ -47,7 +47,7 @@ public class Xob_decompress_bz2_cmd extends Xob_itm_basic_base implements Xob_cm while (decompress.Exit_code() == ProcessAdp.Exit_init) { String size = gplx.ios.Io_size_.Xto_str(Io_mgr._.QueryFil(trg_fil).Size()); app.Usr_dlg().Prog_many(GRP_KEY, "decompress", "decompressing: ~{0}", size); - ThreadAdp_.Sleep(1000); + Thread_adp_.Sleep(1000); } return true; } diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java index 09725e5b3..2889144d9 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java @@ -28,7 +28,7 @@ public class Xob_import_marker { Io_mgr._.DeleteFil_args(url_(wiki)).MissingFails_off().Exec(); } public boolean Chk(Xowe_wiki wiki) { - if (!Xoa_app_.Mode_is_gui()) return true; // NOTE: ignore during Server / Console modes; DATE:2015-04-01 + if (!wiki.App().App_type().Uid_is_gui()) return true; // NOTE: ignore during Server / Console modes; DATE:2015-04-01 if (in_progress_hash.Has(wiki.Domain_bry())) return true; // NOTE: ignore if currently building; different bldr commands call wiki.Init_assert() which may lead to fals checks; Io_url url = url_(wiki); if (!Io_mgr._.ExistsFil(url)) return true; diff --git a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_mgr.java b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_mgr.java index dd2e43512..cf12a7e48 100644 --- a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_mgr.java +++ b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_mgr.java @@ -51,14 +51,19 @@ public class Xocfg_bnd_mgr implements GfoInvkAble, Gfo_sort_able { app.Usr_dlg().Warn_many("", "", "failed to set bnds; src=~{0} err=~{1}", String_.new_utf8_(src), Err_.Message_gplx_brief(e)); } } + private void Show_shortcut_win(String uid, String name, String binding) { + Xog_bnd_win win = new Xog_bnd_win(); + win.Show(app.Gui_mgr().Kit(), app.Gui_mgr().Browser_win().Win_box(), bnd_mgr.Bnd_parser(), name, binding); + } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Xoa_fmtr_itm.Invk_get_at)) return this.Get_at(m.ReadInt("v")); else if (ctx.Match(k, Xoa_fmtr_itm.Invk_len)) return this.Len(); else if (ctx.Match(k, Xoa_fmtr_itm.Invk_sorter)) return sorter; else if (ctx.Match(k, Invk_set_bulk)) Set_bulk(m.ReadBry("v")); else if (ctx.Match(k, Invk_init)) return Init(m.ReadStr("v")); + else if (ctx.Match(k, Invk_show_shortcut_win)) Show_shortcut_win(m.ReadStr("uid"), m.ReadStr("name"), m.ReadStr("binding")); else return GfoInvkAble_.Rv_unhandled; return this; } - private static final String Invk_set_bulk = "set_bulk", Invk_init = "init"; + private static final String Invk_set_bulk = "set_bulk", Invk_init = "init", Invk_show_shortcut_win = "show_shortcut_win"; } diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java index 8232f790d..59b238959 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; -import gplx.threads.*; import gplx.ios.*; +import gplx.core.threads.*; import gplx.ios.*; import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.fsdb.data.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.gui.*; import gplx.xowa.html.hdumps.core.*; @@ -57,6 +57,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr { fsdb.Ctor_by_lnki(hdump.Lnki_ttl(), hdump.Lnki_type(), hdump.Lnki_w(), hdump.Lnki_h(), Xof_patch_upright_tid_.Tid_all, hdump.Lnki_upright(), hdump.Lnki_time(), hdump.Lnki_page()); fsdb.Lnki_ext_(Xof_ext_.new_by_id_(hdump.Lnki_ext())); fsdb.Html_uid_(hdump.Html_uid()); + fsdb.Html_elem_tid_(hdump.Html_elem_tid()); fsdb.Orig_exists_n_(); Xof_orig_itm orig = orig_mgr.Find_by_ttl_or_null(fsdb.Lnki_ttl()); if (orig == Xof_orig_itm.Null) return; Eval_orig(exec_tid, orig, fsdb, url_bldr, repo_mgr, img_size); diff --git a/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java index 3ee61c5fc..a113413d0 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java @@ -32,7 +32,7 @@ public class Xof_lnki_file_mgr { page_init_needed = false; wiki.File_mgr().Init_file_mgr_by_load(wiki); // NOTE: fsdb_mgr may not be init'd for wiki; assert that that it is Make_fsdb_list(page.Lnki_list(), wiki.File_mgr().Patch_upright()); // NOTE: Patch_upright check must occur after Init_by_wiki; DATE:2014-05-31 - wiki.File_mgr__orig_mgr().Find_by_list(orig_regy, fsdb_list, exec_tid); + wiki.File__orig_mgr().Find_by_list(orig_regy, fsdb_list, exec_tid); Make_fsdb_hash(); } Xof_fsdb_itm fsdb = (Xof_fsdb_itm)fsdb_hash.Fetch(xfer.Lnki_ttl()); diff --git a/400_xowa/src/gplx/xowa/files/Xog_redlink_thread.java b/400_xowa/src/gplx/xowa/files/Xog_redlink_thread.java index 232335353..db306d7f8 100644 --- a/400_xowa/src/gplx/xowa/files/Xog_redlink_thread.java +++ b/400_xowa/src/gplx/xowa/files/Xog_redlink_thread.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; -import gplx.threads.*; import gplx.xowa.files.gui.*; +import gplx.core.threads.*; import gplx.xowa.files.gui.*; public class Xog_redlink_thread implements Gfo_thread_wkr { private final int[] redlink_ary; private final Xog_js_wkr js_wkr; public Xog_redlink_thread(int[] redlink_ary, Xog_js_wkr js_wkr) {this.redlink_ary = redlink_ary; this.js_wkr = js_wkr;} diff --git a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java index f4b23115b..b3ca786e4 100644 --- a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java @@ -59,7 +59,8 @@ public class Xow_file_mgr implements GfoInvkAble { version = Version_2; } public int Patch_upright() { - return this.Version() == Version_1 + Fsm_mnt_mgr mnt_mgr = fsdb_mgr.Mnt_mgr(); + return this.Version() == Version_1 || mnt_mgr == null ? Xof_patch_upright_tid_.Tid_all : fsdb_mgr.Mnt_mgr().Patch_upright() ; @@ -119,7 +120,7 @@ public class Xow_file_mgr implements GfoInvkAble { if (db_core == null ) return; // no fsdb_core found; exit this.version = Version_2; this.fsdb_mode = Xof_fsdb_mode.new_view(); - orig_mgr.Init_by_wiki(fsdb_mode, db_core.File__orig_tbl_ary(), wiki.Domain_bry(), wiki.App().Wmf_mgr().Download_wkr(), wiki.File_mgr__repo_mgr(), Xof_url_bldr.new_v2_()); + orig_mgr.Init_by_wiki(fsdb_mode, db_core.File__orig_tbl_ary(), wiki.Domain_bry(), wiki.App().Wmf_mgr().Download_wkr(), wiki.File__repo_mgr(), Xof_url_bldr.new_v2_()); fsdb_mgr.Init_by_wiki(wiki); } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_skip_mgr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_skip_mgr.java index 6c60fb1f6..965898986 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_skip_mgr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_skip_mgr.java @@ -17,47 +17,64 @@ along with this program. If not, see . */ package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.ios.*; -import gplx.xowa.files.fsdb.*; +import gplx.fsdb.meta.*; import gplx.xowa.files.fsdb.*; public class Xof_bin_skip_mgr { private Xof_bin_skip_wkr[] wkrs = new Xof_bin_skip_wkr[0]; private int wkrs_len; - public Xof_bin_skip_mgr(String[] wkr_keys) { - this.wkrs_len = wkr_keys.length; - this.wkrs = new Xof_bin_skip_wkr[wkrs_len]; - for (int i = 0; i < wkrs_len; ++i) - wkrs[i] = New_wkr(wkr_keys[i]); + public Xof_bin_skip_mgr(Fsm_cfg_mgr cfg_mgr, String[] wkr_keys) { + ListAdp list = ListAdp_.new_(); + for (int i = 0; i < wkrs_len; ++i) { + Xof_bin_skip_wkr wkr = New_wkr(cfg_mgr, wkr_keys[i]); + if (wkr != null) list.Add(wkr); + } + this.wkrs = (Xof_bin_skip_wkr[])list.Xto_ary_and_clear(Xof_bin_skip_wkr.class); + this.wkrs_len = wkrs.length; } public boolean Skip(Xof_fsdb_itm fsdb, Io_stream_rdr src_rdr) { for (int i = 0; i < wkrs_len; ++i) { - if (wkrs[i].Skip(fsdb, src_rdr)) return true; + if (wkrs[i].Skip_exec(fsdb, src_rdr)) return true; } return false; } - private Xof_bin_skip_wkr New_wkr(String key) { - if (String_.Eq(key, Xof_bin_skip_wkr_.Key__page_gt_1)) return Xof_bin_skip_wkr__page_gt_1.I; - else if (String_.Eq(key, Xof_bin_skip_wkr_.Key__small_size)) return Xof_bin_skip_wkr__small_size.I; + private Xof_bin_skip_wkr New_wkr(Fsm_cfg_mgr cfg_mgr, String key) { + Xof_bin_skip_wkr rv = null; + if (String_.Eq(key, Xof_bin_skip_wkr_.Key__page_gt_1)) rv = Xof_bin_skip_wkr__page_gt_1.I; + else if (String_.Eq(key, Xof_bin_skip_wkr_.Key__small_size)) rv =Xof_bin_skip_wkr__small_size.I; else throw Err_.unhandled(key); + if (!rv.Skip_init(cfg_mgr)) return null; + return rv; + } + public void Skip_term(Fsm_cfg_mgr cfg_mgr) { + for (int i = 0; i < wkrs_len; ++i) + wkrs[i].Skip_term(cfg_mgr); } } interface Xof_bin_skip_wkr { String Key(); - boolean Skip(Xof_fsdb_itm fsdb, Io_stream_rdr src_rdr); + boolean Skip_init(Fsm_cfg_mgr cfg_mgr); + boolean Skip_exec(Xof_fsdb_itm fsdb, Io_stream_rdr src_rdr); + void Skip_term(Fsm_cfg_mgr cfg_mgr); } class Xof_bin_skip_wkr_ { public static final String Key__page_gt_1 = "page_gt_1", Key__small_size = "small_size"; } class Xof_bin_skip_wkr__page_gt_1 implements Xof_bin_skip_wkr { // prior to v2.4.3; lnkis with page > 1 was mistakenly bringing down page 1; EX: [[A.pdf|page=5]] -> page1; DATE:2015-04-21 public String Key() {return Xof_bin_skip_wkr_.Key__page_gt_1;} - public boolean Skip(Xof_fsdb_itm fsdb, Io_stream_rdr src_rdr) { + public boolean Skip_init(Fsm_cfg_mgr cfg_mgr) {return !cfg_mgr.Patch__page_gt_1();} + public boolean Skip_exec(Xof_fsdb_itm fsdb, Io_stream_rdr src_rdr) { boolean rv = fsdb.Lnki_page() > 1; if (rv) Xoa_app_.Usr_dlg().Note_many("", "", "src_bin_mgr:skip page gt 1: file=~{0} width=~{1} page=~{2}", fsdb.Lnki_ttl(), fsdb.File_w(), fsdb.Lnki_page()); return rv; } + public void Skip_term(Fsm_cfg_mgr cfg_mgr) { + cfg_mgr.Patch__save(Fsm_cfg_mgr.Key_patch__page_gt_1); + } public static final Xof_bin_skip_wkr__page_gt_1 I = new Xof_bin_skip_wkr__page_gt_1(); Xof_bin_skip_wkr__page_gt_1() {} } class Xof_bin_skip_wkr__small_size implements Xof_bin_skip_wkr {// downloads can randomly be broken; assume that anything with a small size is broken and redownload again; DATE:2015-04-21 public String Key() {return Xof_bin_skip_wkr_.Key__small_size;} - public boolean Skip(Xof_fsdb_itm fsdb, Io_stream_rdr src_rdr) { + public boolean Skip_init(Fsm_cfg_mgr cfg_mgr) {return true;} + public boolean Skip_exec(Xof_fsdb_itm fsdb, Io_stream_rdr src_rdr) { boolean rv = src_rdr.Len() < 500 // file is small (< 500 bytes) && fsdb.Html_w() > 50 // only apply to images larger than 50 px (arbitrarily chosen); needed to ignore 1x1 images as well as icon-sized images @@ -67,5 +84,6 @@ class Xof_bin_skip_wkr__small_size implements Xof_bin_skip_wkr {// downloads can Xoa_app_.Usr_dlg().Note_many("", "", "src_bin_mgr:skip small file: file=~{0} width=~{1} ext=~{2} len=~{3}", fsdb.Lnki_ttl(), fsdb.Lnki_w(), fsdb.Orig_ext(), src_rdr.Len()); return rv; } + public void Skip_term(Fsm_cfg_mgr cfg_mgr) {} public static final Xof_bin_skip_wkr__small_size I = new Xof_bin_skip_wkr__small_size(); Xof_bin_skip_wkr__small_size() {} } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java index 051f87335..0959d498b 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java @@ -26,7 +26,8 @@ public class Xof_bin_wkr__fsdb_sql implements Xof_bin_wkr { public String Key() {return Xof_bin_wkr_.Key_fsdb_wiki;} public Fsm_mnt_mgr Mnt_mgr() {return mnt_mgr;} private final Fsm_mnt_mgr mnt_mgr; public boolean Resize_allowed() {return bin_wkr_resize;} public void Resize_allowed_(boolean v) {bin_wkr_resize = v;} private boolean bin_wkr_resize = false; - public void Skip_mgr_init(String[] wkrs) {this.skip_mgr = new Xof_bin_skip_mgr(wkrs);} + public Xof_bin_skip_mgr Skip_mgr() {return skip_mgr;} + public void Skip_mgr_init(Fsm_cfg_mgr cfg_mgr, String[] wkrs) {this.skip_mgr = new Xof_bin_skip_mgr(cfg_mgr, wkrs);} public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm fsdb, boolean is_thumb, int w) { Find_ids(fsdb, is_thumb, w); int bin_db_id = tmp_ids.Bin_db_id(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return Io_stream_rdr_.Null; diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java index a38c370c3..9a62b24a1 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.ios.*; import gplx.threads.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; +import gplx.ios.*; import gplx.core.threads.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr { private final Xow_repo_mgr repo_mgr; private final IoEngine_xrg_downloadFil download_wkr; private final Xof_url_bldr url_bldr = new Xof_url_bldr(); @@ -46,7 +46,7 @@ public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr { } private void Handle_error() { if (fail_timeout > 0) - ThreadAdp_.Sleep(fail_timeout); // as per WMF policy, pause 1 second for every cache miss; http://lists.wikimedia.org/pipermail/wikitech-l/2013-September/071948.html + Thread_adp_.Sleep(fail_timeout); // as per WMF policy, pause 1 second for every cache miss; http://lists.wikimedia.org/pipermail/wikitech-l/2013-September/071948.html } private void Download_init(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { byte mode = lnki_is_thumb ? Xof_repo_itm.Mode_thumb : Xof_repo_itm.Mode_orig; @@ -60,5 +60,5 @@ public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr { else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_fail_timeout_ = "fail_timeout_"; - public static Xof_bin_wkr__http_wmf new_(Xow_wiki wiki) {return new Xof_bin_wkr__http_wmf(wiki.File_mgr__repo_mgr(), wiki.App().Wmf_mgr().Download_wkr().Download_xrg());} + public static Xof_bin_wkr__http_wmf new_(Xow_wiki wiki) {return new Xof_bin_wkr__http_wmf(wiki.File__repo_mgr(), wiki.App().Wmf_mgr().Download_wkr().Download_xrg());} } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java index 513064d58..4e5ea2779 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java @@ -121,7 +121,7 @@ public class Xof_cache_mgr2 { // byte mode_id = itm.File_is_orig() ? gplx.xowa.files.repos.Xof_repo_itm.Mode_orig : gplx.xowa.files.repos.Xof_repo_itm.Mode_thumb; // byte[] wiki_domain = Xow_domain_tid_.To_domain(itm.Lnki_site()).Domain_bry(); // Xow_wiki wiki = wiki_mgr.Get_by_key_or_make(wiki_domain); -// gplx.xowa.files.repos.Xof_repo_itm trg_repo = wiki.File_mgr__repo_mgr().Repos_get_by_wiki(wiki_domain).Trg(); +// gplx.xowa.files.repos.Xof_repo_itm trg_repo = wiki.File__repo_mgr().Repos_get_by_wiki(wiki_domain).Trg(); // byte[] ttl = itm.Lnki_ttl(); // byte[] md5 = Xof_xfer_itm_.Md5_(ttl); // Xof_ext itm_ext = Xof_ext_.new_by_id_(itm.Orig_ext()); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java index c54d19fbe..814178455 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java @@ -29,10 +29,10 @@ public class Xof_fsdb_mgr__sql implements Xof_fsdb_mgr, GfoInvkAble { if (init) return; try { init = true; - if (wiki.File_mgr__fsdb_mode().Tid_wmf()) return; + if (wiki.File__fsdb_mode().Tid_wmf()) return; Xoa_app app = wiki.App(); - this.cache_mgr = app.File_mgr__cache_mgr(); this.url_bldr = Xof_url_bldr.new_v2_(); - this.repo_mgr = wiki.File_mgr__repo_mgr(); Xof_img_mgr img_mgr = app.File_mgr__img_mgr(); + this.cache_mgr = app.File__cache_mgr(); this.url_bldr = Xof_url_bldr.new_v2_(); + this.repo_mgr = wiki.File__repo_mgr(); Xof_img_mgr img_mgr = app.File__img_mgr(); Fsdb_db_mgr core = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); if (core == null) return; fsdb_enabled = true; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java index b89105aa0..2d1baac96 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java @@ -44,6 +44,6 @@ public class Fs_root_fsdb_mgr implements Xof_fsdb_mgr, GfoInvkAble { // read ima return this; } private static final String Invk_root_dir_ = "root_dir_", Invk_orig_dir_ = "orig_dir_", Invk_thumb_dir_ = "thumb_dir_"; public Xof_bin_mgr Bin_mgr() {throw Err_.not_implemented_();} - public Fsm_mnt_mgr Mnt_mgr() {throw Err_.not_implemented_();} + public Fsm_mnt_mgr Mnt_mgr() {return null;} public void Rls() {} } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java index 18518e2f9..4a8fcfbd1 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java @@ -29,9 +29,9 @@ class Xof_file_fxt { Xoa_test_.Db_init(root_url); app = Xoa_app_fxt.app_(Op_sys.Cur().Os_name(), root_url); wiki = Xoa_app_fxt.wiki_tst_(app); - wiki.File_mgr__fsdb_mode().Tid_make_y_(); + wiki.File__fsdb_mode().Tid_make_y_(); this.fsdb_mgr = (Xof_fsdb_mgr__sql)wiki.File_mgr().Fsdb_mgr(); - this.orig_mgr = wiki.File_mgr__orig_mgr(); + this.orig_mgr = wiki.File__orig_mgr(); Xof_repo_fxt.Repos_init(app.File_mgr(), true, wiki); Xowe_wiki_bldr.Create(wiki, 1, "dump.xml"); Xowd_db_file text_db = wiki.Data_mgr__core_mgr().Dbs__make_by_tid(Xowd_db_file_.Tid_text); text_db.Tbl__text().Create_tbl(); diff --git a/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java b/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java index 0577f7f86..390ec7c0e 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java +++ b/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java @@ -30,7 +30,7 @@ public class Js_img_mgr { html_itm.Html_elem_atr_set_append(html_id, "class", " new"); } private static void Update_img(Xoa_page page, Xog_js_wkr js_wkr, Js_img_wkr img_wkr, int uid, byte lnki_type, byte elem_tid, int html_w, int html_h, String html_src, int orig_w, int orig_h, String orig_src, byte[] lnki_ttl, int gallery_mgr_h) { - if (!Xoa_app_.Mode_is_gui()) return; // do not update html widget unless app is gui; null ref on http server; DATE:2014-09-17 + if (!page.Wiki().App().App_type().Uid_is_gui()) return; // do not update html widget unless app is gui; null ref on http server; DATE:2014-09-17 switch (elem_tid) { case Xof_html_elem.Tid_gallery_v2: img_wkr.Html_update(page, js_wkr, uid, html_w, html_h, html_src, orig_w, orig_h, orig_src, lnki_ttl); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java b/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java index f0ff93a17..7b4f01ae9 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java @@ -23,7 +23,7 @@ public class Xob_orig_tbl_bldr extends Xob_itm_basic_base implements Xob_cmd { public String Cmd_key() {return Xob_cmd_keys.Key_file_orig_reg;} public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Xof_fsdb_mode fsdb_mode = wiki.File_mgr__fsdb_mode(); + Xof_fsdb_mode fsdb_mode = wiki.File__fsdb_mode(); fsdb_mode.Tid_make_y_(); wiki.Init_assert(); Fsdb_db_mgr db_core_mgr = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); diff --git a/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_win.java b/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_win.java new file mode 100644 index 000000000..fa3616806 --- /dev/null +++ b/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_win.java @@ -0,0 +1,90 @@ +/* +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.gui.bnds; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; +import gplx.gfui.*; +public class Xog_bnd_win implements GfoInvkAble { + private GfuiWin win; + private GfuiTextBox shortcut_txt, binding_txt, keycode_txt; + private GfuiBtn ok_btn, cxl_btn; + private Gfui_bnd_parser bnd_parser; + public void Show(Gfui_kit kit, GfuiWin owner_win, Gfui_bnd_parser bnd_parser, String shortcut_text, String binding_text) { + // create controls + this.win = kit.New_win_utl("shortcut_win", owner_win); win.BackColor_(ColorAdp_.White).Size_(200, 120); + this.bnd_parser = bnd_parser; + GfuiLbl shortcut_lbl = Make_lbl(kit, win, "shortcut_lbl" , "Shortcut:"); + GfuiLbl binding_lbl = Make_lbl(kit, win, "binding_lbl" , "Binding:"); + GfuiLbl keycode_lbl = Make_lbl(kit, win, "keycode_lbl" , "Keycode:"); + this.shortcut_txt = Make_txt(kit, win, "shortcut_txt" , shortcut_text); + this.binding_txt = Make_txt(kit, win, "binding_txt" , binding_text); + this.keycode_txt = Make_txt(kit, win, "keycode_txt" , ""); + this.ok_btn = Make_btn(kit, win, "ok_btn" , "Ok"); + this.cxl_btn = Make_btn(kit, win, "cxl_btn" , "Cancel"); + // layout controls + Layout( 0, shortcut_lbl , shortcut_txt); + Layout(20, binding_lbl , binding_txt); + Layout(40, keycode_lbl , keycode_txt); + ok_btn.Pos_(110, 70); cxl_btn.Pos_(150, 70); + // hookup events + IptCfg null_cfg = IptCfg_.Null; IptEventType btn_event_type = IptEventType_.add_(IptEventType_.MouseDown, IptEventType_.KeyDown); IptArg[] btn_args = IptArg_.Ary(IptMouseBtn_.Left, IptKey_.Enter, IptKey_.Space); + IptBnd_.ipt_to_(null_cfg , binding_txt , this, Invk_when_key_down , IptEventType_.KeyDown, IptArg_.Wildcard); + IptBnd_.ipt_to_(null_cfg , binding_txt , this, Invk_when_key_up , IptEventType_.KeyUp, IptArg_.Wildcard); + IptBnd_.ipt_to_(null_cfg , ok_btn , this, "when_ok" , btn_event_type, btn_args); + IptBnd_.ipt_to_(null_cfg , cxl_btn , this, "when_cxl" , btn_event_type, btn_args); + // open + win.Pos_(SizeAdp_.center_(ScreenAdp_.Primary.Size(), win.Size())); + win.Show(); + binding_txt.Focus(); + } + private void When_key_down(GfoMsg m) { + IptEventData event_data = (IptEventData)m.Args_getAt(0).Val(); + int keycode = event_data.Key().Val(); + binding_txt.Text_(bnd_parser.Xto_norm(IptKey_.To_str(keycode))); + keycode_txt.Text_(Int_.Xto_str(keycode)); + event_data.Handled_on(); + } + private void When_key_up(GfoMsg m) { + IptEventData event_data = (IptEventData)m.Args_getAt(0).Val(); + event_data.Handled_on(); + } + private GfuiLbl Make_lbl(Gfui_kit kit, GfuiWin owner_win, String key, String text) { + return (GfuiLbl)kit.New_lbl(key, owner_win).Text_(text).Size_(80, 20).BackColor_(ColorAdp_.White); + } + private GfuiTextBox Make_txt(Gfui_kit kit, GfuiWin owner_win, String key, String text) { + return (GfuiTextBox)kit.New_text_box(key, owner_win).Text_(text).Size_(120, 20).Border_on_(); + } + private GfuiBtn Make_btn(Gfui_kit kit, GfuiWin owner_win, String key, String text) { + return (GfuiBtn)kit.New_btn(key, owner_win).Text_(text).Size_(40, 20).Focus_able_(true); + } + private void Layout(int y, GfuiElem elem_1, GfuiElem elem_2) { + elem_1.Y_(y); + elem_2.Y_(y); + elem_2.X_(elem_1.X_max()); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_when_key_down)) When_key_down(m); + else if (ctx.Match(k, Invk_when_key_press)) When_key_up(m); + else if (ctx.Match(k, Invk_when_key_up)) When_key_up(m); + else if (ctx.Match(k, Invk_when_ok)) {win.Close();} + else if (ctx.Match(k, Invk_when_cxl)) {win.Close();} + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String Invk_when_key_down = "when_key_down", Invk_when_key_press = "when_key_press", Invk_when_key_up = "when_key_up" + , Invk_when_ok = "when_ok", Invk_when_cxl = "when_cxl" + ; +} diff --git a/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java b/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java index 0021f3d66..04afcab4f 100644 --- a/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java @@ -35,7 +35,7 @@ public class Xog_menu_mgr implements GfoInvkAble { } public void Init_by_kit() { try { - if (!Xoa_app_.Mode_is_gui()) return; // NOTE: do not try to initialize menu if http_server; will fail in headless mode when it tries to load SWT images; DATE:2015-03-27 + if (!app.App_type().Uid_is_gui()) return; // NOTE: do not try to initialize menu if http_server; will fail in headless mode when it tries to load SWT images; DATE:2015-03-27 popup_mnu_mgr.Init_by_kit(); window_mnu_mgr.Init_by_kit(); Lang_changed(app.User().Lang()); diff --git a/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java b/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java new file mode 100644 index 000000000..3675d3777 --- /dev/null +++ b/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java @@ -0,0 +1,81 @@ +/* +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.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; +import gplx.core.threads.*; +public class Load_page_wkr implements Gfo_thread_wkr { + private Xog_tab_itm tab; + public Load_page_wkr(Xog_tab_itm tab, Xowe_wiki wiki, Xoa_url url, Xoa_ttl ttl) {this.tab = tab; this.wiki = wiki; this.url = url; this.ttl = ttl;} + public String Name() {return "xowa.load_page_wkr";} + public boolean Resume() {return false;} + public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; + public Xoae_page Page() {return page;} private Xoae_page page; + public Xoa_url Url() {return url;} private Xoa_url url; + public Xoa_ttl Ttl() {return ttl;} private Xoa_ttl ttl; + public boolean Hdump_enabled() {return hdump_enabled;} private boolean hdump_enabled; + public Exception Exc() {return exc;} private Exception exc; + private final static Object thread_lock = new Object(); + public static boolean Running() { + boolean rv = false; + synchronized (thread_lock) { + rv = running; + } + return rv; + } private static boolean running = false; + private static void Running_(boolean v) { + synchronized (thread_lock) { + running = v; + } + } + public void Exec() { + try { + Running_(true); + int wait_count = 0; + while (gplx.xowa.html.modules.popups.Xow_popup_mgr.Running() && ++wait_count < 100) { + Thread_adp_.Sleep(10); + } + Xoae_app app = wiki.Appe(); + app.Usr_dlg().Log_many("", "", "page.load: url=~{0}", url.Xto_full_str_safe()); + if (Env_.System_memory_free() < app.Sys_cfg().Free_mem_when()) // check if low in memory + app.Free_mem(false); // clear caches (which will clear bry_bfr_mk) + else // not low in memory + app.Utl__bfr_mkr().Clear(); // clear bry_bfr_mk only; NOTE: call before page parse, not when page is first added, else threading errors; DATE:2014-05-30 + this.page = wiki.GetPageByTtl(url, ttl, wiki.Lang(), tab, false); + int html_db_id = page.Revision_data().Html_db_id(); + if (wiki.Html__hdump_enabled()) + hdump_enabled = true; + wait_count = 0; + while (gplx.xowa.html.modules.popups.Xow_popup_mgr.Running() && ++wait_count < 100) { + Thread_adp_.Sleep(10); + } + if (wiki.Html__hdump_enabled() && html_db_id != -1) { + wiki.ParsePage(page, false); +// wiki.Html__hdump_rdr().Get_by_ttl(page); + } + else + wiki.ParsePage(page, false); + GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_loaded_swt, this); + } + catch (Exception e) { + this.exc = e; + GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_failed_swt, this); + } + finally { + Running_(false); + } + } +} diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java index 393307152..ea7728cf9 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java @@ -63,7 +63,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { html_box.Html_doc_body_focus(); // NOTE: only focus if read so up / down will scroll box; edit / html should focus edit-box; DATE:2014-06-05 page.Root().Data_htm_(html_src); } - } + } private void Html_src_(Xoae_page page, byte[] html_bry) { String html_str = String_.new_utf8_(html_bry); if (owner_tab.Tab_mgr().Html_load_tid__url()) { @@ -92,32 +92,26 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { public String Get_elem_value_for_edit_box() {return html_box.Html_elem_atr_get_str(Elem_id__xowa_edit_data_box, Gfui_html.Atr_value);} public String Get_elem_value(String elem_id) {return html_box.Html_elem_atr_get_str(elem_id, Gfui_html.Atr_value);} public void Html_img_update(String elem_id, String elem_src, int elem_width, int elem_height) { - synchronized (thread_lock) { - GfoMsg m = GfoMsg_.new_cast_(Invk_html_img_update).Add("elem_id", elem_id).Add("elem_src", elem_src).Add("elem_width", elem_width).Add("elem_height", elem_height); - GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_img_update, m); - } + GfoMsg m = GfoMsg_.new_cast_(Invk_html_img_update).Add("elem_id", elem_id).Add("elem_src", elem_src).Add("elem_width", elem_width).Add("elem_height", elem_height); + GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_img_update, m); } public void Html_elem_delete(String elem_id) { - synchronized (thread_lock) { - GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_delete).Add("elem_id", elem_id); - GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_delete, m); - } + GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_delete).Add("elem_id", elem_id); + GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_delete, m); } public void Html_atr_set(String elem_id, String atr_key, String atr_val) { - synchronized (thread_lock) { + synchronized (thread_lock) { // needed for Special:Search and async cancel; DATE:2015-05-02 GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_atr_set).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val); GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_atr_set, m); } } public void Html_redlink(String html_uid) {Html_elem_atr_set_append(html_uid, "class", "new");} public void Html_elem_atr_set_append(String elem_id, String atr_key, String atr_val) { - synchronized (thread_lock) { - GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_atr_set_append).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val); - GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_atr_set_append, m); - } + GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_atr_set_append).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val); + GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_atr_set_append, m); } public void Html_elem_replace_html(String id, String html) { - synchronized (thread_lock) { + synchronized (thread_lock) { // needed for Special:Search and async; DATE:2015-04-23 GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_replace_html).Add("id", id).Add("html", html); GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_replace_html, m); } @@ -129,27 +123,23 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { } } public void Html_gallery_packed_exec() { - synchronized (thread_lock) { - if (!String_.Eq(owner_tab.Tab_key(), owner_tab.Tab_mgr().Active_tab().Tab_key())) return; // do not exec unless active; - GfoMsg m = GfoMsg_.new_cast_(Invk_html_gallery_packed_exec); - GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_gallery_packed_exec, m); - module_packed_done = true; - } + if (!String_.Eq(owner_tab.Tab_key(), owner_tab.Tab_mgr().Active_tab().Tab_key())) return; // do not exec unless active; + GfoMsg m = GfoMsg_.new_cast_(Invk_html_gallery_packed_exec); + GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_gallery_packed_exec, m); + module_packed_done = true; } public void Html_popups_bind_hover_to_doc() { - synchronized (thread_lock) { - if (!String_.Eq(owner_tab.Tab_key(), owner_tab.Tab_mgr().Active_tab().Tab_key())) return; // do not exec unless active; - GfoMsg m = GfoMsg_.new_cast_(Invk_html_popups_bind_hover_to_doc); - GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_popups_bind_hover_to_doc, m); - module_popups_done = true; - } + if (!String_.Eq(owner_tab.Tab_key(), owner_tab.Tab_mgr().Active_tab().Tab_key())) return; // do not exec unless active; + GfoMsg m = GfoMsg_.new_cast_(Invk_html_popups_bind_hover_to_doc); + GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_popups_bind_hover_to_doc, m); + module_popups_done = true; } private boolean module_packed_done = false, module_popups_done = false; public void Tab_selected(Xoae_page page) { Xoh_module_mgr module_mgr = page.Html_data().Module_mgr(); - if (module_mgr.Itm_gallery().Enabled() && !module_packed_done) + if (module_mgr.Itm__gallery().Enabled() && !module_packed_done) this.Html_gallery_packed_exec(); - if (module_mgr.Itm_popups().Enabled() && !module_popups_done) + if (module_mgr.Itm__popups().Enabled() && !module_popups_done) this.Html_popups_bind_hover_to_doc(); } public void Scroll_page_by_bmk_gui() {GfoInvkAble_.InvkCmd(cmd_async, Invk_scroll_page_by_bmk);} diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java b/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java index 93e684a80..087e3be98 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; -import gplx.threads.*; import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.core.threads.*; import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.wikis.data.tbls.*; public class Xog_html_js_cbk implements GfoInvkAble { private Xoae_app app; private Xog_html_itm html_itm; @@ -126,7 +126,7 @@ public class Xog_html_js_cbk implements GfoInvkAble { } private String[] Wikidata_get_label(GfoMsg m) { try { - ThreadAdp_.Sleep(10); // slow down calls to prevent random crashing in XulRunner; DATE:2014-04-23 + Thread_adp_.Sleep(10); // slow down calls to prevent random crashing in XulRunner; DATE:2014-04-23 gplx.xowa.xtns.wdatas.Wdata_wiki_mgr wdata_mgr = app.Wiki_mgr().Wdata_mgr(); wdata_mgr.Wdata_wiki().Init_assert(); // NOTE: must assert else ns_mgr won't load Property int len = m.Args_count(); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java index 6081eb77d..1fe8d228d 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java @@ -17,5 +17,5 @@ along with this program. If not, see . */ package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; public interface Xog_tab_close_lnr { - boolean When_close(Xog_tab_itm tab); + boolean When_close(Xog_tab_itm tab, Xoa_url url); } diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java index b98fc2649..be43a1abb 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java @@ -22,11 +22,11 @@ public class Xog_tab_close_mgr { public void Add(Xog_tab_close_lnr lnr) {list.Add(lnr);} public int Len() {return list.Count();} public Xog_tab_close_lnr Get_at(int i) {return (Xog_tab_close_lnr)list.FetchAt(i);} - public boolean When_close(Xog_tab_itm tab) { + public boolean When_close(Xog_tab_itm tab, Xoa_url url) { int len = list.Count(); for (int i = 0; i < len; ++i) { Xog_tab_close_lnr lnr = Get_at(i); - if (!lnr.When_close(tab)) return false; + if (!lnr.When_close(tab, url)) return false; } return true; } diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java index 74c4c9e85..26fddf0fb 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; -import gplx.threads.*; import gplx.gfui.*; import gplx.xowa.gui.history.*; import gplx.xowa.gui.bnds.*; +import gplx.core.threads.*; import gplx.gfui.*; import gplx.xowa.gui.history.*; import gplx.xowa.gui.bnds.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.cfgs2.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; @@ -37,7 +37,7 @@ public class Xog_tab_itm implements GfoInvkAble { html_box.Html_js_enabled_(gui_mgr.Html_mgr().Javascript_enabled()); html_box.Html_invk_src_(win); html_itm.Html_box_(html_box); - if (app.Mode() == Xoa_app_.Mode_gui) { // NOTE: only run for gui; will cause firefox addon to fail; DATE:2014-05-03 + if (app.App_type().Uid_is_gui()) { // NOTE: only run for gui; will cause firefox addon to fail; DATE:2014-05-03 html_box.Html_doc_html_load_by_mem(""); // NOTE: must set source, else control will be empty, and key events will not be raised; DATE:2014-04-30 IptBnd_.ipt_to_(IptCfg_.Null, html_box, this, "popup", IptEventType_.MouseDown, IptMouseBtn_.Right); GfoEvMgr_.SubSame(html_box, GfuiElemKeys.Evt_menu_detected, html_itm); @@ -111,13 +111,14 @@ public class Xog_tab_itm implements GfoInvkAble { wiki.Lang().Vnt_mgr().Cur_vnt_(url.Xowa_vnt()); if (win.Page__async__working(url)) return; app.Gui_mgr().Search_suggest_mgr().Cancel(); // cancel pending search_suggest calls - if (page != null) page.Tab_data().Close_mgr().When_close(this); // cancel any current search cmds + if (page != null) page.Tab_data().Close_mgr().When_close(this, url); // cancel any current search cmds app.Log_wtr().Queue_enabled_(true); usr_dlg.Clear(); this.wiki = app.Wiki_mgr().Get_by_key_or_null(url.Wiki_bry()); // NOTE: must update wiki wiki.Init_assert(); // NOTE: assert wiki.Init before parsing; needed b/c lang (with lang-specific ns) is only loaded on init, and parse Xoa_ttl.parse_ will fail below; EX:pt.wikipedia.org/wiki/Wikipedia:P�gina principal Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url.Page_bry()); if (ttl == null) {usr_dlg.Prog_one("", "", "title is invalid: ~{0}", String_.new_utf8_(url.Raw())); return;} + Tab_name_(String_.new_utf8_(ttl.Full_txt())); usr_dlg.Prog_one("", "", "loading: ~{0}", String_.new_utf8_(ttl.Raw())); if (app.Api_root().Html().Modules().Popups().Enabled()) this.Html_box().Html_js_eval_script("if (window.xowa_popups_hide_all != null) window.xowa_popups_hide_all();"); // should be more configurable; DATE:2014-07-09 @@ -159,14 +160,15 @@ public class Xog_tab_itm implements GfoInvkAble { app.User().Data_mgr().History_mgr().Update_async(app.Async_mgr(), ttl, url); } usr_dlg.Prog_none("", "", "rendering html"); + html_itm.Html_box().Size_(tab_mgr.Tab_mgr().Size()); // NOTE: must resize tab here, else scrolling to anchor in background tab doesn't work (html_box has size of 0, 0) DATE:2015-05-03 // win.Page__async__bgn(this); Gfo_thread_wkr async_wkr = null; if (wkr.Hdump_enabled()) { wiki.File_mgr().Init_file_mgr_by_load(wiki); Xof_fsdb_mgr fsdb_mgr = wiki.File_mgr().Fsdb_mgr(); - async_wkr = new Xof_file_wkr(wiki.File_mgr__orig_mgr(), fsdb_mgr.Bin_mgr(), fsdb_mgr.Mnt_mgr(), app.File_mgr__cache_mgr(), wiki.File_mgr__repo_mgr(), html_itm, page, page.Hdump_data().Imgs(), gplx.xowa.files.Xof_exec_tid.Tid_wiki_page); - if (wiki.Html_mgr__hdump_enabled()) { - wiki.Html_mgr__hdump_wtr().Save(page); + async_wkr = new Xof_file_wkr(wiki.File__orig_mgr(), fsdb_mgr.Bin_mgr(), fsdb_mgr.Mnt_mgr(), app.File__cache_mgr(), wiki.File__repo_mgr(), html_itm, page, page.Hdump_data().Imgs(), gplx.xowa.files.Xof_exec_tid.Tid_wiki_page); + if (wiki.Html__hdump_enabled()) { + wiki.Html__hdump_wtr().Save(page); } } else @@ -179,11 +181,11 @@ public class Xog_tab_itm implements GfoInvkAble { this.tab_is_loading = false; } } - public void Exec_async_hdump(Xoa_app app, Xow_wiki wiki, gplx.xowa.files.gui.Xog_js_wkr js_wkr, gplx.threads.Gfo_thread_pool thread_pool, Xoa_page page, ListAdp imgs, int[] redlink_ary) { + public void Exec_async_hdump(Xoa_app app, Xow_wiki wiki, gplx.xowa.files.gui.Xog_js_wkr js_wkr, gplx.core.threads.Gfo_thread_pool thread_pool, Xoa_page page, ListAdp imgs, int[] redlink_ary) { if (imgs.Count() > 0) { Xof_file_wkr file_thread = new Xof_file_wkr - ( wiki.File_mgr__orig_mgr(), wiki.File_mgr__bin_mgr(), wiki.File_mgr__mnt_mgr() - , app.File_mgr__cache_mgr(), wiki.File_mgr__repo_mgr(), html_itm, page, imgs + ( wiki.File__orig_mgr(), wiki.File__bin_mgr(), wiki.File__mnt_mgr() + , app.File__cache_mgr(), wiki.File__repo_mgr(), html_itm, page, imgs , gplx.xowa.files.Xof_exec_tid.Tid_wiki_page); thread_pool.Add_at_end(file_thread); thread_pool.Run(); } @@ -215,7 +217,7 @@ public class Xog_tab_itm implements GfoInvkAble { if (page.Html_data().Xtn_gallery_packed_exists()) // packed_gallery exists; fire js once; PAGE:en.w:National_Sculpture_Museum_(Valladolid); DATE:2014-07-21 html_itm.Html_gallery_packed_exec(); if ( page.Html_data().Xtn_imap_exists() // imap exists; DATE:2014-08-07 - && page.Html_data().Module_mgr().Itm_popups().Enabled() + && page.Html_data().Module_mgr().Itm__popups().Enabled() ) html_itm.Html_popups_bind_hover_to_doc(); // rebind all elements to popup } @@ -245,7 +247,7 @@ public class Xog_tab_itm implements GfoInvkAble { try { if (page.Tab_data().Tab() != null) { // needed b/c Preview has page.Tab of null which causes null_ref error in redlinks Xog_redlink_mgr redlinks_wkr = new Xog_redlink_mgr(win_itm, page, app.User().Cfg_mgr().Log_mgr().Log_redlinks()); - ThreadAdp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_page_redlink, redlinks_wkr, gplx.xowa.parsers.lnkis.redlinks.Xog_redlink_mgr.Invk_run).Start(); + Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_page_redlink, redlinks_wkr, gplx.xowa.parsers.lnkis.redlinks.Xog_redlink_mgr.Invk_run).Start(); usr_dlg.Prog_none("", "imgs.done", ""); } } catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.redlinks: page=~{0} err=~{1}", page_ttl_str, Err_.Message_gplx_brief(e));} @@ -261,43 +263,6 @@ public class Xog_tab_itm implements GfoInvkAble { } public static final String Invk_show_url_loaded_swt = "show_url_loaded_swt", Invk_show_url_failed_swt = "show_url_failed_swt"; } -class Load_page_wkr implements Gfo_thread_wkr { - private Xog_tab_itm tab; - public Load_page_wkr(Xog_tab_itm tab, Xowe_wiki wiki, Xoa_url url, Xoa_ttl ttl) {this.tab = tab; this.wiki = wiki; this.url = url; this.ttl = ttl;} - public String Name() {return "xowa.load_page_wkr";} - public boolean Resume() {return false;} - public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; - public Xoae_page Page() {return page;} private Xoae_page page; - public Xoa_url Url() {return url;} private Xoa_url url; - public Xoa_ttl Ttl() {return ttl;} private Xoa_ttl ttl; - public boolean Hdump_enabled() {return hdump_enabled;} private boolean hdump_enabled; - public Exception Exc() {return exc;} private Exception exc; - public void Exec() { - try { - Xoae_app app = wiki.Appe(); - app.Usr_dlg().Log_many("", "", "page.load: url=~{0}", url.Xto_full_str_safe()); - if (Env_.System_memory_free() < app.Sys_cfg().Free_mem_when()) // check if low in memory - app.Free_mem(false); // clear caches (which will clear bry_bfr_mk) - else // not low in memory - app.Utl__bfr_mkr().Clear(); // clear bry_bfr_mk only; NOTE: call before page parse, not when page is first added, else threading errors; DATE:2014-05-30 - this.page = wiki.GetPageByTtl(url, ttl, wiki.Lang(), tab, false); - int html_db_id = page.Revision_data().Html_db_id(); - if (wiki.Html_mgr__hdump_enabled()) - hdump_enabled = true; - if (wiki.Html_mgr__hdump_enabled() && html_db_id != -1) { - wiki.ParsePage(page, false); -// wiki.Html_mgr__hdump_rdr().Get_by_ttl(page); - } - else - wiki.ParsePage(page, false); - GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_loaded_swt, this); - } - catch (Exception e) { - this.exc = e; - GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_failed_swt, this); - } - } -} class Load_files_wkr implements Gfo_thread_wkr { private Xog_tab_itm tab; public Load_files_wkr(Xog_tab_itm tab) {this.tab = tab;} diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java index e21754694..6e208ab33 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java @@ -16,9 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; -import gplx.gfui.*; import gplx.threads.*; +import gplx.gfui.*; import gplx.core.threads.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.gui.history.*; import gplx.xowa.pages.*; public class Xog_tab_itm_read_mgr { + private static final Xoa_url_parser url_parser = new Xoa_url_parser(); // NOTE: separate url_parser to reduce threading issues public static void Async(Xog_tab_itm tab) {tab.Async();} public static void Show_page(Xog_tab_itm tab, Xoae_page new_page, boolean reset_to_read) {Show_page(tab, new_page, reset_to_read, false, false, Xog_history_stack.Nav_fwd);} public static void Show_page(Xog_tab_itm tab, Xoae_page new_page, boolean reset_to_read, boolean new_page_is_same, boolean show_is_err, byte history_nav_type) { @@ -45,7 +46,7 @@ public class Xog_tab_itm_read_mgr { } tab.Page_(new_page); if (tab == tab.Tab_mgr().Active_tab()) - Update_selected_tab(win.App().Url_parser(), win, new_page.Url(), new_page.Ttl()); + Update_selected_tab(win, new_page.Url(), new_page.Ttl()); Xol_font_info lang_font = wiki.Lang().Gui_font(); if (lang_font.Name() == null) lang_font = win.Gui_mgr().Win_cfg().Font(); Xog_win_itm_.Font_update(win, lang_font); @@ -57,8 +58,8 @@ public class Xog_tab_itm_read_mgr { else GfoInvkAble_.InvkCmd_val(tab.Html_itm().Cmd_async(), Xog_html_itm.Invk_html_elem_focus, Xog_html_itm.Elem_id__xowa_edit_data_box); // NOTE: must be async, else won't work; DATE:2014-06-05 } - public static void Update_selected_tab_blank(Xoa_url_parser url_parser, Xog_win_itm win) {Update_selected_tab(url_parser, win, null, null);} // called when all tabs are null - public static void Update_selected_tab(Xoa_url_parser url_parser, Xog_win_itm win, Xoa_url url, Xoa_ttl ttl) { + public static void Update_selected_tab_blank(Xog_win_itm win) {Update_selected_tab(win, null, null);} // called when all tabs are null + public static void Update_selected_tab(Xog_win_itm win, Xoa_url url, Xoa_ttl ttl) { String url_str = "", win_str = Win_text_blank; if (url != null && ttl != null) { try {url_str = url_parser.Build_str(url);} @@ -78,7 +79,7 @@ public class Xog_tab_itm_read_mgr { win.App().Log_wtr().Queue_enabled_(false); Xoae_page fail_page = wiki.Data_mgr().Get_page(ttl, false); tab.View_mode_(Xopg_view_mode.Tid_edit); - Update_selected_tab(win.App().Url_parser(), win, url, ttl); + Update_selected_tab(win, url, ttl); Show_page(tab, fail_page, false, false, true, Xog_history_stack.Nav_fwd); win.Win_box().Text_(err_msg); } diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java index e23ecee99..403c5d9a0 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java @@ -117,7 +117,7 @@ public class Xog_tab_mgr implements GfoEvObj { Xog_tab_itm tab = Tabs_get_by_key_or_warn(key); if (tab == null) return; active_tab = tab; Xoae_page page = tab.Page(); - Xog_tab_itm_read_mgr.Update_selected_tab(win.App().Url_parser(), win, page.Url(), page.Ttl()); + Xog_tab_itm_read_mgr.Update_selected_tab(win, page.Url(), page.Ttl()); tab.Html_itm().Tab_selected(page); } public void Tabs_close_cur() { @@ -149,7 +149,7 @@ public class Xog_tab_mgr implements GfoEvObj { return rv; } public boolean Tabs__pub_close(Xog_tab_itm tab) { - return tab.Page().Tab_data().Close_mgr().When_close(tab); + return tab.Page().Tab_data().Close_mgr().When_close(tab, Xoa_url.Null); } public void Tabs_close_undo() { if (closed_undo_list.Count() == 0) return; @@ -165,7 +165,7 @@ public class Xog_tab_mgr implements GfoEvObj { tab_regy.Del(key); if (tab_regy.Count() == 0) { active_tab = Xog_tab_itm_.Null; - Xog_tab_itm_read_mgr.Update_selected_tab_blank(win.App().Url_parser(), win); + Xog_tab_itm_read_mgr.Update_selected_tab_blank(win); } else Tabs_recalc_idx(); @@ -217,10 +217,8 @@ public class Xog_tab_mgr implements GfoEvObj { } public void Tabs_new_link(String link, boolean focus) { Xowe_wiki wiki = active_tab.Wiki(); + Xog_tab_itm new_tab = Tabs_new(focus, false, wiki, Xoae_page.new_(wiki, active_tab.Page().Ttl())); // NOTE: do not use ttl from link, else middle-clicking pages with anchors won't work; DATE:2015-05-03 Xoa_url url = Xoa_url_parser.Parse_from_url_bar(win.App(), wiki, link); // NOTE: link must be of form domain/wiki/page; DATE:2014-05-27 - Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url.Page_bry()); - Xog_tab_itm new_tab = Tabs_new(focus, false, wiki, Xoae_page.new_(wiki, ttl)); - new_tab.Tab_name_(String_.new_utf8_(Xoa_ttl.Replace_unders(url.Page_bry()))); new_tab.Show_url_bgn(url); if (focus) tab_mgr.Tabs_select_by_idx(new_tab.Tab_idx()); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java index 5b50a3f70..7f1df6812 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; -import gplx.threads.*; import gplx.gfui.*; import gplx.xowa.gui.*; import gplx.xowa.gui.history.*; import gplx.xowa.xtns.math.*; import gplx.xowa.files.*; +import gplx.core.threads.*; import gplx.gfui.*; import gplx.xowa.gui.*; import gplx.xowa.gui.history.*; import gplx.xowa.xtns.math.*; import gplx.xowa.files.*; import gplx.xowa.gui.urls.*; import gplx.xowa.gui.views.*; import gplx.xowa.pages.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.specials.*; public class Xog_win_itm implements GfoInvkAble, GfoEvObj { @@ -205,21 +205,21 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { Page__async__bgn(tab); } public void Page__async__bgn(Xog_tab_itm tab) { - page__async__thread = ThreadAdp_.invk_msg_(gplx.xowa.apps.Xoa_thread_.Key_page_async, this, GfoMsg_.new_cast_(Invk_page_async_exec).Add("v", tab)).Start(); - } private ThreadAdp page__async__thread = ThreadAdp.Null; + page__async__thread = Thread_adp_.invk_msg_(gplx.xowa.apps.Xoa_thread_.Key_page_async, this, GfoMsg_.new_cast_(Invk_page_async_exec).Add("v", tab)).Start(); + } private Thread_adp page__async__thread = Thread_adp.Null; public boolean Page__async__working(Xoa_url url) { if (page__async__thread.IsAlive()) { // cancel pending image downloads page__async__restart_url = url; this.Usr_dlg().Canceled_y_(); app.Wmf_mgr().Download_wkr().Download_xrg().Prog_cancel_y_(); - ThreadAdp_.invk_(this, Invk_page_async_cancel_wait).Start(); + Thread_adp_.invk_(this, Invk_page_async_cancel_wait).Start(); return true; } return false; } private void Page__async__cancel__wait() { while (page__async__thread.IsAlive()) { - ThreadAdp_.Sleep(10); + Thread_adp_.Sleep(10); } this.Active_page().File_queue().Clear(); this.Usr_dlg().Canceled_n_(); // NOTE: must mark "uncanceled", else one cancelation will stop all future downloads; DATE:2014-05-04 @@ -302,7 +302,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { GfoEvMgr_.Sub(app.Gui_mgr().Win_cfg().Font(), Xol_font_info.Font_changed, this, Invk_window_font_changed); if ( !Env_.Mode_testing() - && app.Mode() == Xoa_app_.Mode_gui) // only run for gui; do not run for tcp/http server; DATE:2014-05-03 + && app.App_type().Uid_is_gui()) // only run for gui; do not run for tcp/http server; DATE:2014-05-03 app.Usr_dlg().Ui_wkr_(new Gfo_usr_dlg_ui_swt(kit, prog_box, info_box, info_box, app.Api_root().Gui().Browser().Info())); } } diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr_base.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr_base.java new file mode 100644 index 000000000..06d13477d --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr_base.java @@ -0,0 +1,26 @@ +/* +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.html; import gplx.*; import gplx.xowa.*; +public abstract class Xoh_page_wtr_mgr_base { + public byte[] Css_common_bry() {return css_common_bry;} private byte[] css_common_bry; + public byte[] Css_wiki_bry() {return css_wiki_bry;} private byte[] css_wiki_bry; + public void Init_css_urls(Io_url css_common_url, Io_url css_wiki_url) { + this.css_common_bry = css_common_url.To_http_file_bry(); + this.css_wiki_bry = css_wiki_url.To_http_file_bry(); + } +} diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr_tst.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr_tst.java index 08d8bb239..6e9dada8e 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr_tst.java @@ -26,7 +26,7 @@ public class Xoh_page_wtr_mgr_tst { Xow_portal_mgr portal_mgr = wiki.Html_mgr().Portal_mgr(); GfoInvkAble_.InvkCmd_val(portal_mgr, Xow_portal_mgr.Invk_div_logo_, Bry_.new_ascii_("~{portal_nav_main_href}")); portal_mgr.Init_assert(); - Xoh_page_wtr_mgr page_wtr_mgr = new Xoh_page_wtr_mgr(true); + Xohe_page_wtr_mgr page_wtr_mgr = new Xohe_page_wtr_mgr(true); page_wtr_mgr.Gen(wiki.Ctx().Cur_page(), Xopg_view_mode.Tid_read); Tfds.Eq(String_.new_ascii_(portal_mgr.Div_logo_bry()), "/site/en.wikipedia.org/wiki/"); } diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java index e6a26576f..1e422b46b 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java @@ -20,12 +20,13 @@ import gplx.html.*; import gplx.xowa.html.portal.*; import gplx.xowa.pages.skins import gplx.xowa.wikis.*; import gplx.xowa.gui.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.langs.vnts.*; public class Xoh_page_wtr_wkr implements Bry_fmtr_arg { private Xop_ctx ctx; private Xoae_page page; private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + private byte[] root_dir_bry; public Xoh_page_wtr_wkr(byte page_mode) {this.page_mode = page_mode;} private byte page_mode; public Wdata_xwiki_link_wtr Wdata_lang_wtr() {return wtr_page_lang;} private Wdata_xwiki_link_wtr wtr_page_lang = new Wdata_xwiki_link_wtr(); public Xoh_page_wtr_wkr Page_(Xoae_page v) {this.page = v; return this;} - public Xoh_page_wtr_wkr Mgr_(Xoh_page_wtr_mgr v) {this.mgr = v; return this;} private Xoh_page_wtr_mgr mgr; + public Xoh_page_wtr_wkr Mgr_(Xohe_page_wtr_mgr v) {this.mgr = v; return this;} private Xohe_page_wtr_mgr mgr; public boolean Ctgs_enabled() {return ctgs_enabled;} public Xoh_page_wtr_wkr Ctgs_enabled_(boolean v) {ctgs_enabled = v; return this;} private boolean ctgs_enabled = true; - public byte[] Write(Xoh_page_wtr_mgr mgr, Xoae_page page, Xop_ctx ctx, Bry_bfr html_bfr) { + public byte[] Write(Xohe_page_wtr_mgr mgr, Xoae_page page, Xop_ctx ctx, Bry_bfr html_bfr) { this.mgr = mgr; this.page = page; this.ctx = ctx; Xowe_wiki wiki = page.Wikie(); Xoae_app app = wiki.Appe(); ctx.Cur_page_(page); // HACK: must update page for toc_mgr; WHEN: Xoae_page rewrite @@ -50,12 +51,13 @@ public class Xoh_page_wtr_wkr implements Bry_fmtr_arg { this.page = null; return html_bfr.Xto_bry_and_clear(); } - private void Write_page(Bry_bfr html_bfr, Xoae_app app, Xowe_wiki wiki, Xoh_page_wtr_mgr mgr, Xoae_page page, byte view_tid, Bry_fmtr fmtr, Object page_data) { + private void Write_page(Bry_bfr html_bfr, Xoae_app app, Xowe_wiki wiki, Xohe_page_wtr_mgr mgr, Xoae_page page, byte view_tid, Bry_fmtr fmtr, Object page_data) { byte[] custom_html = page.Html_data().Custom_html(); if (custom_html != null) { html_bfr.Add(custom_html); return; } + if (root_dir_bry == null) this.root_dir_bry = app.Fsys_mgr().Root_dir().To_http_file_bry(); DateAdp page_modified_on_dte = page.Revision_data().Modified_on(); Xoa_ttl page_ttl = page.Ttl(); int page_ns_id = page_ttl.Ns().Id(); byte page_tid = Xow_page_tid.Identify(wiki.Domain_tid(), page_ns_id, page_ttl.Page_db()); @@ -66,7 +68,7 @@ public class Xoh_page_wtr_wkr implements Bry_fmtr_arg { byte[] js_edit_toolbar_bry = view_tid == Xopg_view_mode.Tid_edit ? wiki.Fragment_mgr().Html_js_edit_toolbar() : Bry_.Empty; Xow_portal_mgr portal_mgr = wiki.Html_mgr().Portal_mgr().Init_assert(); fmtr.Bld_bfr_many(html_bfr - , app.Fsys_mgr().Root_dir_bry(), Xoa_app_.Version, Xoa_app_.Build_date, app.Tcp_server().Running_str() + , root_dir_bry, Xoa_app_.Version, Xoa_app_.Build_date, app.Tcp_server().Running_str() , page.Revision_data().Id() , Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page_ttl, null) // NOTE: page_name does not show display_title (). always pass in null , Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page_ttl, page.Html_data().Display_ttl()) diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_tst.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_tst.java index 15067026d..2e386f881 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_tst.java @@ -57,7 +57,7 @@ class Xoh_page_wtr_wkr_fxt { wiki.Html_mgr().Page_wtr_mgr().Html_capable_(true); Xoae_page page = wiki.Ctx().Cur_page(); page.Data_raw_(Bry_.new_utf8_(raw)); - Xoh_page_wtr_mgr mgr = wiki.Html_mgr().Page_wtr_mgr(); + Xohe_page_wtr_mgr mgr = wiki.Html_mgr().Page_wtr_mgr(); Xoh_page_wtr_wkr wkr = mgr.Wkr(Xopg_view_mode.Tid_edit).Page_(page).Mgr_(mgr); wkr.XferAry(tmp_bfr, 0); Tfds.Eq(expd, tmp_bfr.Xto_str_and_clear()); @@ -67,7 +67,7 @@ class Xoh_page_wtr_wkr_fxt { Xoae_page page = wiki.Ctx().Cur_page(); page.Ttl_(Xoa_ttl.parse_(wiki, Bry_.new_ascii_(page_name))); page.Data_raw_(Bry_.new_utf8_(page_text)); - Xoh_page_wtr_mgr mgr = wiki.Html_mgr().Page_wtr_mgr(); + Xohe_page_wtr_mgr mgr = wiki.Html_mgr().Page_wtr_mgr(); Xoh_page_wtr_wkr wkr = mgr.Wkr(Xopg_view_mode.Tid_read).Page_(page).Mgr_(mgr); wkr.XferAry(tmp_bfr, 0); Tfds.Eq(expd, tmp_bfr.Xto_str_and_clear()); diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java b/400_xowa/src/gplx/xowa/html/Xohe_page_wtr_mgr.java similarity index 70% rename from 400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java rename to 400_xowa/src/gplx/xowa/html/Xohe_page_wtr_mgr.java index e2ba08ab5..5df586f71 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xohe_page_wtr_mgr.java @@ -17,63 +17,39 @@ along with this program. If not, see . */ package gplx.xowa.html; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.xowa.pages.*; -public class Xoh_page_wtr_mgr implements GfoInvkAble { +public class Xohe_page_wtr_mgr extends Xoh_page_wtr_mgr_base implements GfoInvkAble { private Xoh_page_wtr_wkr edit_wtr, html_wtr, read_wtr; - public Xoh_page_wtr_mgr(boolean html_capable) { - page_edit_fmtr.Fmt_(String_.Concat_lines_nl_skip_last - ( "" - , "" - , " " - , " " - , "" - , "" - , " " - , "" - , "" - )); + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + public Xohe_page_wtr_mgr(boolean html_capable) { +// page_edit_fmtr.Fmt_(String_.Concat_lines_nl_skip_last +// ( "" +// , "" +// , " " +// , " " +// , "" +// , "" +// , " " +// , "" +// , "" +// )); this.html_capable = html_capable; read_wtr = new Xoh_page_wtr_wkr(Xopg_view_mode.Tid_read); edit_wtr = new Xoh_page_wtr_wkr(Xopg_view_mode.Tid_edit); html_wtr = new Xoh_page_wtr_wkr(Xopg_view_mode.Tid_html); } - public boolean Html_capable() {return html_capable;} public Xoh_page_wtr_mgr Html_capable_(boolean v) {html_capable = v; return this;} private boolean html_capable; - public Bry_fmtr Page_read_fmtr() {return page_read_fmtr;} - public byte[] Css_common_bry() {return css_common_bry;} public Xoh_page_wtr_mgr Css_common_bry_(Io_url v) {css_common_bry = Xoa_app_.Utl__encoder_mgr().Fsys().Encode_http(v); return this;} private byte[] css_common_bry; - public byte[] Css_wiki_bry() {return css_wiki_bry;} public Xoh_page_wtr_mgr Css_wiki_bry_(Io_url v) {css_wiki_bry = Xoa_app_.Utl__encoder_mgr().Fsys().Encode_http(v); return this;} private byte[] css_wiki_bry; - private static final String[] Fmtr_keys = new String[] - { "app_root_dir", "app_version", "app_build_date", "xowa_mode_is_server" - , "page_id", "page_name", "page_title", "page_modified_on_msg" - , "html_css_common_path", "html_css_wiki_path", "xowa_head" - , "page_lang_ltr", "page_indicators", "page_content_sub", "page_jumpto", "page_body_cls", "html_content_editable" - , "page_data", "page_langs" - , "portal_div_personal", "portal_div_ns", "portal_div_view" - , "portal_div_logo", "portal_div_home", "portal_div_xtn" - , "portal_div_wikis", "portal_sidebar" - , "edit_div_rename", "edit_div_preview", "js_edit_toolbar" - }; - private Bry_fmtr page_read_fmtr = Bry_fmtr.new_("", Fmtr_keys); + public boolean Html_capable() {return html_capable;} public Xohe_page_wtr_mgr Html_capable_(boolean v) {html_capable = v; return this;} private boolean html_capable; + public Bry_fmtr Page_read_fmtr() {return page_read_fmtr;} private Bry_fmtr page_read_fmtr = Bry_fmtr.new_("", Fmtr_keys); public Bry_fmtr Page_edit_fmtr() {return page_edit_fmtr;} private Bry_fmtr page_edit_fmtr = Bry_fmtr.new_("", Fmtr_keys); public Bry_fmtr Page_html_fmtr() {return page_html_fmtr;} private Bry_fmtr page_html_fmtr = Bry_fmtr.new_("", Fmtr_keys); - private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); - public byte[] Edit_rename_div_bry(Xoa_ttl ttl) { - return div_edit_rename_fmtr.Bld_bry_many(tmp_bfr, ttl.Full_db()); - } private Bry_fmtr div_edit_rename_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl - ( " " - , " " - , " Rename page" - , " " - , " " - , " Special:MovePage" - , " " - ), "src_full_db"); + public byte[] Edit_rename_div_bry(Xoa_ttl ttl) {return div_edit_rename_fmtr.Bld_bry_many(tmp_bfr, ttl.Full_db());} public void Init_(boolean v) {init = v;} private boolean init = true; public byte[] Gen(Xoae_page page, byte output_tid) { Xoh_page_wtr_wkr wtr = Wkr(output_tid); @@ -105,7 +81,27 @@ public class Xoh_page_wtr_mgr implements GfoInvkAble { else return GfoInvkAble_.Rv_unhandled; return this; } + private Bry_fmtr div_edit_rename_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl + ( " " + , " " + , " Rename page" + , " " + , " " + , " Special:MovePage" + , " " + ), "src_full_db"); public static final String Invk_page_read_ = "page_read_", Invk_page_edit_ = "page_edit_", Invk_page_html_ = "page_html_", Invk_xowa_div_edit_rename_ = "xowa_div_edit_rename_"; + private static final String[] Fmtr_keys = new String[] + { "app_root_dir", "app_version", "app_build_date", "xowa_mode_is_server" + , "page_id", "page_name", "page_title", "page_modified_on_msg" + , "html_css_common_path", "html_css_wiki_path", "xowa_head" + , "page_lang_ltr", "page_indicators", "page_content_sub", "page_jumpto", "page_body_cls", "html_content_editable" + , "page_data", "page_langs" + , "portal_div_personal", "portal_div_ns", "portal_div_view" + , "portal_div_logo", "portal_div_home", "portal_div_xtn" + , "portal_div_wikis", "portal_sidebar" + , "edit_div_rename", "edit_div_preview", "js_edit_toolbar" + }; } /* NOTE_1:xowa_anchor_button diff --git a/400_xowa/src/gplx/xowa/html/Xohv_page_wtr_mgr.java b/400_xowa/src/gplx/xowa/html/Xohv_page_wtr_mgr.java new file mode 100644 index 000000000..ad670aa53 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/Xohv_page_wtr_mgr.java @@ -0,0 +1,20 @@ +/* +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.html; import gplx.*; import gplx.xowa.*; +public class Xohv_page_wtr_mgr extends Xoh_page_wtr_mgr_base { +} diff --git a/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java b/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java index 4d41f3d7e..415dc3c35 100644 --- a/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java @@ -23,7 +23,7 @@ public class Xow_html_mgr implements GfoInvkAble { this.wiki = wiki; html_wtr = new Xoh_html_wtr(wiki, this); Xoae_app app = wiki.Appe(); - page_wtr_mgr = new Xoh_page_wtr_mgr(app.Gui_mgr().Kit().Tid() != gplx.gfui.Gfui_kit_.Swing_tid); // reverse logic to handle swt,drd but not mem + page_wtr_mgr = new Xohe_page_wtr_mgr(app.Gui_mgr().Kit().Tid() != gplx.gfui.Gfui_kit_.Swing_tid); // reverse logic to handle swt,drd but not mem Io_url file_dir = app.User().Fsys_mgr().App_img_dir().GenSubDir_nest("file"); img_media_play_btn = Xoa_app_.Utl__encoder_mgr().Fsys().Encode_http(file_dir.GenSubFil("play.png")); img_media_info_btn = Xoa_app_.Utl__encoder_mgr().Fsys().Encode_http(file_dir.GenSubFil("info.png")); @@ -43,7 +43,7 @@ public class Xow_html_mgr implements GfoInvkAble { } public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; public Xoh_html_wtr Html_wtr() {return html_wtr;} private Xoh_html_wtr html_wtr; - public Xoh_page_wtr_mgr Page_wtr_mgr() {return page_wtr_mgr;} private Xoh_page_wtr_mgr page_wtr_mgr; + public Xohe_page_wtr_mgr Page_wtr_mgr() {return page_wtr_mgr;} private Xohe_page_wtr_mgr page_wtr_mgr; public Xow_portal_mgr Portal_mgr() {return portal_mgr;} private Xow_portal_mgr portal_mgr; public Xow_toc_mgr Toc_mgr() {return toc_mgr;} private Xow_toc_mgr toc_mgr = new Xow_toc_mgr(); public Xow_module_mgr Module_mgr() {return module_mgr;} private Xow_module_mgr module_mgr; diff --git a/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java index 72a21dd4e..1009692f4 100644 --- a/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java +++ b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java @@ -18,7 +18,6 @@ along with this program. If not, see . package gplx.xowa.html.css; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xowd_css_core_mgr { - public static void Set(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir) {Set(core_tbl, file_tbl, css_dir, Key_default);} public static void Set(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir, String key) { Db_conn conn = core_tbl.Conn(); Io_url[] file_list = Io_mgr._.QueryDir_args(css_dir).Recur_().ExecAsUrlAry(); @@ -41,7 +40,6 @@ public class Xowd_css_core_mgr { } catch (Exception e) {conn.Txn_cxl(); throw Err_.err_(e);} } - public static void Get(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir) {Get(core_tbl, file_tbl, css_dir, Key_default);} public static void Get(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir, String key) { int css_id = core_tbl.Select_id_by_key(key); if (css_id == Xowd_css_core_tbl.Id_null) throw Err_.new_("skin:unknown key: {0}", key); Xowd_css_file_itm[] file_list = file_tbl.Select_by_owner(css_id); @@ -53,5 +51,5 @@ public class Xowd_css_core_mgr { Io_mgr._.SaveFilBry(file_url, file.Data()); } } - public static final String Key_default = "xowa.default"; + public static final String Key_default = "xowa.default", Key_mobile = "xowa.mobile"; } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java index 885530cda..e6d2a86bc 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java @@ -23,8 +23,9 @@ public class Xohd_hdump_rdr { private final Bry_bfr_mkr bfr_mkr; private final Xow_hzip_mgr hzip_mgr; private final Xohd_abrv_mgr abrv_mgr; private final Xohd_page_html_mgr__load load_mgr; private Xowd_db_mgr core_data_mgr; private final Xowd_page_itm dbpg = new Xowd_page_itm(); - public Xohd_hdump_rdr(Xoa_app app, Xow_wiki wiki) { - this.bfr_mkr = app.Utl__bfr_mkr(); this.hzip_mgr = wiki.Html_mgr__hzip_mgr(); + private final Xow_wiki wiki; + public Xohd_hdump_rdr(Xoa_app app, Xow_wiki wiki) { + this.bfr_mkr = app.Utl__bfr_mkr(); this.hzip_mgr = wiki.Html__hzip_mgr(); this.wiki = wiki; abrv_mgr = new Xohd_abrv_mgr(app.Usr_dlg(), app.Fsys_mgr(), app.Utl__encoder_mgr().Fsys(), wiki.Domain_bry()); load_mgr = new Xohd_page_html_mgr__load(); // TODO: get db_id } @@ -60,9 +61,9 @@ public class Xohd_hdump_rdr { core_data_mgr.Tbl__page().Select_by_ttl(dbpg, ttl.Ns(), ttl.Page_db()); // get rows from db if (dbpg.Redirect_id() != -1) Get_by_ttl__resolve_redirect(dbpg, rv); if (dbpg.Html_db_id() == -1) return false; // dbpg does not hdump; exit; - rv.Init(dbpg.Id(), null, ttl); // FIXME + rv.Init(wiki, dbpg.Id(), null, ttl); // FIXME Xowd_db_file html_db = core_data_mgr.Dbs__get_at(dbpg.Html_db_id()); - load_mgr.Load_page(rv, html_db.Tbl__html(), dbpg.Id(), ttl); + load_mgr.Load_page(wiki, rv, html_db.Tbl__html(), dbpg.Id(), ttl); return true; } private void Get_by_ttl__resolve_redirect(Xowd_page_itm dbpg, Xog_page hpg) { @@ -75,9 +76,9 @@ public class Xohd_hdump_rdr { } public static void Load_module_mgr(Xoh_module_mgr page_module_mgr, Xog_page hpg) { Xopg_module_mgr dump_module_mgr = hpg.Module_mgr(); - page_module_mgr.Itm_mathjax().Enabled_ (dump_module_mgr.Math_exists()); - page_module_mgr.Itm_popups().Bind_hover_area_ (dump_module_mgr.Imap_exists()); - page_module_mgr.Itm_gallery().Enabled_ (dump_module_mgr.Gallery_packed_exists()); - page_module_mgr.Itm_hiero().Enabled_ (dump_module_mgr.Hiero_exists()); + page_module_mgr.Itm__mathjax().Enabled_ (dump_module_mgr.Math_exists()); + page_module_mgr.Itm__popups().Bind_hover_area_ (dump_module_mgr.Imap_exists()); + page_module_mgr.Itm__gallery().Enabled_ (dump_module_mgr.Gallery_packed_exists()); + page_module_mgr.Itm__hiero().Enabled_ (dump_module_mgr.Hiero_exists()); } } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java index 8b3316461..a652c0ec5 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java @@ -20,7 +20,7 @@ import gplx.xowa.html.hdumps.data.*; import gplx.xowa.html.hzips.*; import gplx. import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa2.gui.*; public class Xohd_hdump_wtr { - private final Bry_bfr_mkr bfr_mkr; private final Xoh_page_wtr_mgr page_wtr_mgr; + private final Bry_bfr_mkr bfr_mkr; private final Xohe_page_wtr_mgr page_wtr_mgr; private final Xohd_page_html_mgr__save save_mgr; private Xowd_db_mgr core_data_mgr; public Xohd_hdump_wtr(Xoa_app app, Xowe_wiki wiki) { this.bfr_mkr = app.Utl__bfr_mkr(); this.page_wtr_mgr = wiki.Html_mgr().Page_wtr_mgr(); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr_tst.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr_tst.java index 5a4a9e861..22cd84efe 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr_tst.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr_tst.java @@ -89,7 +89,11 @@ public class Xohd_hdump_wtr_tst { ( "