1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00

'v3.6.3.1'

This commit is contained in:
gnosygnu
2016-06-19 23:58:10 -04:00
parent 96636f3161
commit d4e8590345
1960 changed files with 20790 additions and 9272 deletions

View File

@@ -16,29 +16,30 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.strings.*; import gplx.gfui.*;
public class Gfo_usr_dlg__gui__swt implements Gfo_usr_dlg__gui, GfoInvkAble {
private final GfuiInvkCmd cmd_sync; private final GfuiTextBox prog_box, info_box; private final Gfo_usr_dlg__gui__opt opt;
import gplx.core.lists.rings.*;
import gplx.gfui.*; import gplx.gfui.draws.*; import gplx.gfui.kits.core.*; import gplx.gfui.controls.standards.*;
public class Gfo_usr_dlg__gui__swt implements Gfo_usr_dlg__gui, Gfo_invk {
private final GfuiInvkCmd cmd_sync; private final GfuiTextBox prog_box, info_box; private final Gfo_usr_dlg__gui__opt opt;
public Gfo_usr_dlg__gui__swt(Gfui_kit kit, GfuiTextBox prog_box, GfuiTextBox info_box, GfuiTextBox warn_box, Gfo_usr_dlg__gui__opt opt) {
this.cmd_sync = kit.New_cmd_sync(this); // NOTE: cmd_sync needed else progress messages may be sent out of order
this.prog_box = prog_box; this.info_box = info_box;
this.opt = opt;
}
public void Clear() {Write(Invk_write_prog, ""); info_box.Text_(""); info_box.ForeColor_(ColorAdp_.Black); info_box.BackColor_(ColorAdp_.White); info_box.Redraw(); info_box_is_warn = false;}
public String_ring Prog_msgs() {return prog_msgs;} String_ring prog_msgs = new String_ring().Max_(128);
public Ring__string Prog_msgs() {return prog_msgs;} Ring__string prog_msgs = new Ring__string().Max_(128);
public void Write_prog(String text) {Write(Invk_write_prog, text);}
public void Write_note(String text) {if (opt.Note_enabled()) Write(Invk_write_note, text);}
public void Write_warn(String text) {if (opt.Warn_enabled()) Write(Invk_write_warn, text);}
public void Write_stop(String text) {Write(Invk_write_stop, text);}
private void Write(String invk, String text) {
GfoMsg m = GfoMsg_.new_cast_(invk).Add("v", text);
GfoInvkAble_.InvkCmd_msg(cmd_sync, invk, m);
Gfo_invk_.Invk_by_msg(cmd_sync, invk, m);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_write_prog)) {String v = m.ReadStr("v"); prog_box.Text_(v); prog_box.Redraw(); if (!String_.Eq(v, "")) prog_msgs.Push(v);}
else if (ctx.Match(k, Invk_write_note)) {Info_box_write(m.ReadStr("v"), false); info_box.Redraw();}
else if (ctx.Match(k, Invk_write_warn)) {Info_box_write(m.ReadStr("v"), true); info_box.ForeColor_(ColorAdp_.White); info_box.BackColor_(ColorAdp_.Red); info_box.Redraw();}
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
return this;
}
private void Info_box_write(String v, boolean warn) {

View File

@@ -18,50 +18,53 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.threads.*; import gplx.core.envs.*;
public class Load_page_wkr implements Gfo_thread_wkr {
private static final Object thread_lock = new Object(); private static boolean running = false;
private final Xog_tab_itm tab;
private final 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 final Xowe_wiki wiki;
public Xoa_url Url() {return url;} private final Xoa_url url;
public Xoa_ttl Ttl() {return ttl;} private final Xoa_ttl ttl;
public Xoae_page Page() {return page;} private Xoae_page page;
public boolean Hdump_enabled() {return hdump_enabled;} private boolean hdump_enabled;
public Exception Exec_err() {return exec_err;} private Exception exec_err;
public void Exec() {
public String Thread__name() {return "xowa.load_page_wkr";}
public boolean Thread__resume() {return false;}
public Xowe_wiki Wiki() {return wiki;} private final Xowe_wiki wiki;
public Xoa_url Url() {return url;} private final Xoa_url url;
public Xoa_ttl Ttl() {return ttl;} private final Xoa_ttl ttl;
public Xoae_page Page() {return page;} private Xoae_page page;
public Exception Exec_err() {return exec_err;} private Exception exec_err;
public void Thread__exec() {
try {
Running_(true);
int wait_count = 0;
while (gplx.xowa.htmls.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.To_str());
if (Env_.System_memory_free() < app.Sys_cfg().Free_mem_when()) // check if low in memory
Xow_wiki_.Rls_mem(wiki, false); // clear caches (which will clear bry_bfr_mkr)
else // not low in memory
app.Utl__bfr_mkr().Clear(); // clear bry_bfr_mkr only; NOTE: call before page parse, not when page is first added, else threading errors; DATE:2014-05-30
this.page = wiki.Data_mgr().Load_page_by_ttl(url, ttl, wiki.Lang(), tab, false);
this.hdump_enabled = wiki.Html__hdump_enabled();
wait_count = 0;
while (gplx.xowa.htmls.modules.popups.Xow_popup_mgr.Running() && ++wait_count < 100)
Thread_adp_.Sleep(10);
if (hdump_enabled && page.Revision_data().Html_db_id() != -1) {
// wiki.Parser_mgr().Parse(page, false);
wiki.Html__hdump_mgr().Load_mgr().Load(page);
}
// wait_for_popups; free mem check;
Xoa_app_.Usr_dlg().Log_many("", "", "page.load: url=~{0}", url.To_str());
Wait_for_popups();
Xowe_wiki_.Rls_mem_if_needed(wiki);
// load page meta; wait_for_popups
this.page = wiki.Data_mgr().Load_page_and_parse(url, ttl, wiki.Lang(), tab, false);
boolean hdump_exists = page.Revision_data().Html_db_id() != -1 && wiki.Appe().Api_root().Wiki().Hdump().Read_preferred();
page.Html_data().Hdump_exists_(hdump_exists);
Wait_for_popups();
// load page text
if (hdump_exists)
wiki.Html__hdump_mgr().Load_mgr().Load_by_edit(page);
else
wiki.Parser_mgr().Parse(page, false);
GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_loaded_swt, this);
// launch thread to show page
Gfo_invk_.Invk_by_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_loaded_swt, this);
}
catch (Exception e) {
this.exec_err = e;
GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_failed_swt, this);
Gfo_invk_.Invk_by_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_failed_swt, this);
}
finally {
Running_(false);
}
}
private static void Wait_for_popups() {// HACK: wait for popups to finish, else thread errors due to popups and loader mutating cached items
int wait_count = 0;
while (gplx.xowa.htmls.modules.popups.Xow_popup_mgr.Running() && ++wait_count < 100)
Thread_adp_.Sleep(10);
}
private static final Object thread_lock = new Object(); private static boolean running = false;
public static boolean Running() {
boolean rv = false;
synchronized (thread_lock) {

View File

@@ -0,0 +1,101 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.threads.*;
import gplx.xowa.parsers.lnkis.redlinks.*;
import gplx.xowa.files.gui.*;
public class Xog_async_wkr {
public static void Async(Xoae_page page, Xog_html_itm js_wkr) {
if (page == null) return; // TEST: occurs during Xog_win_mgr_tst
// get wiki
Xowe_wiki wiki = page.Wikie(); Xoae_app app = wiki.Appe(); Gfo_usr_dlg usr_dlg = app.Usr_dlg();
app.Usr_dlg().Log_many("", "", "page.async: url=~{0}", page.Url().To_str());
if (page.Url().Anch_str() != null)
js_wkr.Scroll_page_by_id_gui(page.Url().Anch_str());
if (usr_dlg.Canceled()) {
usr_dlg.Prog_none("", "", "");
app.Log_wtr().Queue_enabled_(false);
return;
}
Async_imgs(usr_dlg, app, wiki, page, js_wkr);
Async_math(usr_dlg, app, page, js_wkr);
Async_score(usr_dlg, app, page);
Async_redlinks(usr_dlg, app, page, js_wkr);
// cache maintenance
usr_dlg.Prog_none("", "imgs.done", "");
try {app.File_mgr().Cache_mgr().Compress_check();}
catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.cache: page=~{0} err=~{1}", page.Ttl().Raw(), Err_.Message_gplx_full(e));}
app.Usere().User_db_mgr().Cache_mgr().Page_end(app.Wiki_mgr());
app.Log_wtr().Queue_enabled_(false); // flush queue
}
private static void Async_imgs(Gfo_usr_dlg usr_dlg, Xoae_app app, Xowe_wiki wiki, Xoae_page page, Xog_js_wkr js_wkr) {
// get images
int len = page.File_queue().Count(); if (len == 0) return;
usr_dlg.Prog_one("", "", "downloading images: ~{0}", len);
try {page.File_queue().Exec(wiki, page);}
catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.image: page=~{0} err=~{1}", page.Ttl().Raw(), Err_.Message_gplx_full(e));}
// handle packed_gallery and imap
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
js_wkr.Html_gallery_packed_exec();
if ( page.Html_data().Xtn_imap_exists() // imap exists; DATE:2014-08-07
&& page.Html_data().Head_mgr().Itm__popups().Enabled()
)
js_wkr.Html_popups_bind_hover_to_doc(); // rebind all elements to popup
}
private static void Async_math(Gfo_usr_dlg usr_dlg, Xoae_app app, Xoae_page page, Xog_js_wkr js_wkr) {
// make png from latex
int len = page.File_math().Count();
if (len == 0) return;
try {
usr_dlg.Prog_one("", "", "page.async.math; count=~{0}", len);
for (int i = 0; i < len; ++i) {
if (usr_dlg.Canceled()) {
usr_dlg.Prog_none("", "", "");
app.Log_wtr().Queue_enabled_(false);
return;
}
gplx.xowa.xtns.math.Xof_math_itm itm = (gplx.xowa.xtns.math.Xof_math_itm)page.File_math().Get_at(i);
String queue_msg = usr_dlg.Prog_many("", "", "generating math ~{0} of ~{1}: ~{2}", i + List_adp_.Base1, len, itm.Math());
app.File_mgr().Math_mgr().MakePng(itm.Math(), itm.Hash(), itm.Png_url(), queue_msg);
gplx.gfui.SizeAdp size = app.File_mgr().Img_mgr().Wkr_query_img_size().Exec(itm.Png_url());
js_wkr.Html_img_update("xowa_math_img_" + itm.Id(), itm.Png_url().To_http_file_str(), size.Width(), size.Height());
js_wkr.Html_elem_delete("xowa_math_txt_" + itm.Id());
}
page.File_math().Clear();
}
catch (Exception e) {usr_dlg.Warn_many("", "", "page.async.math: page=~{0} err=~{1}", page.Ttl().Raw(), Err_.Message_gplx_log(e));}
}
private static void Async_score(Gfo_usr_dlg usr_dlg, Xoae_app app, Xoae_page page) {
// run other cmds
if (page.Html_cmd_mgr().Count() > 0) {
try {page.Html_cmd_mgr().Exec(app, page);}
catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.cmds: page=~{0} err=~{1}", page.Ttl().Raw(), Err_.Message_gplx_full(e));}
}
}
private static void Async_redlinks(Gfo_usr_dlg usr_dlg, Xoae_app app, Xoae_page page, Xog_js_wkr js_wkr) {
if (page.Tab_data().Tab() == null) return; // needed b/c Preview has page.Tab of null which causes null_ref error in redlinks
try {
Xog_redlink_mgr redlinks_wkr = new Xog_redlink_mgr(page);
Thread_adp_.Start_by_key(gplx.xowa.apps.Xoa_thread_.Key_page_redlink, redlinks_wkr, gplx.xowa.parsers.lnkis.redlinks.Xog_redlink_mgr.Invk_run);
} catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.redlinks: page=~{0} err=~{1}", page.Ttl().Raw(), Err_.Message_gplx_full(e));}
}
}

View File

@@ -17,11 +17,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.primitives.*; import gplx.core.btries.*;
import gplx.gfui.*; import gplx.xowa.guis.menus.*; import gplx.xowa.guis.menus.dom.*; import gplx.xowa.files.gui.*;
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.gfui.controls.elems.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.guis.menus.*; import gplx.xowa.guis.menus.dom.*; import gplx.xowa.files.gui.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.js.*; import gplx.xowa.htmls.heads.*; import gplx.xowa.wikis.pages.*;
public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
private Xoae_app app; private final Object thread_lock = new Object();
private final String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_();
public class Xog_html_itm implements Xog_js_wkr, Gfo_invk, Gfo_evt_itm {
private Xoae_app app; private final Object thread_lock = new Object();
private final String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_();
protected Xog_html_itm() {} // TEST: for prefs_mgr
public Xog_html_itm(Xog_tab_itm owner_tab) {
this.owner_tab = owner_tab;
@@ -30,14 +31,14 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
Gfui_kit kit = owner_tab.Tab_mgr().Win().Kit();
cmd_sync = kit.New_cmd_sync(this); // NOTE: always use sync; async will cause some images to be "lost" in update;
cmd_async = kit.New_cmd_async(this);
ev_mgr = GfoEvMgr.new_(this);
ev_mgr = new Gfo_evt_mgr(this);
}
public GfoEvMgr EvMgr() {return ev_mgr;} private GfoEvMgr ev_mgr;
public Gfo_evt_mgr Evt_mgr() {return ev_mgr;} private Gfo_evt_mgr ev_mgr;
public Xog_tab_itm Owner_tab() {return owner_tab;} private Xog_tab_itm owner_tab;
public Gfui_html Html_box() {return html_box;} private Gfui_html html_box;
public Xoh_js_cbk Js_cbk() {return js_cbk;} private Xoh_js_cbk js_cbk;
public GfoInvkAble Cmd_sync() {return cmd_sync;} private GfoInvkAble cmd_sync;
public GfoInvkAble Cmd_async() {return cmd_async;} private GfoInvkAble cmd_async;
public Gfo_invk Cmd_sync() {return cmd_sync;} private Gfo_invk cmd_sync;
public Gfo_invk Cmd_async() {return cmd_async;} private Gfo_invk cmd_async;
public void Switch_mem(Xog_html_itm comp) {
Xog_tab_itm temp_owner_tab = owner_tab; // NOTE: reparent owner_tab, since owner_tab will be switching its html_itm
this.owner_tab = comp.owner_tab;
@@ -96,11 +97,11 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
public String Get_elem_value(String elem_id) {return 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) {
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);
Gfo_invk_.Invk_by_msg(cmd_sync, Invk_html_img_update, m);
}
public void Html_elem_delete(String elem_id) {
GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_delete).Add("elem_id", elem_id);
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_delete, m);
Gfo_invk_.Invk_by_msg(cmd_sync, Invk_html_elem_delete, m);
}
@gplx.Virtual public String Html_elem_atr_get_str(String id, String atr_key) {return html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__atr_get_as_obj, id, atr_key);}
@gplx.Virtual public boolean Html_elem_atr_get_bool(String id, String atr_key) {return Bool_.parse(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__atr_get_to_str, id, atr_key));}
@@ -109,36 +110,36 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
public void Html_atr_set(String elem_id, String atr_key, String atr_val) {
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);
Gfo_invk_.Invk_by_msg(cmd_sync, Invk_html_elem_atr_set, m);
}
}
public void Html_redlink(String html_uid) {Html_doc_atr_append_or_set(html_uid, "class", gplx.xowa.htmls.core.wkrs.lnkis.htmls.Xoh_redlink_utl.New_str);}
private void Html_doc_atr_append_or_set(String elem_id, String atr_key, String atr_val) {
GfoMsg m = GfoMsg_.new_cast_(Invk_html_doc_atr_append_or_set).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val);
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_doc_atr_append_or_set, m);
Gfo_invk_.Invk_by_msg(cmd_sync, Invk_html_doc_atr_append_or_set, m);
}
public void Html_elem_replace_html(String id, String html) {
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);
Gfo_invk_.Invk_by_msg(cmd_sync, Invk_html_elem_replace_html, m);
}
}
public void Html_elem_append_above(String id, String html) {
synchronized (thread_lock) { // needed for Special:Search and async; DATE:2015-04-23
GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_append_above).Add("id", id).Add("html", html);
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_append_above, m);
Gfo_invk_.Invk_by_msg(cmd_sync, Invk_html_elem_append_above, m);
}
}
public void Html_gallery_packed_exec() {
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);
Gfo_invk_.Invk_by_msg(cmd_sync, Invk_html_gallery_packed_exec, m);
module_packed_done = true;
}
public void Html_popups_bind_hover_to_doc() {
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);
Gfo_invk_.Invk_by_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;
@@ -149,7 +150,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
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);}
public void Scroll_page_by_bmk_gui() {Gfo_invk_.Invk_by_key(cmd_async, Invk_scroll_page_by_bmk);}
private void Scroll_page_by_bmk() {
if (!String_.Eq(owner_tab.Tab_key(), owner_tab.Tab_mgr().Active_tab().Tab_key())) return; // only set html page position on active tab; otherwise, page "scrolls down" mysteriously on unseen tab; DATE:2014-05-02
String html_doc_pos = owner_tab.Page().Html_data().Bmk_pos();
@@ -168,7 +169,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_set, node_path.Val(), scroll_top.Val());
}
}
public void Scroll_page_by_id_gui(String id) {GfoInvkAble_.InvkCmd_val(cmd_async, Invk_scroll_page_by_id, id);}
public void Scroll_page_by_id_gui(String id) {Gfo_invk_.Invk_by_val(cmd_async, Invk_scroll_page_by_id, id);}
private boolean Scroll_page_by_id(String id) {
return (id == null)
? false
@@ -200,7 +201,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
else if (ctx.Match(k, Invk_scroll_page_by_id)) Scroll_page_by_id(m.ReadStr("v"));
else if (ctx.Match(k, Invk_html_elem_focus)) html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__elem_focus, m.ReadStr("v"));
else if (ctx.Match(k, GfuiElemKeys.Evt_menu_detected)) When_menu_detected();
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String

View File

@@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.xowa.guis.views.*;
public class Xog_layout implements GfoInvkAble {
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.gfui.controls.elems.*; import gplx.gfui.controls.standards.*; import gplx.xowa.guis.views.*;
public class Xog_layout implements Gfo_invk {
public Xog_layout() {
go_bwd_btn.Owner_(this);
go_fwd_btn.Owner_(this);
@@ -102,7 +102,7 @@ public class Xog_layout implements GfoInvkAble {
else if (ctx.Match(k, Invk_prog_box)) return prog_box;
else if (ctx.Match(k, Invk_note_box)) return note_box;
else if (ctx.Match(k, Invk_main_win)) return main_win;
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
}
static final String Invk_coord_mode_ = "coord_mode_", Invk_go_fwd_btn = "go_fwd_btn", Invk_go_bwd_btn = "go_bwd_btn", Invk_url_box = "url_box", Invk_search_box = "search_box", Invk_html_box = "html_box", Invk_find_box = "find_box", Invk_prog_box = "prog_box", Invk_note_box = "note_box"
, Invk_main_win = "main_win", Invk_find_fwd_btn = "find_fwd_btn", Invk_find_bwd_btn = "find_bwd_btn", Invk_url_exec_btn = "url_exec_btn", Invk_search_exec_btn = "search_exec_btn", Invk_find_close_btn = "find_close_btn";

View File

@@ -16,9 +16,9 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*;
public class Xog_layout_box implements GfoInvkAble {
public GfoInvkAble Owner() {return owner;} public Xog_layout_box Owner_(GfoInvkAble v) {owner = v; return this;} GfoInvkAble owner;
import gplx.gfui.*; import gplx.gfui.draws.*; import gplx.gfui.controls.elems.*;
public class Xog_layout_box implements Gfo_invk {
public Gfo_invk Owner() {return owner;} public Xog_layout_box Owner_(Gfo_invk v) {owner = v; return this;} Gfo_invk owner;
public int X_abs() {return x_abs;} public Xog_layout_box X_abs_(int v) {x_abs = v; return this;} private int x_abs = Int_.Min_value;
public int Y_abs() {return y_abs;} public Xog_layout_box Y_abs_(int v) {y_abs = v; return this;} private int y_abs = Int_.Min_value;
public int W_abs() {return w_abs;} public Xog_layout_box W_abs_(int v) {w_abs = v; return this;} private int w_abs = Int_.Min_value;
@@ -66,7 +66,7 @@ public class Xog_layout_box implements GfoInvkAble {
else if (ctx.Match(k, Invk_font_style_)) font_style = FontStyleAdp_.parse(m.ReadStr("v"));
else if (ctx.Match(k, Invk_mode_)) mode = String_.Eq(m.ReadStr("v"), "abs") ? Mode_abs : Mode_rel;
else if (ctx.Match(k, Invk_owner)) return owner;
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static final byte Mode_abs = 0, Mode_rel = 1;

View File

@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_tab_close_mgr {
private List_adp list = List_adp_.new_();
private List_adp list = List_adp_.New();
public void Clear() {list.Clear();}
public void Add(Xog_tab_close_lnr lnr) {list.Add(lnr);}
public int Len() {return list.Count();}

View File

@@ -16,12 +16,14 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.threads.*; import gplx.core.envs.*; import gplx.gfui.*; import gplx.xowa.guis.history.*; import gplx.xowa.guis.bnds.*;
import gplx.core.threads.*; import gplx.core.envs.*;
import gplx.gfui.*; import gplx.gfui.ipts.*; import gplx.gfui.kits.core.*; import gplx.gfui.controls.elems.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.guis.history.*; import gplx.xowa.guis.bnds.*;
import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*;
import gplx.xowa.langs.vnts.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.apps.cfgs.old.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.skins.*;
public class Xog_tab_itm implements GfoInvkAble {
public class Xog_tab_itm implements Gfo_invk {
private Xog_win_itm win; private Xocfg_tab_mgr cfg_tab_mgr;
public Xog_tab_itm(Xog_tab_mgr tab_mgr, Gfui_tab_itm_data tab_data, Xowe_wiki wiki, Xoae_page page) {
this.tab_mgr = tab_mgr; this.tab_data = tab_data; this.wiki = wiki; this.page = page;
@@ -30,7 +32,7 @@ public class Xog_tab_itm implements GfoInvkAble {
cmd_sync = win.Kit().New_cmd_sync(this);
}
public Xowe_wiki Wiki() {return wiki;} public void Wiki_(Xowe_wiki v) {this.wiki = v;} private Xowe_wiki wiki;
public GfoInvkAble Cmd_sync() {return cmd_sync;} private GfoInvkAble cmd_sync;
public Gfo_invk Cmd_sync() {return cmd_sync;} private Gfo_invk cmd_sync;
public void Make_html_box(int uid, Gfui_tab_itm tab_box, Xog_win_itm win, GfuiElem owner) {
this.tab_box = tab_box;
Xoae_app app = win.App(); Xoa_gui_mgr gui_mgr = win.Gui_mgr(); Gfui_kit kit = win.Kit();
@@ -42,7 +44,7 @@ public class Xog_tab_itm implements GfoInvkAble {
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);
IptBnd_.cmd_to_(IptCfg_.Null, html_box, win, Xog_win_itm.Invk_exit, IptKey_.add_(IptKey_.Alt, IptKey_.F4)); // WORKAROUND:SWT: xulrunner_v24 no longer sends Alt+F4 to SwtShell; must manually subscribe it to quit; DATE:2015-07-31
GfoEvMgr_.SubSame(html_box, GfuiElemKeys.Evt_menu_detected, html_itm);
Gfo_evt_mgr_.Sub_same(html_box, GfuiElemKeys.Evt_menu_detected, html_itm);
gui_mgr.Bnd_mgr().Bind(Xog_bnd_box_.Tid_browser_html, html_box);
if (!Env_.Mode_testing())
kit.Set_mnu_popup(html_box, gui_mgr.Menu_mgr().Popup().Html_page().Under_mnu());
@@ -76,9 +78,12 @@ public class Xog_tab_itm implements GfoInvkAble {
public Xog_html_itm Html_itm() {return html_itm;} private Xog_html_itm html_itm;
public Gfui_html Html_box() {return html_itm.Html_box();}
public Xoae_page Page() {return page;}
public void Page_(Xoae_page page) {
this.page = page;
public void Page_ref_(Xoae_page v) {
this.page = v;
this.wiki = page.Wikie(); // NOTE: must update wiki else back doesn't work; DATE:2015-03-05
}
public void Page_(Xoae_page page) {
Page_ref_(page);
this.Page_update_ui(); // force tab button to update when page changes
} private Xoae_page page;
public void Page_update_ui() {
@@ -171,7 +176,7 @@ public class Xog_tab_itm implements GfoInvkAble {
// html_itm.Html_box().Size_(tab_mgr.Tab_mgr().Size()); // COMMENTED: causes clicks on macosx to be off by 4 px; 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()) {
if (page.Html_data().Hdump_exists()) {
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__orig_mgr(), fsdb_mgr.Bin_mgr(), fsdb_mgr.Mnt_mgr(), app.Usere().User_db_mgr().Cache_mgr(), wiki.File__repo_mgr(), html_itm, page, page.Hdump_data().Imgs());
@@ -257,8 +262,8 @@ 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.Usere().Cfg_mgr().Log_mgr().Log_redlinks());
Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_page_redlink, redlinks_wkr, gplx.xowa.parsers.lnkis.redlinks.Xog_redlink_mgr.Invk_run).Start();
Xog_redlink_mgr redlinks_wkr = new Xog_redlink_mgr(page);
Thread_adp_.Start_by_key(gplx.xowa.apps.Xoa_thread_.Key_page_redlink, redlinks_wkr, gplx.xowa.parsers.lnkis.redlinks.Xog_redlink_mgr.Invk_run);
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_full(e));}
@@ -270,7 +275,7 @@ public class Xog_tab_itm implements GfoInvkAble {
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_show_url_loaded_swt)) this.Show_url_loaded((Load_page_wkr)m.ReadObj("v"));
else if (ctx.Match(k, Invk_show_url_failed_swt)) this.Show_url_failed((Load_page_wkr)m.ReadObj("v"));
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static final String Invk_show_url_loaded_swt = "show_url_loaded_swt", Invk_show_url_failed_swt = "show_url_failed_swt";
@@ -278,9 +283,9 @@ public class Xog_tab_itm implements GfoInvkAble {
class Load_files_wkr implements Gfo_thread_wkr {
private Xog_tab_itm tab;
public Load_files_wkr(Xog_tab_itm tab) {this.tab = tab;}
public String Name() {return "xowa.load_files_wkr";}
public boolean Resume() {return true;}
public void Exec() {
public String Thread__name() {return "xowa.load_files_wkr";}
public boolean Thread__resume() {return true;}
public void Thread__exec() {
try {tab.Async();}
catch (Exception e) {
tab.Tab_mgr().Win().App().Usr_dlg().Warn_many("error while running file wkr; page=~{0} err=~{1}", tab.Page().Url().To_str(), Err_.Message_gplx_full(e));

View File

@@ -26,5 +26,5 @@ public class Xog_tab_itm_ {
return max == Tab_name_max_disabled || name_len <= max ? name : String_.Mid(name, 0, max) + "...";
}
public static final int Tab_name_min_disabled = -1, Tab_name_max_disabled = -1;
public static final Xog_tab_itm Null = null;
public static final Xog_tab_itm Null = null;
}

View File

@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.wikis.pages.*;
import gplx.gfui.*; import gplx.gfui.controls.standards.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.wikis.pages.*;
import gplx.xowa.wikis.nss.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*;
public class Xog_tab_itm_edit_mgr {
@@ -61,7 +61,7 @@ public class Xog_tab_itm_edit_mgr {
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_m001();
Xoh_page_wtr_wkr wkr = wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_page_.Tid_read);
wkr.Write_body(tmp_bfr, Xoh_wtr_ctx.Basic, new_page);
wkr.Write_body(tmp_bfr, wiki.Parser_mgr().Ctx(), Xoh_wtr_ctx.Basic, new_page);
byte[] new_html = tmp_bfr.To_bry_and_rls();
new_page.Html_data().Edit_preview_(new_html);
@@ -100,7 +100,7 @@ public class Xog_tab_itm_edit_mgr {
public static void Debug(Xog_win_itm win, byte view_tid) {
Xog_tab_itm tab = win.Tab_mgr().Active_tab(); Xoae_page page = tab.Page();
Xowe_wiki wiki = tab.Wiki(); Xop_ctx ctx = wiki.Parser_mgr().Ctx();
ctx.Defn_trace().Clear(); // TODO: move_me
ctx.Defn_trace().Clear(); // TODO_OLD: move_me
ctx.Defn_trace_(Xot_defn_trace_dbg.Instance);
Xoa_ttl ttl = page.Ttl();
Xoae_page new_page = Xoae_page.New(wiki, ttl);

View File

@@ -17,10 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.threads.*;
import gplx.gfui.*; import gplx.xowa.guis.langs.*; import gplx.xowa.guis.history.*;
import gplx.gfui.*; import gplx.gfui.controls.standards.*; import gplx.xowa.guis.langs.*; import gplx.xowa.guis.history.*;
import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.wikis.pages.*;
public class Xog_tab_itm_read_mgr {
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) {
if (reset_to_read) tab.View_mode_(Xopg_page_.Tid_read);
@@ -36,7 +35,7 @@ public class Xog_tab_itm_read_mgr {
try {tab.Html_itm().Show(new_page);}
catch (Exception e) {
if (String_.Eq(Err_.Message_lang(e), "class org.eclipse.swt.SWTException Widget is disposed")) return; // ignore errors caused by user closing tab early; DATE:2014-07-26
if (show_is_err) { // trying to show error page, but failed; don't show again, else recursion until out of memory; TODO:always load error page; no reason it should fail; WHEN:html_skin; DATE:2014-06-08
if (show_is_err) { // trying to show error page, but failed; don't show again, else recursion until out of memory; TODO_OLD:always load error page; no reason it should fail; WHEN:html_skin; DATE:2014-06-08
Gfo_usr_dlg_.Instance.Warn_many("", "", "fatal error trying to load error page; page=~{0} err=~{1}" + new_page.Url().To_str(), Err_.Message_gplx_full(e));
return;
}
@@ -56,7 +55,7 @@ public class Xog_tab_itm_read_mgr {
if (tab.View_mode() == Xopg_page_.Tid_read)
html_itm.Scroll_page_by_bmk_gui();
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
Gfo_invk_.Invk_by_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(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) {
@@ -73,7 +72,7 @@ public class Xog_tab_itm_read_mgr {
String err_msg = String_.Format("page_load fail: page={0} err={1}", String_.new_u8(url.Raw()), Err_.Message_gplx_full(e));
win.Usr_dlg().Warn_many("", "", err_msg);
win.App().Log_wtr().Queue_enabled_(false);
Xoae_page fail_page = wiki.Data_mgr().Get_page(ttl, false);
Xoae_page fail_page = wiki.Data_mgr().Load_page_by_ttl(ttl);
tab.View_mode_(Xopg_page_.Tid_edit);
Update_selected_tab(win, url, ttl);
Show_page(tab, fail_page, false, false, true, Xog_history_stack.Nav_fwd);

View File

@@ -16,15 +16,16 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.xowa.apps.cfgs.old.*; import gplx.xowa.apps.apis.xowa.gui.browsers.*; import gplx.xowa.specials.*;
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.gfui.draws.*; import gplx.gfui.controls.gxws.*; import gplx.gfui.controls.tabs.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.apps.cfgs.old.*; import gplx.xowa.apps.apis.xowa.gui.browsers.*; import gplx.xowa.specials.*;
import gplx.xowa.apps.urls.*;
public class Xog_tab_mgr implements GfoEvObj {
public class Xog_tab_mgr implements Gfo_evt_itm {
private Ordered_hash tab_regy = Ordered_hash_.New(); private int tab_uid = 0;
public Xog_tab_mgr(Xog_win_itm win) {
this.win = win;
ev_mgr = GfoEvMgr.new_(this);
ev_mgr = new Gfo_evt_mgr(this);
}
public GfoEvMgr EvMgr() {return ev_mgr;} private GfoEvMgr ev_mgr;
public Gfo_evt_mgr Evt_mgr() {return ev_mgr;} private Gfo_evt_mgr ev_mgr;
public Xog_win_itm Win() {return win;} private Xog_win_itm win;
public Gfui_tab_mgr Tab_mgr() {return tab_mgr;} private Gfui_tab_mgr tab_mgr;
public byte Html_load_tid() {return html_load_tid;} private byte html_load_tid;
@@ -34,21 +35,21 @@ public class Xog_tab_mgr implements GfoEvObj {
active_tab = Xog_tab_itm_.Null;
tab_mgr.Btns_selected_color_(ColorAdp_.White);
tab_mgr.Btns_unselected_color_(ColorAdp_.LightGray);
GfoEvMgr_.SubSame_many(tab_mgr, this, Gfui_tab_mgr.Evt_tab_selected, Gfui_tab_mgr.Evt_tab_closed, Gfui_tab_mgr.Evt_tab_switched);
Gfo_evt_mgr_.Sub_same_many(tab_mgr, this, Gfui_tab_mgr.Evt_tab_selected, Gfui_tab_mgr.Evt_tab_closed, Gfui_tab_mgr.Evt_tab_switched);
Xocfg_tab_btn_mgr btn_mgr = win.App().Cfg_regy().App().Gui_mgr().Tab_mgr().Btn_mgr();
Btns_place_on_top_(btn_mgr.Place_on_top());
Btns_curved_(btn_mgr.Curved());
Btns_close_visible_(btn_mgr.Close_visible());
Btns_unselected_close_visible_(btn_mgr.Unselected_close_visible());
Btns_height_(btn_mgr.Height());
GfoEvMgr_.SubSame_many(btn_mgr, this
Gfo_evt_mgr_.Sub_same_many(btn_mgr, this
, Xocfg_tab_btn_mgr.Evt_place_on_top_changed, Xocfg_tab_btn_mgr.Evt_height_changed, Xocfg_tab_btn_mgr.Evt_curved_changed
, Xocfg_tab_btn_mgr.Evt_close_visible_changed, Xocfg_tab_btn_mgr.Evt_unselected_close_visible_changed
, Xocfg_tab_btn_mgr.Evt_text_min_chars_changed, Xocfg_tab_btn_mgr.Evt_text_max_chars_changed
, Xocfg_tab_btn_mgr.Evt_hide_if_one_changed
);
html_load_tid = win.App().Api_root().Gui().Browser().Html().Load_tid();
GfoEvMgr_.SubSame_many(win.App().Api_root().Gui().Browser().Html(), this
Gfo_evt_mgr_.Sub_same_many(win.App().Api_root().Gui().Browser().Html(), this
, Xoapi_html_box.Evt_load_tid_changed
);
}
@@ -77,7 +78,7 @@ public class Xog_tab_mgr implements GfoEvObj {
public Xog_tab_itm Tabs_new_dflt(boolean focus) {
boolean active_tab_is_null = this.Active_tab_is_null();
Xowe_wiki cur_wiki = active_tab_is_null ? win.App().Usere().Wiki() : active_tab.Wiki();
Xoa_ttl ttl = Xoa_ttl.parse(cur_wiki, Xows_special_meta_.Itm__default_tab.Ttl_bry());
Xoa_ttl ttl = Xoa_ttl.parse(cur_wiki, Xow_special_meta_.Itm__default_tab.Ttl_bry());
Xoa_url url = cur_wiki.Utl__url_parser().Parse_by_urlbar_or_null(ttl.Full_db_as_str()); if (url == null) throw Err_.new_("url", "invalid url", "url", url);
Xog_tab_itm rv = Tabs_new(focus, active_tab_is_null, cur_wiki, Xoae_page.New(cur_wiki, ttl));
rv.Page_update_ui();
@@ -158,7 +159,7 @@ public class Xog_tab_mgr implements GfoEvObj {
Tabs_new_dflt(true);
win.Page__navigate_by_url_bar(url);
}
private List_adp closed_undo_list = List_adp_.new_();
private List_adp closed_undo_list = List_adp_.New();
private void Tabs_closed(String key) {
Xog_tab_itm itm = Tabs_get_by_key_or_warn(key); if (itm == null) return;
itm.Html_box().Html_dispose();
@@ -208,7 +209,7 @@ public class Xog_tab_mgr implements GfoEvObj {
src_itm.Switch_mem(trg_itm);
active_tab = trg_itm; // NOTE: src_itm initiated switch, but trg_itm is now active b/c everything in src_itm has now been reparented to trg_itm; DATE:2014-05-12
}
public void Tabs_new_link(boolean focus, String link) {
public void Tabs_new_link(boolean focus, String link) { // handle empty link
if (String_.Len_eq_0(link)) {
if (this.Active_tab_is_null()) return;
link = active_tab.Html_itm().Html_selected_get_active_or_selection();
@@ -256,7 +257,7 @@ public class Xog_tab_mgr implements GfoEvObj {
else if (ctx.Match(k, Xocfg_tab_btn_mgr.Evt_text_min_chars_changed)) Btns_text_recalc();
else if (ctx.Match(k, Xocfg_tab_btn_mgr.Evt_text_max_chars_changed)) Btns_text_recalc();
else if (ctx.Match(k, Xoapi_html_box.Evt_load_tid_changed)) html_load_tid = m.ReadByte("v");
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static final String

View File

@@ -17,13 +17,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.threads.*; import gplx.core.envs.*;
import gplx.gfui.*; import gplx.xowa.guis.*; import gplx.xowa.guis.history.*; import gplx.xowa.guis.langs.*; import gplx.xowa.guis.urls.*; import gplx.xowa.guis.views.*;
import gplx.gfui.*; import gplx.gfui.draws.*; import gplx.gfui.kits.core.*; import gplx.gfui.controls.windows.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.guis.*; import gplx.xowa.guis.history.*; import gplx.xowa.guis.langs.*; import gplx.xowa.guis.urls.*; import gplx.xowa.guis.views.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.apps.urls.*; import gplx.xowa.files.*;
import gplx.xowa.htmls.hrefs.*;
import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.specials.*; import gplx.xowa.xtns.math.*;
public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
private GfoInvkAble sync_cmd;
public class Xog_win_itm implements Gfo_invk, Gfo_evt_itm {
private Gfo_invk sync_cmd;
private Xog_url_box__selection_changed url_box__selection_changed;
public Xog_win_itm(Xoae_app app, Xoa_gui_mgr gui_mgr) {
this.app = app; this.gui_mgr = gui_mgr;
@@ -44,7 +45,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
public GfuiBtn Find_bwd_btn() {return find_bwd_btn;} private GfuiBtn find_bwd_btn;
public GfuiTextBox Prog_box() {return prog_box;} private GfuiTextBox prog_box;
public GfuiTextBox Info_box() {return info_box;} private GfuiTextBox info_box;
public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} private GfoEvMgr evMgr;
public Gfo_evt_mgr Evt_mgr() {if (evt_mgr == null) evt_mgr = new Gfo_evt_mgr(this); return evt_mgr;} private Gfo_evt_mgr evt_mgr;
public Xoae_app App() {return app;} private Xoae_app app;
public Xog_tab_mgr Tab_mgr() {return tab_mgr;} private Xog_tab_mgr tab_mgr;
public Xog_tab_itm Active_tab() {return tab_mgr.Active_tab();}
@@ -66,7 +67,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
else if (ctx.Match(k, Gfui_html.Evt_location_changing)) Page__navigate_by_href(tab_mgr.Active_tab(), Xoh_href_gui_utl.Standardize_xowa_link(m.ReadStr("v")));
else if (ctx.Match(k, Gfui_html.Evt_win_resized)) Refresh_win_size();
else if (ctx.Match(k, Invk_page_refresh)) Page__refresh();
else if (ctx.Match(k, Invk_page_async_exec)) Xog_tab_itm_read_mgr.Async((Xog_tab_itm)m.ReadObj("v"));
else if (ctx.Match(k, Invk_page_async_exec)) ((Xog_tab_itm)m.ReadObj("v")).Async();
else if (ctx.Match(k, Invk_page_view_read)) Page__mode_(Xopg_page_.Tid_read);
else if (ctx.Match(k, Invk_page_view_edit)) Page__mode_(Xopg_page_.Tid_edit);
else if (ctx.Match(k, Invk_page_view_html)) Page__mode_(Xopg_page_.Tid_html);
@@ -91,7 +92,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
else if (ctx.Match(k, Invk_page)) return this.Active_page();
else if (ctx.Match(k, Invk_wiki)) return this.Active_tab().Wiki();
else if (ctx.Match(k, Invk_exit)) App__exit();
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String
@@ -187,7 +188,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
Xoae_page new_page = tab.History_mgr().Go_by_dir(cur_wiki, fwd);
if (new_page.Missing()) return;
if (new_page.Ttl().Ns().Id_is_special()) // if Special, reload page; needed for Special:Search (DATE:2015-04-19; async loading) and Special:XowaBookmarks DATE:2015-10-05
new_page = new_page.Wikie().Data_mgr().Load_page_by_ttl(new_page.Url(), new_page.Ttl()); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save
new_page = new_page.Wikie().Data_mgr().Load_page_and_parse(new_page.Url(), new_page.Ttl()); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save
byte history_nav_type = fwd ? Xog_history_stack.Nav_fwd : Xog_history_stack.Nav_bwd;
boolean new_page_is_same = Bry_.Eq(cur_page.Ttl().Full_txt_by_orig(), new_page.Ttl().Full_txt_by_orig());
Xog_tab_itm_read_mgr.Show_page(tab, new_page, true, new_page_is_same, false, history_nav_type);
@@ -211,25 +212,26 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
Page__async__bgn(tab);
}
public void Page__async__bgn(Xog_tab_itm tab) {
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;
page__async__thread = Thread_adp_.Start_by_val(gplx.xowa.apps.Xoa_thread_.Key_page_async, this, Invk_page_async_exec, tab);
page__async__thread.Thread__start();
} private Thread_adp page__async__thread = Thread_adp.Noop;
public boolean Page__async__working(Xoa_url url) {
if (page__async__thread.IsAlive()) { // cancel pending image downloads
if (page__async__thread.Thread__is_alive()) { // cancel pending image downloads
page__async__restart_url = url;
this.Usr_dlg().Canceled_y_();
app.Wmf_mgr().Download_wkr().Download_xrg().Prog_cancel_y_();
Thread_adp_.invk_(this, Invk_page_async_cancel_wait).Start();
Thread_adp_.Start_by_key(Invk_page_async_cancel_wait, this, Invk_page_async_cancel_wait);
return true;
}
return false;
}
private void Page__async__cancel__wait() {
while (page__async__thread.IsAlive()) {
while (page__async__thread.Thread__is_alive()) {
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
GfoInvkAble_.InvkCmd(sync_cmd, Invk_page_async_restart);
Gfo_invk_.Invk_by_key(sync_cmd, Invk_page_async_restart);
}
private void Page__async__restart() {
tab_mgr.Active_tab().Show_url_bgn(page__async__restart_url);
@@ -256,7 +258,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
Xoa_url url = home_wiki.Utl__url_parser().Parse_by_urlbar_or_null(url_str); if (url == null) return Bry_.Empty;
Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(url.Wiki_bry());
Xoa_ttl ttl = Xoa_ttl.parse(wiki, url.Page_bry());
Xoae_page new_page = wiki.Data_mgr().Load_page_by_ttl(url, ttl);
Xoae_page new_page = wiki.Data_mgr().Load_page_and_parse(url, ttl);
if (new_page.Missing()) {return Bry_.Empty;}
gplx.xowa.apps.servers.Gxw_html_server.Assert_tab(app, new_page); // HACK: assert at least 1 tab for Firefox addon; DATE:2015-01-23
Xog_tab_itm tab = tab_mgr.Active_tab();
@@ -291,12 +293,12 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
tab_mgr.Init_by_kit(kit);
this.Lang_changed(app.Usere().Lang());
GfoEvMgr_.SubSame_many(this, this, Gfui_html.Evt_location_changed, Gfui_html.Evt_location_changing, Gfui_html.Evt_link_hover);
GfoEvMgr_.SubSame(win_box, Gfui_html.Evt_win_resized, this);
GfoEvMgr_.Sub(app.Gui_mgr().Win_cfg().Font(), Xol_font_info.Font_changed, this, Invk_window_font_changed);
Gfo_evt_mgr_.Sub_same_many(this, this, Gfui_html.Evt_location_changed, Gfui_html.Evt_location_changing, Gfui_html.Evt_link_hover);
Gfo_evt_mgr_.Sub_same(win_box, Gfui_html.Evt_win_resized, this);
Gfo_evt_mgr_.Sub(app.Gui_mgr().Win_cfg().Font(), Xol_font_info.Font_changed, this, Invk_window_font_changed);
url_box__selection_changed = new Xog_url_box__selection_changed(app, url_box);
GfoEvMgr_.SubSame(url_box, GfuiComboBox.Evt__selected_changed, url_box__selection_changed);
GfoEvMgr_.SubSame(url_box, GfuiComboBox.Evt__selected_accepted, url_box__selection_changed);
Gfo_evt_mgr_.Sub_same(url_box, GfuiComboBox.Evt__selected_changed, url_box__selection_changed);
Gfo_evt_mgr_.Sub_same(url_box, GfuiComboBox.Evt__selected_accepted, url_box__selection_changed);
if ( !Env_.Mode_testing()
&& app.Mode().Tid_is_gui()) // only run for gui; do not run for tcp/http server; DATE:2014-05-03
@@ -304,18 +306,18 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
}
public static String Remove_redirect_if_exists(String text) {
// remove redirect target; EX: "A -> B" -> "A"
int redirect_pos = String_.FindFwd(text, gplx.xowa.addons.apps.searchs.searchers.rslts.Srch_rslt_row.Str__redirect__text);
int redirect_pos = String_.FindFwd(text, gplx.xowa.addons.wikis.searchs.searchers.rslts.Srch_rslt_row.Str__redirect__text);
if (redirect_pos != Bry_find_.Not_found) {
text = String_.Mid(text, 0, redirect_pos);
}
return text;
}
}
class Xog_url_box__selection_changed implements GfoEvObj {
class Xog_url_box__selection_changed implements Gfo_evt_itm {
private final GfuiComboBox url_box;
private final Xoae_app app;
public Xog_url_box__selection_changed(Xoae_app app, GfuiComboBox url_box) {this.app = app; this.url_box = url_box; this.ev_mgr = GfoEvMgr.new_(this);}
public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr;
public Xog_url_box__selection_changed(Xoae_app app, GfuiComboBox url_box) {this.app = app; this.url_box = url_box; this.ev_mgr = new Gfo_evt_mgr(this);}
public Gfo_evt_mgr Evt_mgr() {return ev_mgr;} private final Gfo_evt_mgr ev_mgr;
private void On_selection_changed() {
String text = url_box.Text();
text = Xog_win_itm.Remove_redirect_if_exists(text);
@@ -329,7 +331,7 @@ class Xog_url_box__selection_changed implements GfoEvObj {
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, GfuiComboBox.Evt__selected_changed)) On_selection_changed();
else if (ctx.Match(k, GfuiComboBox.Evt__selected_accepted)) On_selection_accepted();
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
return this;
}
}

View File

@@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.xowa.guis.bnds.*; import gplx.xowa.guis.cmds.*;
import gplx.gfui.*; import gplx.gfui.draws.*; import gplx.gfui.kits.core.*; import gplx.gfui.imgs.*; import gplx.gfui.controls.windows.*; import gplx.gfui.controls.elems.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.guis.bnds.*; import gplx.xowa.guis.cmds.*;
import gplx.xowa.guis.langs.*;
public class Xog_win_itm_ {
public static void Show_win(Xog_win_itm win) {

View File

@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.xowa.htmls.hrefs.*;
import gplx.gfui.*; import gplx.gfui.controls.standards.*; import gplx.xowa.htmls.hrefs.*;
public class Xog_win_itm__prog_href_mgr {
public static void Print(Xog_win_itm win) { // PURPOSE: print href in prog box when in content editable mode
String href = win.Active_html_box().Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, Gfui_html.Atr_href, "");// get selected href from html_box

View File

@@ -23,7 +23,7 @@ import java.io.IOException;
import java.net.*;
import java.awt.*; import java.awt.event.*;
import javax.swing.*;
public class Xog_error_win extends JFrame implements GfoInvkAble {
public class Xog_error_win extends JFrame implements Gfo_invk {
private Xog_error_data error_data;
public Xog_error_win(Xog_error_data error_data) {
super("XOWA Error");
@@ -64,11 +64,11 @@ public class Xog_error_win extends JFrame implements GfoInvkAble {
text_scroll_pane.setLocation(10, 10);
return text_scroll_pane;
}
private static JLabel new_link_lbl(GfoInvkAble invk, JPanel owner, int x, int y, String invk_cmd, String text) {
private static JLabel new_link_lbl(Gfo_invk invk, JPanel owner, int x, int y, String invk_cmd, String text) {
JLabel rv = new JLabel();
rv.setText(text);
rv.setCursor(new Cursor(Cursor.HAND_CURSOR));
rv.addMouseListener(new Swing_mouse_adapter(GfoInvkAbleCmd.new_(invk, invk_cmd)));
rv.addMouseListener(new Swing_mouse_adapter(Gfo_invk_cmd.New_by_key(invk, invk_cmd)));
rv.setLocation(x, y);
rv.setSize(80, 20);
owner.add(rv);
@@ -90,7 +90,7 @@ public class Xog_error_win extends JFrame implements GfoInvkAble {
} catch (URISyntaxException | IOException ex) {
}
}
else return GfoInvkAble_.Rv_unhandled;
else return Gfo_invk_.Rv_unhandled;
return this;
} private static final String Invk_send_mail = "send_mail", Invk_open_site = "open_site";
public static void Run(String err_msg, String err_trace) {
@@ -103,10 +103,10 @@ public class Xog_error_win extends JFrame implements GfoInvkAble {
}
}
class Swing_mouse_adapter extends MouseAdapter {
private final GfoInvkAbleCmd cmd;
public Swing_mouse_adapter(GfoInvkAbleCmd cmd) {this.cmd = cmd;}
private final Gfo_invk_cmd cmd;
public Swing_mouse_adapter(Gfo_invk_cmd cmd) {this.cmd = cmd;}
@Override public void mouseClicked(MouseEvent ev) {
try {cmd.Invk();}
try {cmd.Exec();}
catch (Exception e) {
System.out.println(Err_.Message_gplx_full(e));
}