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

Source: Restore broken commit

This commit is contained in:
gnosygnu
2017-02-06 22:14:55 -05:00
parent 938beac9f9
commit 3bfeb94b43
4380 changed files with 328018 additions and 0 deletions

View File

@@ -0,0 +1,145 @@
/*
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; import gplx.*; import gplx.xowa.*;
import gplx.core.brys.fmtrs.*; import gplx.core.envs.*;
import gplx.gfui.*; import gplx.gfui.ipts.*; import gplx.gfui.kits.core.*; import gplx.gfui.controls.windows.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.guis.menus.*; import gplx.xowa.guis.cmds.*; import gplx.xowa.apps.cfgs.*; import gplx.xowa.users.*;
import gplx.xowa.langs.*;
import gplx.xowa.guis.bnds.*; import gplx.xowa.guis.views.*; import gplx.xowa.guis.urls.url_macros.*; import gplx.xowa.addons.wikis.searchs.gui.htmlbars.*;
import gplx.xowa.guis.views.boots.*;
public class Xoa_gui_mgr implements Gfo_evt_itm, Gfo_invk {
public Xoa_gui_mgr(Xoae_app app) {
this.ev_mgr = new Gfo_evt_mgr(this);
this.app = app;
this.browser_win = new Xog_win_itm(app, this);
bnd_mgr = new Xog_bnd_mgr(browser_win);
html_mgr = new Xog_html_mgr(app);
menu_mgr = new Xog_menu_mgr(this);
}
public Gfo_evt_mgr Evt_mgr() {return ev_mgr;} private Gfo_evt_mgr ev_mgr;
public Xoae_app App() {return app;} private Xoae_app app;
public Xog_win_itm Browser_win() {return browser_win;} private final Xog_win_itm browser_win;
public IptCfgRegy Ipt_cfgs() {return ipt_cfgs;} IptCfgRegy ipt_cfgs = new IptCfgRegy();
public Xog_bnd_mgr Bnd_mgr() {return bnd_mgr;} private Xog_bnd_mgr bnd_mgr;
public Gfui_kit Kit() {return kit;} private Gfui_kit kit = Gfui_kit_.Mem();
public Xog_cmd_mgr Cmd_mgr() {return cmd_mgr;} private Xog_cmd_mgr cmd_mgr = new Xog_cmd_mgr();
public Xocfg_win Win_cfg() {return win_cfg;} private Xocfg_win win_cfg = new Xocfg_win();
public Xog_layout Layout() {return layout;} private Xog_layout layout = new Xog_layout();
public Xog_html_mgr Html_mgr() {return html_mgr;} private Xog_html_mgr html_mgr;
public Xog_menu_mgr Menu_mgr() {return menu_mgr;} private Xog_menu_mgr menu_mgr;
public Xog_url_macro_mgr Url_macro_mgr() {return url_macro_mgr;} private Xog_url_macro_mgr url_macro_mgr = new Xog_url_macro_mgr();
public void Show_prog() {
GfuiWin memo_win = kit.New_win_utl("memo_win", browser_win.Win_box());
GfuiTextBox memo_txt = kit.New_text_box("memo_txt", memo_win, Keyval_.new_(GfuiTextBox_.Ctor_Memo, true));
RectAdp prog_box_rect = browser_win.Prog_box().Rect();
memo_win.Rect_set(RectAdp_.new_(prog_box_rect.X(), prog_box_rect.Y() - 75, prog_box_rect.Width(), 100));
memo_txt.Size_(memo_win.Size().Op_add(-8, -30));
memo_txt.Text_(String_.Concat_lines_nl(browser_win.Usr_dlg().Gui_wkr().Prog_msgs().Xto_str_ary()));
memo_win.Show();
memo_win.Focus();
}
public void Init_by_app() {
layout_Init();
bnd_mgr.Init();
menu_mgr.Init_by_app(app);
if (app.Mode().Tid_is_gui()) {
app.Gui__cbk_mgr().Reg(new gplx.xowa.guis.cbks.swts.Xog_cbk_wkr__swt(this));
Gfo_log_.Instance__set(new gplx.xowa.guis.cbks.swts.Gfo_log__swt(app.Gui__cbk_mgr()
, Gfo_log_.New_url(app.Fsys_mgr().Root_dir().GenSubDir_nest("user", "anonymous", "app", "tmp", "xolog"))
, new gplx.core.logs.Gfo_log_itm_wtr__csv()));
}
win_cfg.Init_by_app(app);
}
public void Kit_(Gfui_kit kit) {
this.kit = kit;
kit.Kit_init(browser_win.Usr_dlg());
kit.Kit_term_cbk_(Gfo_invk_cmd.New_by_key(app, Xoae_app.Invk_term_cbk));
browser_win.Init_by_kit(kit);
layout.Init(browser_win);
cmd_mgr.Init_by_kit(app);
app.Api_root().Init_by_kit(app);
app.Addon_mgr().Init_by_kit(app, kit);
menu_mgr.Menu_bldr().Init_by_kit(app, kit, app.Fsys_mgr().Bin_xowa_file_dir().GenSubDir_nest("app.menu"));
menu_mgr.Init_by_kit();
bnd_mgr.Init_by_kit(app);
Gfo_evt_mgr_.Sub_same_many(app.Usere(), this, Xoue_user.Evt_lang_changed);
app.Sys_cfg().Lang_(app.Sys_cfg().Lang()); // NOTE: force refresh of lang. must occur after after gui_mgr init, else menu lbls will break
}
public void Lang_changed(Xol_lang_itm lang) {
menu_mgr.Lang_changed(lang);
browser_win.Lang_changed(lang);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_kit)) return kit;
else if (ctx.Match(k, Invk_kit_)) this.kit = Gfui_kit_.Get_by_key(m.ReadStrOr("v", Gfui_kit_.Swt().Key()));
else if (ctx.Match(k, Invk_run)) Run(Rls_able_.Null);
else if (ctx.Match(k, Invk_browser_type)) kit.Cfg_set("HtmlBox", "BrowserType", Swt_kit.Cfg_Html_BrowserType_parse(m.ReadStr("v")));
else if (ctx.Match(k, Invk_xul_runner_path_)) kit.Cfg_set("HtmlBox", "XulRunnerPath", Bry_fmtr_eval_mgr_.Eval_url(app.Url_cmd_eval(), m.ReadBry("v")).Xto_api());
else if (ctx.Match(k, Invk_bnds)) return bnd_mgr;
else if (ctx.Match(k, Invk_bindings)) return ipt_cfgs;
else if (ctx.MatchIn(k, Invk_main_win, Invk_browser_win)) return browser_win;
else if (ctx.Match(k, Invk_win_opts)) return win_cfg;
else if (ctx.Match(k, Invk_layout)) return layout;
else if (ctx.Match(k, Invk_html)) return html_mgr;
else if (ctx.Match(k, Invk_menus)) return menu_mgr;
else if (ctx.Match(k, Invk_cmds)) return cmd_mgr;
else if (ctx.Match(k, Invk_url_macros)) return url_macro_mgr;
else if (ctx.Match(k, Xoue_user.Evt_lang_changed)) Lang_changed((Xol_lang_itm)m.ReadObj("v", null));
else throw Err_.new_unhandled(k);
return this;
}
private static final String
Invk_kit = "kit", Invk_kit_ = "kit_", Invk_browser_type = "browser_type_", Invk_xul_runner_path_ = "xul_runner_path_", Invk_run = "run"
, Invk_main_win = "main_win", Invk_browser_win = "browser_win", Invk_bnds = "bnds"
, Invk_bindings = "bindings", Invk_win_opts = "win_opts", Invk_layout = "layout", Invk_html = "html"
, Invk_menus = "menus", Invk_cmds = "cmds", Invk_url_macros = "url_macros";
public void Run(Rls_able splash_win) {
Gfo_log_bfr log_bfr = app.Log_bfr();
try {
Xoa_gui_mgr ui_mgr = app.Gui_mgr();
Gfui_kit kit = ui_mgr.Kit();
ui_mgr.Kit_(kit); log_bfr.Add("app.gui.kit_init.done");
Xog_win_itm main_win = ui_mgr.Browser_win();
Xog_win_itm_.Show_win(main_win); log_bfr.Add("app.gui.win_load.done");
Xog_tab_itm_read_mgr.Launch(main_win);
app.Log_wtr().Log_to_session_direct(log_bfr.Xto_str());
splash_win.Rls();
kit.Kit_run(); // NOTE: enters thread-loop
} catch (Exception e) {
app.Usr_dlg().Warn_many("", "", "run_failed: ~{0} ~{1}", log_bfr.Xto_str(), Err_.Message_gplx_full(e));
if (app.Gui_mgr().Kit() != null) app.Gui_mgr().Kit().Ask_ok("", "", Err_.Message_gplx_full(e));
}
}
private void layout_Init() {
Op_sys os = Op_sys.Cur();
int html_box_w = -8; int html_box_h = -30; // default adjustments since version 0.0.0.0; seems to work on XP and LNX
switch (os.Tid()) {
case Op_sys.Tid_wnt:
switch (os.Sub_tid()) {
case Op_sys.Sub_tid_win_xp: break; // NOOP; will keep values as above
default: // for all else, use Windows 7 border; note that Windows 8 is being detected as "Windows NT (unknown)", so need to use default; this may not work with Windows 2000
html_box_w = -16; html_box_h = -40; // Windows 7 has a thicker windows border and the html_box must be smaller else scroll bar gets cut off
break;
}
break;
default:
break;
}
layout.Html_box().W_rel_(html_box_w).H_rel_(html_box_h);
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis; import gplx.*; import gplx.xowa.*;
import gplx.xowa.htmls.portal.*;
public class Xog_html_mgr implements Gfo_invk {
public Xog_html_mgr(Xoae_app app) {portal_mgr = new Xoa_portal_mgr(app);}
public Xoa_portal_mgr Portal_mgr() {return portal_mgr;} private Xoa_portal_mgr portal_mgr;
public String Auto_focus_id() {return auto_focus_id;} private String auto_focus_id = "";
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_auto_focus_id_)) auto_focus_id = m.ReadStr("v");
else if (ctx.Match(k, Invk_portal)) return portal_mgr;
else return Gfo_invk_.Rv_unhandled;
return this;
} private static final String Invk_auto_focus_id_ = "auto_focus_id_", Invk_portal = "portal";
}

View File

@@ -0,0 +1,143 @@
/*
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; import gplx.*; import gplx.xowa.*;
import gplx.core.envs.*;
import gplx.gfui.*; import gplx.gfui.controls.elems.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.users.*; import gplx.xowa.guis.views.*;
public class Xog_resizer implements Gfo_invk {
private Xog_win_itm win_itm;
private String browser__adj_type = "none";
private RectAdp browser__adj_rect = RectAdp_.Zero;
public void Init_by_app(Xoa_app app, Xog_win_itm win_itm) {
this.win_itm = win_itm;
if (Op_sys.Cur().Tid_is_osx()) {
browser__adj_type = "relative";
browser__adj_rect = RectAdp_.new_(0, 0, 5, 30);
}
app.Cfg().Bind_many_app(this, Cfg__browser__adj_type, Cfg__browser__adj_rect);
}
public void Exec_win_resize(Xoae_app app, int main_w, int main_h) {
Xog_layout layout = app.Gui_mgr().Layout();
Xog_win_itm main_win = app.Gui_mgr().Browser_win();
GfuiBtn go_bwd_btn = main_win.Go_bwd_btn(), go_fwd_btn = main_win.Go_fwd_btn(), url_exec_btn = main_win.Url_exec_btn(), search_exec_btn = main_win.Search_exec_btn(), find_fwd_btn = main_win.Find_fwd_btn(), find_bwd_btn = main_win.Find_bwd_btn(), find_close_btn = main_win.Find_close_btn();
GfuiComboBox url_box = main_win.Url_box();
GfuiTextBox search_box = main_win.Search_box(), find_box = main_win.Find_box(), prog_box = main_win.Prog_box(), note_box = main_win.Info_box();
Gfui_tab_mgr tab_mgr = main_win.Tab_mgr().Tab_mgr();
int txt_dim = layout.Box_height_calc(app.Gui_mgr().Kit(), url_box);
int btn_dim = 25; // txt_dim + 1;
if (txt_dim < 25) {
txt_margin_v = (25 - txt_dim) / 2;
txt_dim = 25;
}
else
txt_margin_v = 0;
int txt_dif = 0, btn_dif = 0;
int bar_dim = btn_dim > txt_dim ? btn_dim : txt_dim;
if (txt_dim < 25) {txt_dif = (25 - txt_dim) / 2;}
else {btn_dif = (txt_dim - 25) / 2;}
boolean menu_bar_enabled = app.Gui_mgr().Menu_mgr().Window().Get_or_new("main_win").Enabled();
int menu_bar_adj = menu_bar_enabled ? 20 : 2; // 2, else linux progress bar abuts bottom of screen
RectAdp prv_elem_rect = (Op_sys.Cur().Tid_is_wnt() && Op_sys.Cur().Sub_tid() == Op_sys.Sub_tid_win_7) && menu_bar_enabled
? Prv_elem_rect_win_7 // NOTE: if windows 7 and menu bar enabled, shift everything up by 1 pixel; else ugly gap at top border of url box; only affects win 7; DATE:2013-08-31
: Prv_elem_rect_initial
;
Exec_win_resize_elem(layout.Go_bwd_btn() , go_bwd_btn , new Rect_ref(0, 0, btn_dim , btn_dim ), prv_elem_rect, Xog_resizer.Layout_right_top);
Exec_win_resize_elem(layout.Go_fwd_btn() , go_fwd_btn , new Rect_ref(0, 0, btn_dim , btn_dim ), go_bwd_btn, Xog_resizer.Layout_right_top);
Exec_win_resize_elem(layout.Url_box() , url_box , new Rect_ref(0, 0, main_w - (btn_dim * 5) - 200 , txt_dim ), go_fwd_btn, Xog_resizer.Layout_right_top);
Exec_win_resize_elem(layout.Url_exec_btn() , url_exec_btn , new Rect_ref(0, 0, btn_dim , btn_dim ), url_box, Xog_resizer.Layout_right_top);
Exec_win_resize_elem(layout.Search_box() , search_box , new Rect_ref(0, 0, 190 , txt_dim ), url_exec_btn, Xog_resizer.Layout_right_top);
Exec_win_resize_elem(layout.Search_exec_btn() , search_exec_btn , new Rect_ref(0, 0, btn_dim , btn_dim ), search_box, Xog_resizer.Layout_right_top);
Exec_win_resize_elem(layout.Html_box() , tab_mgr , new Rect_ref(0, 0, main_w , main_h + -(bar_dim * 2) - menu_bar_adj), go_bwd_btn, Xog_resizer.Layout_below_left); // -40:btn_dim(url bar) + btn_dim (find box)
if (String_.Eq(browser__adj_type, "none")) {}
else if (String_.Eq(browser__adj_type, "absolute")) {
if ( browser__adj_rect.Width() >= 320 // prevent unshowable window
&& browser__adj_rect.Width() >= 320)
tab_mgr.Rect_set(browser__adj_rect);
}
else if (String_.Eq(browser__adj_type, "relative")) tab_mgr.Rect_set(tab_mgr.Rect().Op_add(browser__adj_rect));
Exec_win_resize_elem(layout.Find_close_btn() , find_close_btn , new Rect_ref(0, 0, btn_dim , btn_dim ), tab_mgr, Xog_resizer.Layout_below_left);
Exec_win_resize_elem(layout.Find_box() , find_box , new Rect_ref(0, 0, 102 , txt_dim ), find_close_btn, Xog_resizer.Layout_right_top);
find_box.Y_(tab_mgr.Y_max());
Exec_win_resize_elem(layout.Find_fwd_btn() , find_fwd_btn , new Rect_ref(0, 0, btn_dim , btn_dim ), find_box, Xog_resizer.Layout_right_top);
Exec_win_resize_elem(layout.Find_bwd_btn() , find_bwd_btn , new Rect_ref(0, 0, btn_dim , btn_dim ), find_fwd_btn, Xog_resizer.Layout_right_top);
Exec_win_resize_elem(layout.Prog_box() , prog_box , new Rect_ref(0, 0, (main_w - 102 - 200 - (bar_dim * 3)), txt_dim ), find_bwd_btn, Xog_resizer.Layout_right_top); // -200=200(find_box) - 200 (note_box)
Exec_win_resize_elem(layout.Note_box() , note_box , new Rect_ref(0, 0, 200 , txt_dim ), prog_box, Xog_resizer.Layout_right_top); // -200=200(find_box)
if (txt_dif > 0) {
GfuiElem_.Y_adj(txt_dif, url_box, search_box);
GfuiElem_.Y_adj(txt_dif, find_box, prog_box, note_box);
}
if (btn_dif > 0) {
GfuiElem_.Y_adj(btn_dif, go_bwd_btn, go_fwd_btn, url_exec_btn, find_close_btn, search_exec_btn);
GfuiElem_.Y_adj(btn_dif, find_fwd_btn, find_bwd_btn);
}
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Cfg__browser__adj_type)) {browser__adj_type = m.ReadStr("v"); win_itm.Refresh_win_size();}
else if (ctx.Match(k, Cfg__browser__adj_rect)) {browser__adj_rect = gplx.gfui.RectAdp_.parse_ws_(m.ReadStr("v")); win_itm.Refresh_win_size();}
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String Cfg__browser__adj_type = "xowa.gui.html_box.adj_type", Cfg__browser__adj_rect = "xowa.gui.html_box.adj_rect";
private static RectAdp Prv_elem_rect_initial = RectAdp_.Zero, Prv_elem_rect_win_7 = RectAdp_.new_(0, -1, 0, 0);
private static void Exec_win_resize_elem(Xog_layout_box box, GfuiElem cur_elem, Rect_ref cur_elem_rect, GfuiElem prv_elem, byte layout) {Exec_win_resize_elem(box, cur_elem, cur_elem_rect, prv_elem.Rect(), layout);}
private static void Exec_win_resize_elem(Xog_layout_box box, GfuiElem cur_elem, Rect_ref cur_elem_rect, RectAdp prv_elem_rect, byte layout) {
if (Type_adp_.Eq_typeSafe(cur_elem, GfuiTextBox.class)) {
try {
GfuiTextBox cur_box = (GfuiTextBox)cur_elem;
cur_box.Margins_set(0, txt_margin_v, 0, txt_margin_v);
} catch (Exception e) {Err_.Noop(e);}
}
else if (Type_adp_.Eq_typeSafe(cur_elem, GfuiComboBox.class)) {
try {
GfuiComboBox cur_box = (GfuiComboBox)cur_elem;
cur_box.Margins_set(0, txt_margin_v, 0, txt_margin_v);
} catch (Exception e) {Err_.Noop(e);}
}
if (box.Mode() == Xog_layout_box.Mode_abs) // absolute mode; set dimensions manually
cur_elem_rect.X_(box.X_abs()).Y_(box.Y_abs()).W_(box.W_abs()).H_(box.H_abs());
else {
box.Adj_size(cur_elem_rect);
Set_pos_by_prv(layout, cur_elem_rect, Rect_ref.rectAdp_(prv_elem_rect));
box.Adj_pos(cur_elem_rect);
}
cur_elem.Rect_set(cur_elem_rect.XtoRectAdp());
if (Type_adp_.Eq_typeSafe(cur_elem, GfuiBtn.class)) {
GfuiBtn cur_btn = (GfuiBtn)cur_elem;
cur_btn.Btn_img_(cur_btn.Btn_img());
}
}
private static void Set_pos_by_prv(byte layout, Rect_ref cur_elem_rect, Rect_ref prv_elem_rect) {
switch (layout) {
case Xog_resizer.Layout_right_top:
cur_elem_rect.X_(prv_elem_rect.X_max());
cur_elem_rect.Y_(prv_elem_rect.Y());
break;
case Xog_resizer.Layout_right_bot:
cur_elem_rect.X_(prv_elem_rect.X_max());
cur_elem_rect.Y_(prv_elem_rect.Y_max() - cur_elem_rect.H()); // cur_elem.Height
break;
case Xog_resizer.Layout_below_left:
cur_elem_rect.X_(prv_elem_rect.X());
cur_elem_rect.Y_(prv_elem_rect.Y_max());
break;
}
}
public static final byte Layout_init = 0, Layout_right_top = 1, Layout_right_bot = 2, Layout_below_left = 3;
private static int txt_margin_v = 0;
}

View File

@@ -0,0 +1,49 @@
/*
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; import gplx.*; import gplx.xowa.*;
import gplx.core.threads.*; import gplx.core.net.*;
import gplx.xowa.guis.history.*;
import gplx.xowa.apps.*; import gplx.xowa.wikis.*;
import gplx.xowa.htmls.*;
class Xogv_page_load_wkr implements Gfo_thread_wkr, Gfo_invk {
private final Xoav_wiki_mgr wiki_mgr; private final Gfo_url_parser url_parser;
private final Xogv_tab_base tab; private final Xog_history_itm old_itm, new_itm;
public Xogv_page_load_wkr(Xoav_wiki_mgr wiki_mgr, Gfo_url_parser url_parser, Xogv_tab_base tab, Xog_history_itm old_itm, Xog_history_itm new_itm) {
this.wiki_mgr = wiki_mgr; this.url_parser = url_parser; this.tab = tab; this.old_itm = old_itm; this.new_itm = new_itm;
}
public String Thread__name() {return Thread_name;} public static final String Thread_name = "xowa.page_load";
public boolean Thread__resume() {return true;}
public void Thread__exec() {
Xoh_page new_hpg = Fetch_page(new_itm.Wiki(), new_itm.Page(), new_itm.Qarg());
tab.Show_page(old_itm, new_itm, new_hpg);
}
private Xoh_page Fetch_page(byte[] wiki_domain, byte[] page_bry, byte[] qarg_bry) {
Xowv_wiki wiki = (Xowv_wiki)wiki_mgr.Get_by_or_null(wiki_domain);
if (wiki == null) return Xoh_page.New_missing(); // wiki does not exist; happens with xwiki; PAGE:s.w:Photon; EX:[[wikt:transmit]]; DATE:2015-04-27
Xoa_ttl ttl = wiki.Ttl_parse(page_bry);
Gfo_url url = url_parser.Parse(Bry_.Add(wiki_domain, Byte_ascii.Slash_bry, page_bry, qarg_bry));
Xoh_page rv = new Xoh_page();
wiki.Pages_get(rv, url, ttl);
return rv;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_exec)) this.Thread__exec();
else return Gfo_invk_.Rv_unhandled;
return this;
} public static final String Invk_exec = "exec";
}

View File

@@ -0,0 +1,62 @@
/*
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; import gplx.*; import gplx.xowa.*;
import gplx.core.net.*;
import gplx.xowa.htmls.*; import gplx.xowa.guis.history.*;
import gplx.xowa.apps.*; import gplx.xowa.wikis.*; import gplx.xowa.apps.urls.*;
import gplx.core.threads.*;
public abstract class Xogv_tab_base {
private Gfo_url_parser url_parser;
private Xoav_wiki_mgr wiki_mgr;
private Gfo_thread_pool thread_pool;
public void Ctor(Xoav_wiki_mgr wiki_mgr, Gfo_thread_pool thread_pool, Gfo_url_parser url_parser) {this.wiki_mgr = wiki_mgr; this.thread_pool = thread_pool; this.url_parser = url_parser;}
public Xog_history_stack History_stack() {return history_stack;} private final Xog_history_stack history_stack = new Xog_history_stack();
public Xog_history_itm Cur_itm() {return history_stack.Cur_itm();}
public Xow_wiki Get_wiki_or_null(byte[] key) {return wiki_mgr.Get_by_or_null(key);}
public Xoh_page Go_to(byte[] page) {return Go_to(history_stack.Cur_itm().Wiki(), page, Bry_.Empty, Bry_.Empty, false, "");}
public Xoh_page Go_to(byte[] wiki, byte[] page) {return Go_to(wiki, page, Bry_.Empty, Bry_.Empty, false, "");}
public Xoh_page Go_to(byte[] wiki, byte[] page, byte[] anch, byte[] qarg, boolean redirect_force, String bmk_pos) {
Xog_history_itm old_itm = this.Cur_itm();
Xog_history_itm new_itm = new Xog_history_itm(wiki, page, anch, qarg, redirect_force, bmk_pos);
Xoh_page rv = Fetch_page_and_show(old_itm, new_itm);
if (rv.Db().Page().Exists())
history_stack.Add(new_itm);
return rv;
}
public Xoh_page Go_bwd() {return Go_by_dir(Bool_.Y);}
public Xoh_page Go_fwd() {return Go_by_dir(Bool_.N);}
public Xoh_page Reload() {return Fetch_page_and_show(Cur_itm(), Cur_itm());}
private Xoh_page Go_by_dir(boolean bwd) {
Xog_history_itm old_itm = this.Cur_itm();
Xog_history_itm new_itm = bwd ? history_stack.Go_bwd() : history_stack.Go_fwd();
return Fetch_page_and_show(old_itm, new_itm);
}
private Xoh_page Fetch_page_and_show(Xog_history_itm old_itm, Xog_history_itm new_itm) {
if (new_itm == Xog_history_itm.Null) return Xoh_page.New_missing();
Fetch_page__bgn(new_itm.Wiki(), new_itm.Page(), new_itm.Qarg());
Xoh_page new_hpg = new Xoh_page();
// Thread_adp_.Start_by_key(Xogv_page_load_wkr.Thread_name, new Xogv_page_load_wkr(wiki_mgr, url_parser, this, old_itm, new_itm), Xogv_page_load_wkr.Invk_exec);
thread_pool.Add_at_end(new Xogv_page_load_wkr(wiki_mgr, url_parser, this, old_itm, new_itm));
thread_pool.Run();
return new_hpg;
}
@gplx.Virtual protected void Fetch_page__bgn(byte[] wiki_domain, byte[] page_bry, byte[] qarg_bry) {}
public void Srl_save(Bry_bfr bfr) {history_stack.Srl_save(bfr);}
public void Srl_load(byte[] raw) {history_stack.Srl_load(raw);}
public abstract void Show_page(Xog_history_itm old_itm, Xog_history_itm new_itm, Xoh_page new_hpg);
}

View File

@@ -0,0 +1,51 @@
/*
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.bnds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_bnd_box {
private final Ordered_hash key_hash = Ordered_hash_.New();
private final Hash_adp cmd_hash = Hash_adp_.New();
public Xog_bnd_box(int tid, String key) {
this.tid = tid;
this.key = key;
}
public int Tid() {return tid;} private final int tid;
public String Key() {return key;} private final String key;
public int Len() {return key_hash.Count();}
public Xog_bnd_itm Get_at(int i) {return (Xog_bnd_itm)key_hash.Get_at(i);}
public void Add(Xog_bnd_itm itm) {
key_hash.Add_if_dupe_use_nth(itm.Key(), itm); // Add_if_dupe_use_nth, else Xou_user_tst.Run fails; DATE:2014-05-15
// add by cmd; needed b/c gfui.ipt_mgr hashes by cmd ("sandbox"), not key ("sandbox-1"); DATE:2016-12-25
List_adp list = (List_adp)cmd_hash.Get_by(itm.Cmd());
if (list == null) {
list = List_adp_.New();
cmd_hash.Add(itm.Cmd(), list);
}
list.Add(itm);
}
public List_adp Get_list_by_cmd(String cmd) {return (List_adp)cmd_hash.Get_by(cmd);}
public void Del(String key) {
// delete from key_hash
Xog_bnd_itm itm = (Xog_bnd_itm)key_hash.Get_by(key);
key_hash.Del(key);
// delete from cmd_hash
List_adp list = (List_adp)cmd_hash.Get_by(itm.Cmd());
if (list != null) list.Del(itm);
}
}

View File

@@ -0,0 +1,135 @@
/*
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.bnds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.gfui.ipts.*; import gplx.gfui.controls.elems.*;
import gplx.xowa.guis.views.*; import gplx.xowa.guis.cmds.*;
public class Xog_bnd_box_ {
public static final String Key_browser = "browser", Key_browser_url = "browser.url", Key_browser_search = "browser.search", Key_browser_html = "browser.html", Key_browser_find = "browser.find", Key_browser_prog = "browser.prog", Key_browser_info = "browser.info";
public static final String Gui_browser = "Window", Gui_browser_url = "Url bar", Gui_browser_search = "Search box", Gui_browser_html = "HTML browser", Gui_browser_find = "Find box", Gui_browser_prog = "Status bar", Gui_browser_info = "System Messages box";
public static final int Tid__max = 7, Tid_browser = 0, Tid_browser_url = 1, Tid_browser_search = 2, Tid_browser_html = 3, Tid_browser_find = 4, Tid_browser_prog = 5, Tid_browser_info = 6;
public static final int Ary_len = Tid__max;
public static Xog_bnd_box[] Ary() {
if (ary != null) return ary;
ary = new Xog_bnd_box[Tid__max];
ary_init(ary, Tid_browser , Key_browser);
ary_init(ary, Tid_browser_url , Key_browser_url);
ary_init(ary, Tid_browser_search , Key_browser_search);
ary_init(ary, Tid_browser_html , Key_browser_html);
ary_init(ary, Tid_browser_find , Key_browser_find);
ary_init(ary, Tid_browser_prog , Key_browser_prog);
ary_init(ary, Tid_browser_info , Key_browser_info);
return ary;
} private static Xog_bnd_box[] ary;
private static void ary_init(Xog_bnd_box[] ary, int tid, String key) {ary[tid] = new Xog_bnd_box(tid, key);}
public static String To_gui_str(String key) {
int tid = Xto_sys_int(key);
return Xto_gui_str(tid);
}
public static String To_key_str(String gui) {
int tid = Xby_gui_str(gui);
return Xto_sys_str(tid);
}
public static int[] Xto_sys_int_ary(String s) {
String[] ary = String_.Split(s, "|");
int len = ary.length;
int[] rv = new int[len];
for (int i = 0; i < len; i++)
rv[i] = Xto_sys_int(ary[i]);
return rv;
}
public static int Xto_sys_int(String s) {
if (String_.Eq(s, Key_browser)) return Tid_browser;
else if (String_.Eq(s, Key_browser_url)) return Tid_browser_url;
else if (String_.Eq(s, Key_browser_search)) return Tid_browser_search;
else if (String_.Eq(s, Key_browser_html)) return Tid_browser_html;
else if (String_.Eq(s, Key_browser_find)) return Tid_browser_find;
else if (String_.Eq(s, Key_browser_prog)) return Tid_browser_prog;
else if (String_.Eq(s, Key_browser_info)) return Tid_browser_info;
else throw Err_.new_unhandled(s);
}
public static String Xto_sys_str(int v) {
switch (v) {
case Tid_browser: return Key_browser;
case Tid_browser_url: return Key_browser_url;
case Tid_browser_search: return Key_browser_search;
case Tid_browser_html: return Key_browser_html;
case Tid_browser_find: return Key_browser_find;
case Tid_browser_prog: return Key_browser_prog;
case Tid_browser_info: return Key_browser_info;
default: throw Err_.new_unhandled(v);
}
}
public static String Xto_gui_str(int v) {
switch (v) {
case Tid_browser: return Gui_browser;
case Tid_browser_url: return Gui_browser_url;
case Tid_browser_search: return Gui_browser_search;
case Tid_browser_html: return Gui_browser_html;
case Tid_browser_find: return Gui_browser_find;
case Tid_browser_prog: return Gui_browser_prog;
case Tid_browser_info: return Gui_browser_info;
default: throw Err_.new_unhandled(v);
}
}
public static int Xby_gui_str(String s) {
if (String_.Eq(s, Gui_browser)) return Tid_browser;
else if (String_.Eq(s, Gui_browser_url)) return Tid_browser_url;
else if (String_.Eq(s, Gui_browser_search)) return Tid_browser_search;
else if (String_.Eq(s, Gui_browser_html)) return Tid_browser_html;
else if (String_.Eq(s, Gui_browser_find)) return Tid_browser_find;
else if (String_.Eq(s, Gui_browser_prog)) return Tid_browser_prog;
else if (String_.Eq(s, Gui_browser_info)) return Tid_browser_info;
else throw Err_.new_unhandled(s);
}
public static void Set_bnd_for_grp(byte mode, Xog_win_itm win, Xog_cmd_mgr_invk invk_mgr, Xog_bnd_box box, Xog_bnd_itm itm, IptArg ipt) {
GfuiElem box_elem = null;
String grp_key = box.Key();
if (String_.Eq(grp_key, Xog_bnd_box_.Key_browser_html)) {Set_bnd_for_tab(mode, win.Tab_mgr(), invk_mgr, box, itm, ipt); return;}
else if (String_.Eq(grp_key, Xog_bnd_box_.Key_browser)) box_elem = win.Win_box();
else if (String_.Eq(grp_key, Xog_bnd_box_.Key_browser_url)) box_elem = win.Url_box();
else if (String_.Eq(grp_key, Xog_bnd_box_.Key_browser_search)) box_elem = win.Search_box();
else if (String_.Eq(grp_key, Xog_bnd_box_.Key_browser_find)) box_elem = win.Find_box();
else if (String_.Eq(grp_key, Xog_bnd_box_.Key_browser_prog)) box_elem = win.Prog_box();
else if (String_.Eq(grp_key, Xog_bnd_box_.Key_browser_info)) box_elem = win.Info_box();
else throw Err_.new_wo_type("unknown box", "grp", grp_key);
Set_bnd_for_elem(mode, box, box_elem, invk_mgr, itm, ipt);
}
public static void Set_bnd_for_elem(byte mode, Xog_bnd_box box, GfuiElem box_elem, Xog_cmd_mgr_invk invk_mgr, Xog_bnd_itm itm, IptArg ipt) {
switch (mode) {
case Set_add:
if (!IptArg_.Is_null_or_none(itm.Ipt()))
IptBnd_.cmd_to_(IptCfg_.Null, box_elem, invk_mgr, itm.Cmd(), itm.Ipt());
break;
case Set_del_key:
box_elem.IptBnds().Del_by_key(itm.Cmd()); // NOTE: delete by cmd, since GfuiIpts use cmd for key
break;
case Set_del_ipt:
box_elem.IptBnds().Del_by_ipt(ipt);
break;
default: throw Err_.new_unhandled(mode);
}
}
private static void Set_bnd_for_tab(byte mode, Xog_tab_mgr tab_mgr, Xog_cmd_mgr_invk invk_mgr, Xog_bnd_box box, Xog_bnd_itm itm, IptArg ipt) {
int len = tab_mgr.Tabs_len();
for (int i = 0; i < len; i++) {
Xog_tab_itm tab_itm = tab_mgr.Tabs_get_at(i);
Set_bnd_for_elem(mode, box, tab_itm.Html_box(), invk_mgr, itm, ipt);
}
}
public static final byte Set_add = 0, Set_del_key = 1, Set_del_ipt = 2;
}

View File

@@ -0,0 +1,33 @@
/*
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.bnds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.gfui.ipts.*;
public class Xog_bnd_itm {
public Xog_bnd_itm(String key, boolean sys, String cmd, int box, IptArg ipt) {
this.key = key; this.sys = sys; this.cmd = cmd; this.box = box; this.ipt = ipt;
uid = ++Uid_next;
}
public String Key() {return key;} private String key;
public int Uid() {return uid;} private int uid;
public boolean Sys() {return sys;} private boolean sys;
public String Cmd() {return cmd;} public void Cmd_(String v) {cmd = v;} private String cmd;
public int Box() {return box;} private int box;
public IptArg Ipt() {return ipt;} public void Ipt_to_none() {ipt = IptKey_.None;} private IptArg ipt;
public void Init_by_set(int box, IptArg ipt) {this.box = box; this.ipt = ipt;}
private static int Uid_next = 0;
}

View File

@@ -0,0 +1,383 @@
/*
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.bnds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.gfui.ipts.*; import gplx.gfui.controls.elems.*;
import gplx.xowa.guis.views.*; import gplx.xowa.guis.cmds.*; import gplx.xowa.guis.menus.dom.*;
public class Xog_bnd_mgr implements Gfo_invk {
private Xoae_app app;
private Xog_win_itm win; private Xog_cmd_mgr_invk invk_mgr;
private Xog_bnd_box[] boxs = Xog_bnd_box_.Ary();
private List_adp startup_itms = List_adp_.New();
private Ordered_hash regy = Ordered_hash_.New();
public Xog_bnd_mgr(Xog_win_itm win) {this.win = win; invk_mgr = win.Gui_mgr().Cmd_mgr().Invk_mgr();}
public int Len() {return regy.Count();}
public Xog_bnd_itm Get_at(int i) {return (Xog_bnd_itm)regy.Get_at(i);}
public Xog_bnd_itm Get_or_null(String v) {return (Xog_bnd_itm)regy.Get_by(v);}
public void Init_by_kit(Xoae_app app) {
this.app = app;
Add_system_bnds();
Add_custom_bnds(); // NOTE: should go after Add_system_bnds in case user overrides any;
Bind_all();
app.Cfg().Sub_many_app(this, Run__show_remap_win);
app.Cfg().Bind_many_app(this
, "xowa.gui.shortcuts.xowa.app.exit-1"
, "xowa.gui.shortcuts.xowa.nav.go_bwd-1"
, "xowa.gui.shortcuts.xowa.nav.go_fwd-1"
, "xowa.gui.shortcuts.xowa.nav.cfg.main-1"
, "xowa.gui.shortcuts.xowa.nav.cfg.menus-1"
, "xowa.gui.shortcuts.xowa.nav.wiki.main_page-1"
, "xowa.gui.shortcuts.xowa.nav.wiki.sandbox-1"
, "xowa.gui.shortcuts.xowa.nav.wiki.sandbox-2"
, "xowa.gui.shortcuts.xowa.nav.wiki.random-1"
, "xowa.gui.shortcuts.xowa.nav.help.help-1"
, "xowa.gui.shortcuts.xowa.nav.help.about-1"
, "xowa.gui.shortcuts.xowa.nav.help.change_log-1"
, "xowa.gui.shortcuts.xowa.nav.help.diagnostics-1"
, "xowa.gui.shortcuts.xowa.nav.help.xowa_update-1"
, "xowa.gui.shortcuts.xowa.nav.help.xowa_main-1"
, "xowa.gui.shortcuts.xowa.nav.help.xowa_blog-1"
, "xowa.gui.shortcuts.xowa.nav.setup.download_central-1"
, "xowa.gui.shortcuts.xowa.nav.setup.import_from_list-1"
, "xowa.gui.shortcuts.xowa.nav.setup.import_from_script-1"
, "xowa.gui.shortcuts.xowa.nav.setup.maintenance-1"
, "xowa.gui.shortcuts.xowa.nav.setup.download-1"
, "xowa.gui.shortcuts.xowa.nav.system_data.log_session-1"
, "xowa.gui.shortcuts.xowa.nav.system_data.cfg_app-1"
, "xowa.gui.shortcuts.xowa.nav.system_data.cfg_lang-1"
, "xowa.gui.shortcuts.xowa.nav.system_data.usr_history-1"
, "xowa.gui.shortcuts.xowa.gui.font.increase-1"
, "xowa.gui.shortcuts.xowa.gui.font.decrease-1"
, "xowa.gui.shortcuts.xowa.gui.font.reset-1"
, "xowa.gui.shortcuts.xowa.gui.page.view.mode_read-1"
, "xowa.gui.shortcuts.xowa.gui.page.view.mode_edit-1"
, "xowa.gui.shortcuts.xowa.gui.page.view.mode_html-1"
, "xowa.gui.shortcuts.xowa.gui.page.view.mode_html-2"
, "xowa.gui.shortcuts.xowa.gui.page.view.refresh-1"
, "xowa.gui.shortcuts.xowa.gui.page.view.reload-1"
, "xowa.gui.shortcuts.xowa.gui.page.view.save_as-1"
, "xowa.gui.shortcuts.xowa.gui.page.view.print-1"
, "xowa.gui.shortcuts.xowa.gui.page.edit.save-1"
, "xowa.gui.shortcuts.xowa.gui.page.edit.save_draft-1"
, "xowa.gui.shortcuts.xowa.gui.page.edit.focus_edit_box-1"
, "xowa.gui.shortcuts.xowa.gui.page.edit.preview-1"
, "xowa.gui.shortcuts.xowa.gui.page.edit.dbg_tmpl-1"
, "xowa.gui.shortcuts.xowa.gui.page.edit.dbg_tmpl-2"
, "xowa.gui.shortcuts.xowa.gui.page.edit.dbg_html-1"
, "xowa.gui.shortcuts.xowa.gui.page.edit.exec-1"
, "xowa.gui.shortcuts.xowa.gui.page.selection.select_all-1"
, "xowa.gui.shortcuts.xowa.gui.page.selection.copy-1"
, "xowa.gui.shortcuts.xowa.gui.page.selection.save_file_as-1"
, "xowa.gui.shortcuts.xowa.gui.browser.url.focus-1"
, "xowa.gui.shortcuts.xowa.gui.browser.url.focus-2"
, "xowa.gui.shortcuts.xowa.gui.browser.url.exec-1"
, "xowa.gui.shortcuts.xowa.gui.browser.url.exec_by_paste-1"
, "xowa.gui.shortcuts.xowa.gui.browser.url.exec_by_paste-2"
, "xowa.gui.shortcuts.xowa.gui.browser.url.exec_new_tab_by_paste-1"
, "xowa.gui.shortcuts.xowa.gui.browser.url.restore-1"
, "xowa.gui.shortcuts.xowa.gui.browser.search.focus-1"
, "xowa.gui.shortcuts.xowa.gui.browser.search.exec-1"
, "xowa.gui.shortcuts.xowa.gui.browser.html.focus-1"
, "xowa.gui.shortcuts.xowa.gui.browser.html.focus-2"
, "xowa.gui.shortcuts.xowa.gui.browser.html.focus-3"
, "xowa.gui.shortcuts.xowa.gui.browser.html.focus-4"
, "xowa.gui.shortcuts.xowa.gui.browser.html.selection_focus_toggle-1"
, "xowa.gui.shortcuts.xowa.gui.browser.find.show-1"
, "xowa.gui.shortcuts.xowa.gui.browser.find.show_by_paste-1"
, "xowa.gui.shortcuts.xowa.gui.browser.find.hide-1"
, "xowa.gui.shortcuts.xowa.gui.browser.find.exec-1"
, "xowa.gui.shortcuts.xowa.gui.browser.find.find_fwd-1"
, "xowa.gui.shortcuts.xowa.gui.browser.find.find_bwd-1"
, "xowa.gui.shortcuts.xowa.gui.browser.find.case_toggle-1"
, "xowa.gui.shortcuts.xowa.gui.browser.find.wrap_toggle-1"
, "xowa.gui.shortcuts.xowa.gui.browser.prog.focus-1"
, "xowa.gui.shortcuts.xowa.gui.browser.prog_log.show-1"
, "xowa.gui.shortcuts.xowa.gui.browser.prog_log.show-2"
, "xowa.gui.shortcuts.xowa.gui.browser.info.focus-1"
, "xowa.gui.shortcuts.xowa.gui.browser.info.clear-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.new_dflt__at_dflt__focus_y-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.new_link__at_dflt__focus_y-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.new_link__at_dflt__focus_n-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.new_href__at_dflt__focus_y-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_bwd-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_bwd-2"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_fwd-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_fwd-2"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_1-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_2-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_3-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_4-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_5-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_6-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_7-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_8-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.select_by_idx_9-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.move_bwd-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.move_fwd-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.close_cur-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.close_others-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.close_to_bgn-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.close_to_end-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.close_undo-1"
, "xowa.gui.shortcuts.xowa.gui.browser.tabs.pin_toggle-1"
, "xowa.gui.shortcuts.xowa.html.tidy.toggle-1"
, "xowa.gui.shortcuts.xowa.net.enabled_n_-1"
, "xowa.gui.shortcuts.xowa.net.enabled_y_-1"
, "xowa.gui.shortcuts.xowa.net.enabled_x_-1"
, "xowa.gui.shortcuts.xowa.usr.bookmarks.add-1"
, "xowa.gui.shortcuts.xowa.usr.bookmarks.show-1"
, "xowa.gui.shortcuts.xowa.usr.history.goto_recent-1"
, "xowa.gui.shortcuts.xowa.usr.history.show-1"
);
}
public Xog_bnd_itm Set(Xog_bnd_itm itm, int new_box, IptArg new_ipt) {
if (win.Win_box() == null) { // kit not built yet; occurs when restoring bindings through cfg file; DATE:2014-05-16
Xog_bnd_itm new_itm = new Xog_bnd_itm(itm.Key(), false, "", new_box, new_ipt);
startup_itms.Add(new_itm);
return new_itm;
}
Del(itm, new_ipt);
itm.Init_by_set(new_box, new_ipt);
Add(itm);
return itm;
}
public void Del(Xog_bnd_itm new_bnd, IptArg new_ipt) {
boolean new_ipt_exists = !IptArg_.Is_null_or_none(new_ipt);
List_adp deleted = List_adp_.New();
// loop over each box
for (int i = 0; i < Xog_bnd_box_.Ary_len; i++) {
Xog_bnd_box old_box = boxs[i];
int old_itms_len = old_box.Len();
// loop over each bnd
for (int j = 0; j < old_itms_len; j++) {
Xog_bnd_itm old_bnd = old_box.Get_at(j);
// if keys match, delete old_bnd
if ( String_.Eq(old_bnd.Key(), new_bnd.Key())) {
Xog_bnd_box_.Set_bnd_for_grp(Xog_bnd_box_.Set_del_key, win, invk_mgr, old_box, old_bnd, new_bnd.Ipt());
deleted.Add(new_bnd);
}
// if ipts match, delete old_bnd
else if ( new_ipt_exists
&& old_bnd.Box() == new_bnd.Box()
&& String_.Eq(old_bnd.Ipt().Key(), new_ipt.Key())) {
Xog_bnd_box_.Set_bnd_for_grp(Xog_bnd_box_.Set_del_ipt, win, invk_mgr, old_box, old_bnd, old_bnd.Ipt());
old_bnd.Ipt_to_none();
}
}
// remove old bnd from box
int deleted_len = deleted.Count();
for (int j = 0; j < deleted_len; j++) {
// delete from box
Xog_bnd_itm deleted_itm = (Xog_bnd_itm)deleted.Get_at(j);
old_box.Del(deleted_itm.Key());
// add back other items with same cmd but different key; needed b/c gfui.ipt_mgr hashes by cmd ("sandbox"), not key ("sandbox-1"); DATE:2016-12-25
List_adp list = old_box.Get_list_by_cmd(deleted_itm.Cmd());
if (list != null) {
int len = list.Len();
for (int k = 0; k < len; k++) {
Xog_bnd_itm restore_itm = (Xog_bnd_itm)list.Get_at(k);
Xog_bnd_box_.Set_bnd_for_grp(Xog_bnd_box_.Set_add, win, invk_mgr, old_box, restore_itm, restore_itm.Ipt());
}
}
}
deleted.Clear();
}
}
private void Add(Xog_bnd_itm itm) {
Xog_bnd_box box = boxs[itm.Box()];
Xog_bnd_box_.Set_bnd_for_grp(Xog_bnd_box_.Set_add, win, invk_mgr, box, itm, itm.Ipt());
box.Add(itm);
}
public void Bind(int tid, GfuiElem box_elem) {
Xog_bnd_box box = boxs[tid];
int len = box.Len();
for (int i = 0; i < len; i++) {
Xog_bnd_itm itm = box.Get_at(i);
Xog_bnd_box_.Set_bnd_for_elem(Xog_bnd_box_.Set_add, box, box_elem, invk_mgr, itm, itm.Ipt());
}
}
public void Init() {
regy.Clear(); // clear regy, else 1 test will fail
Init_itm(Xog_cmd_itm_.Key_app_exit , Xog_bnd_box_.Tid_browser , "mod.c+key.q");
Init_itm(Xog_cmd_itm_.Key_nav_go_bwd , Xog_bnd_box_.Tid_browser , "mod.a+key.left");
Init_itm(Xog_cmd_itm_.Key_nav_go_fwd , Xog_bnd_box_.Tid_browser , "mod.a+key.right");
Init_itm(Xog_cmd_itm_.Key_nav_cfg_main , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_cfg_menu , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_wiki_main_page , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_wiki_random , Xog_bnd_box_.Tid_browser , "mod.cs+key.r");
Init_itm(Xog_cmd_itm_.Key_nav_wiki_sandbox , Xog_bnd_box_.Tid_browser , "mod.cs+key.g,mod.cs+key.s", "mod.c+key.f1");
Init_itm(Xog_cmd_itm_.Key_nav_help_help , Xog_bnd_box_.Tid_browser , "key.f1");
Init_itm(Xog_cmd_itm_.Key_nav_help_change_log , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_help_diagnostics , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_help_about , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_help_xowa_main , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_help_xowa_blog , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_help_xowa_update , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_setup_download_central , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_setup_import_from_list , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_setup_import_from_script , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_setup_maintenance , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_setup_download , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_system_data_log_session , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_system_data_cfg_app , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_system_data_cfg_lang , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_nav_system_data_usr_history , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_gui_font_increase , Xog_bnd_box_.Tid_browser , "mod.c+key.equal");
Init_itm(Xog_cmd_itm_.Key_gui_font_decrease , Xog_bnd_box_.Tid_browser , "mod.c+key.minus");
Init_itm(Xog_cmd_itm_.Key_gui_font_reset , Xog_bnd_box_.Tid_browser , "mod.c+key.d0");
Init_itm(Xog_cmd_itm_.Key_gui_page_view_mode_read , Xog_bnd_box_.Tid_browser , "mod.c+key.m,mod.c+key.r");
Init_itm(Xog_cmd_itm_.Key_gui_page_view_mode_edit , Xog_bnd_box_.Tid_browser , "mod.c+key.m,mod.c+key.e");
Init_itm(Xog_cmd_itm_.Key_gui_page_view_mode_html , Xog_bnd_box_.Tid_browser , "mod.c+key.m,mod.c+key.h", "mod.c+key.u");
Init_itm(Xog_cmd_itm_.Key_gui_page_view_reload , Xog_bnd_box_.Tid_browser , "key.f5");
Init_itm(Xog_cmd_itm_.Key_gui_page_view_refresh , Xog_bnd_box_.Tid_browser , "mod.s+key.f5");
Init_itm(Xog_cmd_itm_.Key_gui_page_view_save_as , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_gui_page_view_print , Xog_bnd_box_.Tid_browser , "mod.c+key.p");
Init_itm(Xog_cmd_itm_.Key_gui_page_selection_select_all , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_gui_page_selection_copy , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_gui_page_selection_save_file_as , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_gui_edit_save , Xog_bnd_box_.Tid_browser , "mod.as+key.s");
Init_itm(Xog_cmd_itm_.Key_gui_edit_save_draft , Xog_bnd_box_.Tid_browser , "mod.c+key.s");
Init_itm(Xog_cmd_itm_.Key_gui_edit_focus_edit_box , Xog_bnd_box_.Tid_browser , "mod.as+key.comma");
Init_itm(Xog_cmd_itm_.Key_gui_edit_preview , Xog_bnd_box_.Tid_browser , "mod.as+key.p");
Init_itm(Xog_cmd_itm_.Key_gui_edit_dbg_tmpl , Xog_bnd_box_.Tid_browser , "mod.c+key.e,mod.c+key.e", "mod.as+key.d,mod.as+key.d");
Init_itm(Xog_cmd_itm_.Key_gui_edit_dbg_html , Xog_bnd_box_.Tid_browser , "mod.c+key.e,mod.c+key.h");
Init_itm(Xog_cmd_itm_.Key_gui_edit_exec , Xog_bnd_box_.Tid_browser , "mod.c+key.e,mod.c+key.g");
Init_itm(Xog_cmd_itm_.Key_gui_browser_url_focus , Xog_bnd_box_.Tid_browser , "mod.a+key.d", "mod.c+key.l");
Init_itm(Xog_cmd_itm_.Key_gui_browser_url_exec , Xog_bnd_box_.Tid_browser_url , "key.enter");
Init_itm(Xog_cmd_itm_.Key_gui_browser_url_exec_new_tab_by_paste , Xog_bnd_box_.Tid_browser_url , "mod.c+key.enter");
Init_itm(Xog_cmd_itm_.Key_gui_browser_url_exec_by_paste , Xog_bnd_box_.Tid_browser_url , "mouse.middle", "mod.a+key.enter");
Init_itm(Xog_cmd_itm_.Key_gui_browser_url_restore , Xog_bnd_box_.Tid_browser_url , "mod.c+key.u");
Init_itm(Xog_cmd_itm_.Key_gui_browser_search_focus , Xog_bnd_box_.Tid_browser , "mod.ca+key.s");
Init_itm(Xog_cmd_itm_.Key_gui_browser_search_exec , Xog_bnd_box_.Tid_browser_search , "key.enter");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_new_dflt__at_dflt__focus_y , Xog_bnd_box_.Tid_browser , "mod.c+key.t");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_new_link__at_dflt__focus_n , Xog_bnd_box_.Tid_browser_html , "mouse.middle");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_new_link__at_dflt__focus_y , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_new_href__at_dflt__focus_y , Xog_bnd_box_.Tid_browser , "mod.c+key.g,mod.c+key.f");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_close_cur , Xog_bnd_box_.Tid_browser , "mod.c+key.w");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_close_others , Xog_bnd_box_.Tid_browser , "mod.cs+key.w,mod.cs+key.w");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_close_to_bgn , Xog_bnd_box_.Tid_browser , "mod.cs+key.w,mod.cs+key.left");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_close_to_end , Xog_bnd_box_.Tid_browser , "mod.cs+key.w,mod.cs+key.right");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_close_undo , Xog_bnd_box_.Tid_browser , "mod.cs+key.t");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_fwd , Xog_bnd_box_.Tid_browser , "mod.c+key.tab", "mod.c+key.pageDown");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_bwd , Xog_bnd_box_.Tid_browser , "mod.cs+key.tab", "mod.c+key.pageUp");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_1 , Xog_bnd_box_.Tid_browser , "mod.c+key.d1");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_2 , Xog_bnd_box_.Tid_browser , "mod.c+key.d2");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_3 , Xog_bnd_box_.Tid_browser , "mod.c+key.d3");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_4 , Xog_bnd_box_.Tid_browser , "mod.c+key.d4");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_5 , Xog_bnd_box_.Tid_browser , "mod.c+key.d5");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_6 , Xog_bnd_box_.Tid_browser , "mod.c+key.d6");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_7 , Xog_bnd_box_.Tid_browser , "mod.c+key.d7");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_8 , Xog_bnd_box_.Tid_browser , "mod.c+key.d8");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_select_by_idx_9 , Xog_bnd_box_.Tid_browser , "mod.c+key.d9");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_move_bwd , Xog_bnd_box_.Tid_browser , "mod.a+key.pageUp");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_move_fwd , Xog_bnd_box_.Tid_browser , "mod.a+key.pageDown");
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_pin_toggle , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_gui_browser_html_focus , 0, Xog_bnd_box_.Tid_browser_url , "key.escape");
Init_itm(Xog_cmd_itm_.Key_gui_browser_html_focus , 1, Xog_bnd_box_.Tid_browser_search , "key.escape");
Init_itm(Xog_cmd_itm_.Key_gui_browser_html_focus , 2, Xog_bnd_box_.Tid_browser_prog , "key.escape");
Init_itm(Xog_cmd_itm_.Key_gui_browser_html_focus , 3, Xog_bnd_box_.Tid_browser_info , "key.escape");
Init_itm(Xog_cmd_itm_.Key_gui_browser_html_selection_focus_toggle , Xog_bnd_box_.Tid_browser , "mod.c+key.g,mod.c+key.g");
Init_itm(Xog_cmd_itm_.Key_gui_browser_find_show , Xog_bnd_box_.Tid_browser , "mod.c+key.f");
Init_itm(Xog_cmd_itm_.Key_gui_browser_find_show_by_paste , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_gui_browser_find_hide , Xog_bnd_box_.Tid_browser_find , "key.escape");
Init_itm(Xog_cmd_itm_.Key_gui_browser_find_exec , Xog_bnd_box_.Tid_browser_find , "key.enter");
Init_itm(Xog_cmd_itm_.Key_gui_browser_find_find_fwd , Xog_bnd_box_.Tid_browser_find , "mod.a+key.n");
Init_itm(Xog_cmd_itm_.Key_gui_browser_find_find_bwd , Xog_bnd_box_.Tid_browser_find , "mod.a+key.p");
Init_itm(Xog_cmd_itm_.Key_gui_browser_find_case_toggle , Xog_bnd_box_.Tid_browser_find , "mod.a+key.c");
Init_itm(Xog_cmd_itm_.Key_gui_browser_find_wrap_toggle , Xog_bnd_box_.Tid_browser_find , "mod.a+key.w");
Init_itm(Xog_cmd_itm_.Key_gui_browser_prog_focus , Xog_bnd_box_.Tid_browser , "mod.ca+key.p");
Init_itm(Xog_cmd_itm_.Key_gui_browser_info_focus , Xog_bnd_box_.Tid_browser , "mod.ca+key.i");
Init_itm(Xog_cmd_itm_.Key_gui_browser_info_clear , Xog_bnd_box_.Tid_browser , "mod.ca+key.c");
Init_itm(Xog_cmd_itm_.Key_gui_browser_prog_log_show , Xog_bnd_box_.Tid_browser_prog , "mouse.middle", "mod.cs+key.p");
Init_itm(Xog_cmd_itm_.Key_html_tidy_toggle , Xog_bnd_box_.Tid_browser , "key.f7");
Init_itm(Xog_cmd_itm_.Key_usr_bookmarks_add , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_usr_bookmarks_show , Xog_bnd_box_.Tid_browser , "key.f3");
Init_itm(Xog_cmd_itm_.Key_usr_history_goto_recent , Xog_bnd_box_.Tid_browser , "mod.cs+key.l");
Init_itm(Xog_cmd_itm_.Key_usr_history_show , Xog_bnd_box_.Tid_browser , "mod.cs+key.h");
Init_itm(Xog_cmd_itm_.Key_net_enabled_n_ , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_net_enabled_y_ , Xog_bnd_box_.Tid_browser , "");
Init_itm(Xog_cmd_itm_.Key_net_enabled_x_ , Xog_bnd_box_.Tid_browser , "");
}
private void Init_itm(String cmd, int box, String... ipts) {
int ipts_len = ipts.length;
for (int i = 0; i < ipts_len; i++) {
String ipt_str = ipts[i];
Init_itm(cmd, i, box, IptArg_.parse_or_none_(ipt_str));
}
}
private void Init_itm(String cmd, int idx, int box, String ipt) {Init_itm(cmd, idx, box, IptArg_.parse_or_none_(ipt));}
private void Init_itm(String cmd, int idx, int box, IptArg ipt) {
String key = cmd + "-" + Int_.To_str(idx + List_adp_.Base1); // EX: xowa.widgets.url.focus-1 xowa.widgets.url.focus-2
Xog_bnd_itm itm = new Xog_bnd_itm(key, Bool_.Y, cmd, box, ipt);
boxs[box].Add(itm);
regy.Add(itm.Key(), itm);
}
private void Add_system_bnds() {
IptCfg null_cfg = IptCfg_.Null; IptEventType btn_event_type = IptEventType_.add_(IptEventType_.MouseUp, IptEventType_.KeyDown); IptArg[] btn_args = IptArg_.Ary(IptMouseBtn_.Left, IptKey_.Enter, IptKey_.Space);
IptBnd_.ipt_to_(null_cfg , win.Go_bwd_btn() , invk_mgr, Xog_cmd_itm_.Key_nav_go_bwd , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , win.Go_fwd_btn() , invk_mgr, Xog_cmd_itm_.Key_nav_go_fwd , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , win.Url_exec_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_url_exec , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , win.Search_exec_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_search_exec , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , win.Find_close_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_hide , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , win.Find_fwd_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_find_fwd , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , win.Find_bwd_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_find_bwd , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , win.Find_box() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_type , IptEventType_.KeyUp, IptKey_.printableKeys_(IptKey_.Ary(IptKey_.Back, IptKey_.Escape, IptKey_.Ctrl.Add(IptKey_.V)), IptKey_.Ary()));
IptBnd_.ipt_to_(null_cfg , win.Url_box() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_url_type , IptEventType_.KeyUp, IptKey_.printableKeys_(IptKey_.Ary(IptKey_.Back, IptKey_.Escape, IptKey_.Ctrl.Add(IptKey_.X), IptKey_.Ctrl.Add(IptKey_.V)), IptKey_.Ary()));
}
private void Add_custom_bnds() { // NOTE: custom bnds are stored in cfg; cfg executes before Init_by_kit when all windows elements are null; run cfg now, while Init_by_kit is called and elems are now created
int len = startup_itms.Count();
for (int i = 0; i < len; i++) {
Xog_bnd_itm new_itm = (Xog_bnd_itm)startup_itms.Get_at(i);
try {
Xog_bnd_itm cur_itm = (Xog_bnd_itm)regy.Get_by(new_itm.Key());
if (cur_itm == null) {win.Usr_dlg().Warn_many("", "", "binding no longer exists; key=~{0}", new_itm.Key());} // could happen when breaking backward compatibility
cur_itm.Init_by_set(new_itm.Box(), new_itm.Ipt());
} catch (Exception e) {win.Usr_dlg().Warn_many("", "", "failed to set custom binding; key=~{0} err=~{1}", new_itm.Key(), Err_.Message_gplx_full(e));}
}
startup_itms.Clear();
}
private void Bind_all() {
this.Bind(Xog_bnd_box_.Tid_browser , win.Win_box());
this.Bind(Xog_bnd_box_.Tid_browser_url , win.Url_box());
this.Bind(Xog_bnd_box_.Tid_browser_find , win.Find_box());
this.Bind(Xog_bnd_box_.Tid_browser_search , win.Search_box());
this.Bind(Xog_bnd_box_.Tid_browser_prog , win.Prog_box());
this.Bind(Xog_bnd_box_.Tid_browser_info , win.Info_box());
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (String_.Eq(k, Run__show_remap_win)) {
Xog_bnd_win win = new Xog_bnd_win();
String[] args = m.ReadStrAry("v", "\n");
win.Show(app, app.Gui_mgr().Kit(), app.Gui_mgr().Browser_win().Win_box(), args[0], args[1], args[2]);
}
else {
String[] flds = gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_binding.To_ary(m.ReadStr("v"));
int box = Xog_bnd_box_.Xto_sys_int(flds[0]);
String key = String_.Replace(k, "xowa.gui.shortcuts.", "");
Xog_bnd_itm bnd = app.Gui_mgr().Bnd_mgr().Get_or_null(key);
Set(bnd, box, IptArg_.parse(flds[1]));
}
return this;
}
private static final String Run__show_remap_win = "xowa.gui.shortcuts.show_remap_win";
}

View File

@@ -0,0 +1,67 @@
/*
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.bnds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.ipts.*; import gplx.xowa.guis.cmds.*;
interface Xog_bnd_wkr {
void Bind_ipt_to_box(String box, String ipt);
}
class Xog_bnd_wkr__null implements Xog_bnd_wkr {
public void Bind_ipt_to_box(String box, String ipt) {}
}
class Xog_bnd_temp implements Gfo_invk {
private Xoae_app app;
private final Ordered_hash regy = Ordered_hash_.New();
private final Xog_bnd_wkr bnd_wkr = new Xog_bnd_wkr__null();
private Xog_bnd_box[] boxs = Xog_bnd_box_.Ary();
public void Init_by_app(Xoae_app app) {
this.app = app;
Init_itm(Xog_cmd_itm_.Key_gui_browser_tabs_new_dflt__at_dflt__focus_y , Xog_bnd_box_.Tid_browser , "mod.c+key.t");
}
private void Init_itm(String cmd, int box, String... ipts) {
int ipts_len = ipts.length;
for (int i = 0; i < ipts_len; i++) {
String ipt_str = ipts[i];
Init_itm(cmd, i, box, IptArg_.parse_or_none_(ipt_str));
}
}
// private void Init_itm(String cmd, int idx, int box, String ipt) {Init_itm(cmd, idx, box, IptArg_.parse_or_none_(ipt));}
private void Init_itm(String cmd, int idx, int box, IptArg ipt) {
String key = cmd + "-" + Int_.To_str(idx + List_adp_.Base1); // EX: xowa.widgets.url.focus-1 xowa.widgets.url.focus-2
Xog_bnd_itm itm = new Xog_bnd_itm(key, Bool_.Y, cmd, box, ipt);
boxs[box].Add(itm);
regy.Add(itm.Key(), itm);
app.Cfg().Bind_many_app(this, cmd);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
Xog_bnd_cfg_itm itm = Xog_bnd_cfg_itm.Parse(m.ReadStr("v"));
bnd_wkr.Bind_ipt_to_box(itm.Box(), itm.Ipt());
return this;
}
}
class Xog_bnd_cfg_itm {
public Xog_bnd_cfg_itm(String box, String ipt) {
this.box = box;
this.ipt = ipt;
}
public String Box() {return box;} private final String box;
public String Ipt() {return ipt;} private final String ipt;
public static Xog_bnd_cfg_itm Parse(String s) {
String[] parts = String_.Split(s, "|");
return new Xog_bnd_cfg_itm(parts[0], parts[1]);
}
}

View File

@@ -0,0 +1,108 @@
/*
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.bnds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.gfui.draws.*; import gplx.gfui.ipts.*; import gplx.gfui.kits.core.*; import gplx.gfui.envs.*; import gplx.gfui.controls.windows.*; import gplx.gfui.controls.elems.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.guis.cbks.*;
public class Xog_bnd_win implements Gfo_invk {
private GfuiWin win;
private GfuiTextBox shortcut_txt, binding_txt, keycode_txt;
private GfuiBtn clear_btn, ok_btn, cxl_btn;
private Gfui_bnd_parser bnd_parser = Gfui_bnd_parser.new_en_();
private Xoa_app app;
private String key_text;
public void Show(Xoa_app app, Gfui_kit kit, GfuiWin owner_win, String key_text, String shortcut_text, String binding_text) {
this.app = app;
this.key_text = key_text;
// create controls
this.win = kit.New_win_utl("shortcut_win", owner_win); win.BackColor_(ColorAdp_.White).Size_(240, 140);
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.clear_btn = Make_btn(kit, win, "clear_btn" , "Clear");
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);
clear_btn.Pos_(70, 70); 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 , clear_btn , this, Invk__when_clear , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , ok_btn , this, Invk__when_ok , btn_event_type, btn_args);
IptBnd_.ipt_to_(null_cfg , cxl_btn , this, Invk__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_.To_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).Border_on_();
}
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());
}
private final Xog_cbk_trg cbk_trg = Xog_cbk_trg.New(gplx.xowa.addons.apps.cfgs.specials.edits.pages.Xocfg_edit_special.Prototype.Special__meta().Ttl_bry());
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_clear)) binding_txt.Text_("None");
else if (ctx.Match(k, Invk__when_ok)) Remap_and_close(binding_txt.Text());
else if (ctx.Match(k, Invk__when_cxl)) {win.Close();}
else return Gfo_invk_.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_clear= "when_clear", Invk__when_ok = "when_ok", Invk__when_cxl = "when_cxl"
;
private void Remap_and_close(String new_ipt) {
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.gui_binding__remap_recv", gplx.core.gfobjs.Gfobj_nde.New().Add_str("key", key_text).Add_str("bnd", new_ipt));
win.Close();
}
}

View File

@@ -0,0 +1,32 @@
/*
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.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.gfobjs.*;
public class Xog_cbk_mgr { // INSTANCE:app
private Xog_cbk_wkr[] wkrs = Xog_cbk_wkr_.Ary_empty; private int wkrs_len = 0;
public void Reg(Xog_cbk_wkr wkr) {
this.wkrs = (Xog_cbk_wkr[])Array_.Resize_add_one(wkrs, wkrs_len, wkr);
++wkrs_len;
}
public void Send_json(Xog_cbk_trg trg, String func, Gfobj_nde data) {
for (int i = 0; i < wkrs_len; ++i) {
Xog_cbk_wkr wkr = wkrs[i];
wkr.Send_json(trg, func, data);
}
}
}

View File

@@ -0,0 +1,27 @@
/*
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.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_cbk_trg {
Xog_cbk_trg(byte tid, byte[] page_ttl) {this.tid = tid; this.page_ttl = page_ttl;}
public byte Tid() {return tid;} private final byte tid;
public byte[] Page_ttl() {return page_ttl;} private final byte[] page_ttl; // same as ttl.Full_db(); EX: Special:XowaDownloadCentral
public static final byte Tid__cbk_enabled = 0, Tid__specific_page = 1;
public static final Xog_cbk_trg Any = new Xog_cbk_trg(Tid__cbk_enabled, null);
public static Xog_cbk_trg New(byte[] page_ttl) {return new Xog_cbk_trg(Tid__specific_page, page_ttl);}
}

View File

@@ -0,0 +1,25 @@
/*
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.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.gfobjs.*;
public interface Xog_cbk_wkr {
Object Send_json(Xog_cbk_trg trg, String func, Gfobj_nde data);
}
class Xog_cbk_wkr_ {
public static final Xog_cbk_wkr[] Ary_empty = new Xog_cbk_wkr[0];
}

View File

@@ -0,0 +1,22 @@
/*
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.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.gfobjs.*;
public interface Xog_json_wkr {
void Send_json(String func, Gfobj_nde data);
}

View File

@@ -0,0 +1,59 @@
/*
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.cbks.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
import gplx.xowa.xtns.gallery.*;
import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*;
import gplx.xowa.guis.views.*; import gplx.xowa.parsers.lnkis.*;
public class Js_img_mgr {
public static void Update_link_missing(Xog_js_wkr html_itm, String html_id) {
html_itm.Html_redlink(html_id);
}
public static void Update_img(Xoa_page page, Xog_js_wkr js_wkr, Xof_file_itm itm) {
Js_img_mgr.Update_img(page, js_wkr, itm.Html_img_wkr(), itm.Html_uid(), itm.Lnki_type(), itm.Html_elem_tid(), itm.Html_w(), itm.Html_h(), itm.Html_view_url()
, itm.Orig_w(), itm.Orig_h(), itm.Orig_ext(), itm.Html_orig_url(), itm.Orig_ttl(), itm.Html_gallery_mgr_h());
}
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, Io_url html_view_url
, int orig_w, int orig_h, Xof_ext orig_ext, Io_url html_orig_url, byte[] lnki_ttl, int gallery_mgr_h) {
if (!page.Wiki().App().Mode().Tid_supports_js()) 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.Js_wkr__update_hdoc(page, js_wkr, uid, html_w, html_h, html_view_url, orig_w, orig_h, orig_ext, html_orig_url, lnki_ttl);
return;
}
String html_id = To_doc_uid(uid);
js_wkr.Html_img_update(html_id, html_view_url.To_http_file_str(), html_w, html_h);
if (Xop_lnki_type.Id_is_thumbable(lnki_type)) { // thumb needs to set cls and width
js_wkr.Html_atr_set(html_id, "class", gplx.xowa.htmls.core.wkrs.imgs.atrs.Xoh_img_cls_.Str__thumbimage);
js_wkr.Html_atr_set("xowa_file_div_" + uid, "style", "width:" + html_w + "px;");
}
switch (elem_tid) {
case Xof_html_elem.Tid_gallery:
js_wkr.Html_atr_set("xowa_gallery_div3_" + uid, "style", "margin:" + Gallery_mgr_wtr_.Calc_vpad(gallery_mgr_h, html_h) + "px auto;");
break;
case Xof_html_elem.Tid_imap:
img_wkr.Js_wkr__update_hdoc(page, js_wkr, uid, html_w, html_h, html_view_url, orig_w, orig_h, orig_ext, html_orig_url, lnki_ttl);
break;
case Xof_html_elem.Tid_vid:
String html_id_vid = "xowa_file_play_" + uid;
js_wkr.Html_atr_set(html_id_vid, "style", "width:" + html_w + "px;max-width:" + (html_w - 2) + "px;");
js_wkr.Html_atr_set(html_id_vid, "href", html_orig_url.To_http_file_str());
break;
}
}
public static String To_doc_uid(int html_uid) {return gplx.xowa.htmls.Xoh_img_mgr.Str__html_uid + Int_.To_str(html_uid);}
}

View File

@@ -0,0 +1,23 @@
/*
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.cbks.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
import gplx.xowa.files.*;
public interface Js_img_wkr {
void Js_wkr__update_hdoc(Xoa_page page, Xog_js_wkr js_wkr, int html_uid, int html_w, int html_h, Io_url html_view_url
, int orig_w, int orig_h, Xof_ext orig_ext, Io_url html_orig_url, byte[] lnki_ttl);
}

View File

@@ -0,0 +1,29 @@
/*
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.cbks.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
public interface Xog_js_wkr {
void Html_img_update (String uid, String src, int w, int h);
void Html_redlink (String html_uid);
void Html_atr_set (String uid, String key, String val);
void Html_elem_replace_html (String uid, String html);
void Html_elem_append_above (String uid, String html);
void Html_elem_delete (String elem_id);
void Html_gallery_packed_exec ();
void Html_popups_bind_hover_to_doc ();
}

View File

@@ -0,0 +1,31 @@
/*
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.cbks.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
public class Xog_js_wkr_ {
public static final Xog_js_wkr Noop = new Xog_js_wkr__noop();
}
class Xog_js_wkr__noop implements Xog_js_wkr {
public void Html_img_update (String uid, String src, int w, int h) {}
public void Html_atr_set (String uid, String key, String val) {}
public void Html_elem_replace_html (String uid, String html) {}
public void Html_elem_append_above (String uid, String html) {}
public void Html_redlink (String html_uid) {}
public void Html_elem_delete (String elem_id) {}
public void Html_gallery_packed_exec() {}
public void Html_popups_bind_hover_to_doc() {}
}

View File

@@ -0,0 +1,38 @@
/*
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.cbks.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
public class Xog_js_wkr__log implements Xog_js_wkr {
private final List_adp log_list = List_adp_.New();
public void Html_img_update (String uid, String src, int w, int h) {log_list.Add(Object_.Ary(Proc_img_update, uid, src, w, h));}
public void Html_atr_set (String uid, String key, String val) {log_list.Add(Object_.Ary(Proc_atr_set, uid, key, val));}
public void Html_redlink (String uid) {log_list.Add(Object_.Ary(Proc_redlink, uid));}
public void Html_elem_replace_html (String uid, String html) {log_list.Add(Object_.Ary(Proc_replace_html, uid, html));}
public void Html_elem_append_above (String uid, String html) {log_list.Add(Object_.Ary(Proc_append_above, uid, html));}
public void Html_elem_delete (String elem_id) {log_list.Add(Object_.Ary(Proc_delete, elem_id));}
public void Html_gallery_packed_exec() {log_list.Add(Object_.Ary(Proc_gallery_packed_exec));}
public void Html_popups_bind_hover_to_doc() {log_list.Add(Object_.Ary(Proc_popups_bind_hover_to_doc));}
public void Log__clear() {log_list.Clear();}
public int Log__len() {return log_list.Count();}
public Object[] Log__get_at(int i) {return (Object[])log_list.Get_at(i);}
public static final String
Proc_img_update = "img_update", Proc_atr_set = "atr_set", Proc_redlink = "redlink", Proc_replace_html = "replace_html"
, Proc_append_above = "append_above", Proc_delete = "delete", Proc_gallery_packed_exec = "gallery_packed_exec", Proc_popups_bind_hover_to_doc = "popups_bind_hover_to_doc"
;
}

View File

@@ -0,0 +1,34 @@
/*
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.cbks.swts; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
import gplx.core.logs.*; import gplx.core.gfobjs.*; import gplx.xowa.guis.cbks.*;
public class Gfo_log__swt extends Gfo_log__file { private final Xog_cbk_mgr cbk_mgr;
public Gfo_log__swt(Xog_cbk_mgr cbk_mgr, Io_url url, Gfo_log_itm_wtr fmtr) {super(url, fmtr);this.cbk_mgr = cbk_mgr;}
@Override public void Exec(byte type, long time, long elapsed, String msg, Object[] args) {
if (type == Gfo_log_itm.Type__prog) return;
super.Exec(type, time, elapsed, msg, args);
Gfobj_nde nde = Gfobj_nde.New().Add_str("msg", msg);
int args_len = args.length;
for (int i = 0; i < args_len; i += 2) {
String key = Object_.Xto_str_strict_or_null_mark(args[i]);
Object val = i + 1 < args_len ? args[i + 1] : "<<NULL>>";
nde.Add_str(key, Object_.Xto_str_strict_or_null_mark(val));
}
cbk_mgr.Send_json(Xog_cbk_trg.Any, "xo.log.add__recv", nde);
}
}

View File

@@ -0,0 +1,40 @@
/*
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.cbks.swts; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
import gplx.core.gfobjs.*;
public class Gfobj_wtr__json__browser extends Gfobj_wtr__json { private final Bry_bfr bfr;
public Gfobj_wtr__json__browser() {
this.Opt_ws_(Bool_.N).Opt_backslash_2x_(Bool_.Y);
this.bfr = this.Bfr();
}
public String Write_as_func__swt(String func_name, Gfobj_grp root) {return Write_as_func(Bool_.Y, func_name, root);}
public String Write_as_func__drd(String func_name, Gfobj_grp root) {return Write_as_func(Bool_.N, func_name, root);}
private String Write_as_func(boolean write_return, String func_name, Gfobj_grp root) {
if (write_return) bfr.Add(Bry__func_bgn); // NOTE: Android WebView fails if return is passed; EX: "return 'true'" works on SWT.Browser, but not WebView
bfr.Add_str_u8(func_name);
bfr.Add(Bry__args_bgn);
this.Write(root);
bfr.Add(Bry__args_end);
return this.To_str();
}
private static final byte[]
Bry__func_bgn = Bry_.new_a7("return ")
, Bry__args_bgn = Bry_.new_a7("('")
, Bry__args_end = Bry_.new_a7("');")
;
}

View File

@@ -0,0 +1,41 @@
/*
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.cbks.swts; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
import org.junit.*; import gplx.core.tests.*;
import gplx.core.gfobjs.*;
public class Gfobj_wtr__json__browser__tst {
private final Gfobj_wtr__json__browser__fxt fxt = new Gfobj_wtr__json__browser__fxt();
@Test public void Json_proc() {
fxt.Test__json_proc
( "proc_name"
, fxt.Make__nde
( fxt.Make__fld_str ("k1", "v1")
, fxt.Make__fld_long ("k2", 2)
, fxt.Make__fld_int ("k3", 3)
)
, "return proc_name('{\"k1\":\"v1\",\"k2\":2,\"k3\":3}');"
);
}
}
class Gfobj_wtr__json__browser__fxt extends Gfobj_wtr__json_fxt { public Gfobj_wtr__json__browser__fxt Test__json_proc() {return this;}
public void Test__json_proc(String proc_name, Gfobj_nde root, String expd) {
Gfobj_wtr__json__browser wtr = new Gfobj_wtr__json__browser();
String actl = wtr.Write_as_func__swt(proc_name, root);
Gftest.Eq__str(expd, actl, "json_write");
}
}

View File

@@ -0,0 +1,64 @@
/*
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.cbks.swts; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
import gplx.core.gfobjs.*;
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*;
public class Xog_cbk_wkr__swt implements Xog_cbk_wkr {
private final Xoa_gui_mgr gui_mgr;
private final Xog_browser_func browser_func;
private final Gfobj_wtr__json__browser json_wtr = new Gfobj_wtr__json__browser();
public Xog_cbk_wkr__swt(Xoa_gui_mgr gui_mgr) {
this.gui_mgr = gui_mgr;
this.browser_func = new Xog_browser_func();
}
public Object Send_json(Xog_cbk_trg trg, String func, Gfobj_nde data) {
if (gui_mgr.Kit().Tid() != Gfui_kit_.Swt_tid) return null; // guard against calling when HTTP_server
String script = json_wtr.Write_as_func__swt(func, data);
GfuiInvkCmd swt_cmd = gui_mgr.Kit().New_cmd_sync(browser_func.Script_(script));
Xog_tab_mgr tab_mgr = gui_mgr.Browser_win().Tab_mgr();
int tabs_len = tab_mgr.Tabs_len();
Object rv = null;
for (int i = 0; i < tabs_len; ++i) {
Xog_tab_itm tab = tab_mgr.Tabs_get_at(i);
Xoa_page page = tab.Page();
boolean match = false;
switch (trg.Tid()) {
case Xog_cbk_trg.Tid__cbk_enabled:
match = page.Html_data().Cbk_enabled();
break;
case Xog_cbk_trg.Tid__specific_page:
match = Bry_.Eq(trg.Page_ttl(), page.Ttl().Full_db_wo_qarg()); // NOTE: ignore qargs to handle Special:XowaCfg?grp=some_grp; DATE:2016-12-28
break;
}
if (match) {
browser_func.Tab_(tab);
rv = Gfo_invk_.Invk_no_key(swt_cmd);
if (rv == null && !String_.Eq(func, "xo.log.add__recv")) throw Err_.new_("gplx.swt", "send_json was not acknowledged", "func", func, "script", script);
}
}
return rv;
}
}
class Xog_browser_func implements Gfo_invk {
private String script;
public Xog_browser_func Script_(String v) {this.script = v; return this;}
public void Tab_(Xog_tab_itm v) {this.tab = v;} private Xog_tab_itm tab;
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
return tab.Html_box().Html_js_eval_script_as_obj(script);
}
}

View File

@@ -0,0 +1,71 @@
/*
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.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_cmd_ctg {
public Xog_cmd_ctg(int tid, String key_str) {this.tid = tid; this.key_str = key_str; this.key_bry = Bry_.new_u8(key_str);}
public int Tid() {return tid;} private int tid;
public String Key_str() {return key_str;} private String key_str;
public byte[] Key_bry() {return key_bry;} private byte[] key_bry;
public String Name() {return name;} public Xog_cmd_ctg Name_(String v) {name = v; return this;} private String name;
public String Info() {return info;} public Xog_cmd_ctg Info_(String v) {info = v; return this;} private String info;
}
class Xog_ctg_itm_ {
public static final int
Tid__max = 15
, Tid_null = 0
, Tid_app = 1
, Tid_nav = 1
, Tid_nav_pages = 2
, Tid_font = 3
, Tid_page = 4
, Tid_edit = 5
, Tid_selection = 6
, Tid_browser = 7
, Tid_tabs = 8
, Tid_html = 9
, Tid_net = 10
, Tid_bookmarks = 11
, Tid_history = 12
, Tid_xtns = 13
, Tid_custom = 14
;
public static final Xog_cmd_ctg[] Ary = new Xog_cmd_ctg[Tid__max];
public static final Xog_cmd_ctg
Itm_null = new_(Tid_null , "xowa.null")
, Itm_app = new_(Tid_app , "xowa.app")
, Itm_nav = new_(Tid_nav , "xowa.nav")
, Itm_nav_pages = new_(Tid_nav_pages , "xowa.nav.pages")
, Itm_font = new_(Tid_font , "xowa.font")
, Itm_page = new_(Tid_page , "xowa.page")
, Itm_edit = new_(Tid_edit , "xowa.edit")
, Itm_selection = new_(Tid_selection , "xowa.selection")
, Itm_browser = new_(Tid_browser , "xowa.browser")
, Itm_tabs = new_(Tid_tabs , "xowa.tabs")
, Itm_html = new_(Tid_html , "xowa.html")
, Itm_net = new_(Tid_net , "xowa.net")
, Itm_bookmarks = new_(Tid_bookmarks , "xowa.bookmarks")
, Itm_history = new_(Tid_history , "xowa.history")
, Itm_xtns = new_(Tid_xtns , "xowa.xtns")
, Itm_custom = new_(Tid_custom , "custom")
;
private static Xog_cmd_ctg new_(int tid, String code) {
Xog_cmd_ctg rv = new Xog_cmd_ctg(tid, code);
Ary[tid] = rv;
return rv;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_cmd_itm {
public Xog_cmd_itm(String key, Xog_cmd_ctg ctg, String cmd) {
this.key = key; this.ctg = ctg; this.cmd = cmd;
this.key_bry = Bry_.new_u8(key);
this.uid = ++Uid_next;
}
public int Uid() {return uid;} private int uid;
public String Key() {return key;} private String key;
public byte[] Key_bry() {return key_bry;} private byte[] key_bry;
public Xog_cmd_ctg Ctg() {return ctg;} private Xog_cmd_ctg ctg;
public String Cmd() {return cmd;} public Xog_cmd_itm Cmd_(String v) {cmd = v; return this;} private String cmd;
public String Name() {return name;} public Xog_cmd_itm Name_(String v) {name = v; return this;} private String name;
public String Name_or_missing() {return name == null ? "<" + name + ">" : name;}
public String Tip() {return tip;} public Xog_cmd_itm Tip_(String v) {tip = v; return this;} private String tip;
public String Tip_or_missing() {return tip == null ? "<" + tip + ">" : tip;}
private static int Uid_next = 0;
}

View File

@@ -0,0 +1,174 @@
/*
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.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_cmd_itm_ {
private static final Ordered_hash regy = Ordered_hash_.New(); // NOTE: must be defined at top
public static final String
Key_app_exit = new_dflt_(Xog_ctg_itm_.Tid_app , "xowa.app.exit")
, Key_nav_go_bwd = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.go_bwd")
, Key_nav_go_fwd = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.go_fwd")
, Key_nav_cfg_main = new_page_(Xog_ctg_itm_.Tid_nav , "xowa.nav.cfg.main" , "home/wiki/Options") // HOME
, Key_nav_cfg_menu = new_page_(Xog_ctg_itm_.Tid_nav , "xowa.nav.cfg.menus" , "home/wiki/Options/Menus") // HOME
, Key_nav_wiki_main_page = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.wiki.main_page")
, Key_nav_wiki_sandbox = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.wiki.sandbox")
, Key_nav_wiki_random = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.wiki.random")
, Key_nav_help_help = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.help" , "home/wiki/Help/Contents") // HOME
, Key_nav_help_about = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.about" , "home/wiki/Help/About") // HOME
, Key_nav_help_change_log = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.change_log" , "home/wiki/Change_log") // HOME
, Key_nav_help_diagnostics = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.diagnostics" , "home/wiki/Diagnostics") // HOME
, Key_nav_help_xowa_update = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.xowa_update" , "home/wiki/Special:XowaAppUpdate") // HOME
, Key_nav_help_xowa_main = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.xowa_main" , "home/wiki/Main_Page") // HOME
, Key_nav_help_xowa_blog = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.xowa_blog" , "home/wiki/Blog") // HOME
, Key_nav_setup_download_central = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.download_central" , "home/wiki/Special:XowaDownloadCentral") // HOME
, Key_nav_setup_import_from_list = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.import_from_list" , "home/wiki/Dashboard/Import/Online") // HOME
, Key_nav_setup_import_from_script = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.import_from_script" , "home/wiki/Dashboard/Import/Offline") // HOME
, Key_nav_setup_maintenance = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.maintenance" , "home/wiki/Dashboard/Wiki_maintenance") // HOME
, Key_nav_setup_download = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.download" , "home/wiki/Dashboard/Image_databases") // HOME
, Key_nav_system_data_log_session = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.system_data.log_session" , "Special:XowaSystemData?type=log_session")
, Key_nav_system_data_cfg_app = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.system_data.cfg_app" , "Special:XowaSystemData?type=cfg_app")
, Key_nav_system_data_cfg_lang = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.system_data.cfg_lang" , "Special:XowaSystemData?type=cfg_lang")
, Key_nav_system_data_usr_history = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.system_data.usr_history" , "Special:XowaSystemData?type=usr_history")
, Key_gui_font_increase = new_dflt_(Xog_ctg_itm_.Tid_font , "xowa.gui.font.increase")
, Key_gui_font_decrease = new_dflt_(Xog_ctg_itm_.Tid_font , "xowa.gui.font.decrease")
, Key_gui_font_reset = new_dflt_(Xog_ctg_itm_.Tid_font , "xowa.gui.font.reset")
, Key_gui_page_view_mode_read = new_dflt_(Xog_ctg_itm_.Tid_page , "xowa.gui.page.view.mode_read")
, Key_gui_page_view_mode_edit = new_dflt_(Xog_ctg_itm_.Tid_page , "xowa.gui.page.view.mode_edit")
, Key_gui_page_view_mode_html = new_dflt_(Xog_ctg_itm_.Tid_page , "xowa.gui.page.view.mode_html")
, Key_gui_page_view_refresh = new_dflt_(Xog_ctg_itm_.Tid_page , "xowa.gui.page.view.refresh")
, Key_gui_page_view_reload = new_dflt_(Xog_ctg_itm_.Tid_page , "xowa.gui.page.view.reload")
, Key_gui_page_view_save_as = new_dflt_(Xog_ctg_itm_.Tid_page , "xowa.gui.page.view.save_as")
, Key_gui_page_view_print = new_dflt_(Xog_ctg_itm_.Tid_page , "xowa.gui.page.view.print")
, Key_gui_page_selection_select_all = new_dflt_(Xog_ctg_itm_.Tid_selection , "xowa.gui.page.selection.select_all")
, Key_gui_page_selection_copy = new_dflt_(Xog_ctg_itm_.Tid_selection , "xowa.gui.page.selection.copy")
, Key_gui_page_selection_save_file_as = new_dflt_(Xog_ctg_itm_.Tid_selection , "xowa.gui.page.selection.save_file_as")
, Key_gui_edit_save = new_dflt_(Xog_ctg_itm_.Tid_edit , "xowa.gui.page.edit.save")
, Key_gui_edit_save_draft = new_dflt_(Xog_ctg_itm_.Tid_edit , "xowa.gui.page.edit.save_draft")
, Key_gui_edit_focus_edit_box = new_dflt_(Xog_ctg_itm_.Tid_edit , "xowa.gui.page.edit.focus_edit_box")
, Key_gui_edit_preview = new_dflt_(Xog_ctg_itm_.Tid_edit , "xowa.gui.page.edit.preview")
, Key_gui_edit_dbg_tmpl = new_dflt_(Xog_ctg_itm_.Tid_edit , "xowa.gui.page.edit.dbg_tmpl")
, Key_gui_edit_dbg_html = new_dflt_(Xog_ctg_itm_.Tid_edit , "xowa.gui.page.edit.dbg_html")
, Key_gui_edit_exec = new_dflt_(Xog_ctg_itm_.Tid_edit , "xowa.gui.page.edit.exec")
, Key_gui_browser_url_focus = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.focus")
, Key_gui_browser_url_exec = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.exec")
, Key_gui_browser_url_exec_by_paste = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.exec_by_paste")
, Key_gui_browser_url_exec_new_tab_by_paste = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.exec_new_tab_by_paste")
, Key_gui_browser_url_restore = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.restore")
, Key_gui_browser_url_type = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.type")
, Key_gui_browser_search_focus = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.search.focus")
, Key_gui_browser_search_exec = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.search.exec")
, Key_gui_browser_tabs_new_dflt__at_dflt__focus_y = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.new_dflt__at_dflt__focus_y")
, Key_gui_browser_tabs_new_link__at_dflt__focus_n = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.new_link__at_dflt__focus_n")
, Key_gui_browser_tabs_new_link__at_dflt__focus_y = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.new_link__at_dflt__focus_y")
, Key_gui_browser_tabs_new_href__at_dflt__focus_y = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.new_href__at_dflt__focus_y")
, Key_gui_browser_tabs_new_dupe__at_dflt__focus_y = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.new_dupe__at_dflt__focus_y")
, Key_gui_browser_tabs_select_bwd = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_bwd")
, Key_gui_browser_tabs_select_fwd = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_fwd")
, Key_gui_browser_tabs_select_by_idx_1 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_1")
, Key_gui_browser_tabs_select_by_idx_2 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_2")
, Key_gui_browser_tabs_select_by_idx_3 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_3")
, Key_gui_browser_tabs_select_by_idx_4 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_4")
, Key_gui_browser_tabs_select_by_idx_5 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_5")
, Key_gui_browser_tabs_select_by_idx_6 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_6")
, Key_gui_browser_tabs_select_by_idx_7 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_7")
, Key_gui_browser_tabs_select_by_idx_8 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_8")
, Key_gui_browser_tabs_select_by_idx_9 = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.select_by_idx_9")
, Key_gui_browser_tabs_move_bwd = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.move_bwd")
, Key_gui_browser_tabs_move_fwd = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.move_fwd")
, Key_gui_browser_tabs_close_cur = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.close_cur")
, Key_gui_browser_tabs_close_others = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.close_others")
, Key_gui_browser_tabs_close_to_bgn = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.close_to_bgn")
, Key_gui_browser_tabs_close_to_end = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.close_to_end")
, Key_gui_browser_tabs_close_undo = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.close_undo")
, Key_gui_browser_tabs_pin_toggle = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.pin_toggle")
, Key_gui_browser_html_focus = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.html.focus")
, Key_gui_browser_html_selection_focus_toggle = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.html.selection_focus_toggle")
, Key_gui_browser_find_show = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.show")
, Key_gui_browser_find_show_by_paste = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.show_by_paste")
, Key_gui_browser_find_hide = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.hide")
, Key_gui_browser_find_exec = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.exec")
, Key_gui_browser_find_type = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.type")
, Key_gui_browser_find_find_fwd = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.find_fwd")
, Key_gui_browser_find_find_bwd = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.find_bwd")
, Key_gui_browser_find_case_toggle = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.case_toggle")
, Key_gui_browser_find_wrap_toggle = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.find.wrap_toggle")
, Key_gui_browser_prog_focus = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.prog.focus")
, Key_gui_browser_prog_log_show = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.prog_log.show")
, Key_gui_browser_info_focus = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.info.focus")
, Key_gui_browser_info_clear = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.info.clear")
, Key_gui_menus_group_file = "xowa.gui.menus.group.file"
, Key_gui_menus_group_edit = "xowa.gui.menus.group.edit"
, Key_gui_menus_group_view = "xowa.gui.menus.group.view"
, Key_gui_menus_group_history = "xowa.gui.menus.group.history"
, Key_gui_menus_group_bookmarks = "xowa.gui.menus.group.bookmarks"
, Key_gui_menus_group_tools = "xowa.gui.menus.group.tools"
, Key_gui_menus_group_tools_wikis = "xowa.gui.menus.group.tools.wikis"
, Key_gui_menus_group_help = "xowa.gui.menus.group.help"
, Key_gui_menus_group_system_data = "xowa.gui.menus.group.system_data"
, Key_gui_menus_group_tabs = "xowa.gui.menus.group.tabs"
, Key_html_tidy_toggle = new_dflt_(Xog_ctg_itm_.Tid_html , "xowa.html.tidy.toggle")
, Key_html_tidy_engine_tidy_ = new_dflt_(Xog_ctg_itm_.Tid_html , "xowa.html.tidy.engine_tidy_")
, Key_html_tidy_engine_jtidy_ = new_dflt_(Xog_ctg_itm_.Tid_html , "xowa.html.tidy.engine_jtidy_")
, Key_net_enabled = new_dflt_(Xog_ctg_itm_.Tid_net , "xowa.net.enabled")
, Key_net_enabled_n_ = new_dflt_(Xog_ctg_itm_.Tid_net , "xowa.net.enabled_n_")
, Key_net_enabled_y_ = new_dflt_(Xog_ctg_itm_.Tid_net , "xowa.net.enabled_y_")
, Key_net_enabled_x_ = new_dflt_(Xog_ctg_itm_.Tid_net , "xowa.net.enabled_x_")
, Key_usr_bookmarks_add = new_dflt_(Xog_ctg_itm_.Tid_bookmarks , "xowa.usr.bookmarks.add")
, Key_usr_bookmarks_show = new_dflt_(Xog_ctg_itm_.Tid_bookmarks , "xowa.usr.bookmarks.show")
, Key_usr_history_goto_recent = new_dflt_(Xog_ctg_itm_.Tid_history , "xowa.usr.history.goto_recent")
, Key_usr_history_show = new_page_(Xog_ctg_itm_.Tid_history , "xowa.usr.history.show" , "home/wiki/Special:XowaPageHistory")
, Key_xtns_scribunto_engine_lua_ = new_dflt_(Xog_ctg_itm_.Tid_xtns , "xowa.xtns.scribunto.engine_lua_")
, Key_xtns_scribunto_engine_luaj_ = new_dflt_(Xog_ctg_itm_.Tid_xtns , "xowa.xtns.scribunto.engine_luaj_")
;
private static String new_dflt_(int ctg, String key) {return new_text_(ctg, key, "app.api." + String_.Mid(key, 5) + ";");} // 5 to skip "xowa."
private static String new_page_(int ctg, String key, String page) {return new_text_(ctg, key, "app.api.nav.goto(\"" + page + "\");");}
private static String new_text_(int ctg, String key, String text) {
Xog_cmd_ctg ctg_itm = Xog_ctg_itm_.Ary[ctg];
regy.Add(key, new Xog_cmd_itm(key, ctg_itm, text));
return key;
}
public static int Regy_len() {return regy.Count();}
public static Xog_cmd_itm Regy_get_at(int i) {return (Xog_cmd_itm)regy.Get_at(i);}
public static Xog_cmd_itm Regy_get_or_null(String key) {return (Xog_cmd_itm)regy.Get_by(key);}
public static void Regy_add(Xog_cmd_itm itm) {regy.Add(itm.Key(), itm);}
public static final byte[]
Msg_pre_api = Bry_.new_a7("api-")
, Msg_pre_ctg = Bry_.new_a7("api.ctg-")
, Msg_suf_name = Bry_.new_a7("-name")
, Msg_suf_tip = Bry_.new_a7("-tip")
, Msg_suf_letter = Bry_.new_a7("-letter")
, Msg_suf_image = Bry_.new_a7("-image")
;
}

View File

@@ -0,0 +1,58 @@
/*
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.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.xowa.apps.apis.xowa.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
public class Xog_cmd_mgr {
public void Init_by_kit(Xoae_app app) {
invk_mgr.Ctor(app, this);
Load_ctg_msgs(app);
Load_cmd_msgs(app);
}
public Xog_cmd_mgr_invk Invk_mgr() {return invk_mgr;} private Xog_cmd_mgr_invk invk_mgr = new Xog_cmd_mgr_invk();
private void Load_ctg_msgs(Xoae_app app) {
Xog_cmd_ctg[] ary = Xog_ctg_itm_.Ary;
int len = ary.length;
Xol_lang_itm lang = app.Usere().Lang();
for (int i = 0; i < len; i++) {
Xog_cmd_ctg itm = ary[i];
itm.Name_(Xol_msg_mgr_.Get_msg_val_gui_or_null(app.Lang_mgr(), lang, Xog_cmd_itm_.Msg_pre_ctg, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_name));
}
}
private void Load_cmd_msgs(Xoae_app app) {
int len = this.Len();
Xol_lang_itm lang = app.Usere().Lang();
for (int i = 0; i < len; i++) {
Xog_cmd_itm itm = this.Get_at(i);
itm.Name_(Xol_msg_mgr_.Get_msg_val_gui_or_null(app.Lang_mgr(), lang, Xog_cmd_itm_.Msg_pre_api, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_name));
itm.Tip_(Xol_msg_mgr_.Get_msg_val_gui_or_null(app.Lang_mgr(), lang, Xog_cmd_itm_.Msg_pre_api, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_tip));
}
}
public int Len() {return Xog_cmd_itm_.Regy_len();}
public Xog_cmd_itm Get_at(int i) {return Xog_cmd_itm_.Regy_get_at(i);}
public Xog_cmd_itm Get_or_null(String key) {return Xog_cmd_itm_.Regy_get_or_null(key);}
public Xog_cmd_itm Get_or_make(String key) {
Xog_cmd_itm rv = Xog_cmd_itm_.Regy_get_or_null(key);
if (rv == null) {
rv = new Xog_cmd_itm(key, Xog_ctg_itm_.Itm_custom, null); // pass null for cmd; will be filled in
Xog_cmd_itm_.Regy_add(rv);
}
return rv;
}
// public Xog_cmd_regy Regy() {return regy;} private Xog_cmd_regy regy = new Xog_cmd_regy();
}

View File

@@ -0,0 +1,27 @@
/*
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.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_cmd_mgr_invk implements Gfo_invk {
private Xoae_app app; private Xog_cmd_mgr cmd_mgr;
public void Ctor(Xoae_app app, Xog_cmd_mgr cmd_mgr) {this.app = app; this.cmd_mgr = cmd_mgr;}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
Xog_cmd_itm cmd_itm = cmd_mgr.Get_or_null(k);
if (cmd_itm == null) return Gfo_invk_.Rv_unhandled;
return app.Gfs_mgr().Run_str(cmd_itm.Cmd());
}
}

View File

@@ -0,0 +1,52 @@
/*
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.history; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_history_itm {
private final boolean redirect_force;
public Xog_history_itm(byte[] wiki, byte[] page, byte[] anch, byte[] qarg, boolean redirect_force, String bmk_pos) {
this.key = Bry_.Add_w_dlm(Byte_ascii.Pipe, wiki, page, anch, qarg, redirect_force ? Bool_.Y_bry : Bool_.N_bry);
this.wiki = wiki; this.page = page; this.anch = anch; this.qarg = qarg;
this.redirect_force = redirect_force; this.bmk_pos = bmk_pos;
}
public byte[] Key() {return key;} private final byte[] key;
public byte[] Wiki() {return wiki;} private final byte[] wiki;
public byte[] Page() {return page;} private final byte[] page;
public byte[] Anch() {return anch;} private final byte[] anch;
public byte[] Qarg() {return qarg;} private final byte[] qarg;
public String Bmk_pos() {return bmk_pos;} public void Bmk_pos_(String v) {bmk_pos = v;} private String bmk_pos;
public boolean Eq_wo_bmk_pos(Xog_history_itm comp) {
return Bry_.Eq(wiki, comp.wiki)
&& Bry_.Eq(page, comp.page)
&& Bry_.Eq(anch, comp.anch)
&& Bry_.Eq(qarg, comp.qarg)
&& redirect_force == comp.redirect_force
;
}
public void Srl_save(Bry_bfr bfr) {
byte[] bmk_bry = Bry_.Replace(Bry_.new_u8(bmk_pos), Byte_ascii.Pipe, Byte_ascii.Tilde); // replace | with ~; EX: "0|1|2" -> "0~1~2"
bfr.Add(key).Add_byte_pipe().Add(bmk_bry).Add_byte_nl();
}
public static Xog_history_itm Srl_load(byte[] raw) {
byte[][] atrs = Bry_split_.Split(raw, Byte_ascii.Pipe);
byte[] bmk_bry = atrs.length == 6 ? atrs[5] : Bry_.Empty;
bmk_bry = Bry_.Replace(bmk_bry, Byte_ascii.Tilde, Byte_ascii.Pipe);
return new Xog_history_itm(atrs[0], atrs[1], atrs[2], atrs[3], atrs[4] == Bool_.Y_bry, String_.new_a7(bmk_bry));
}
public static final String Html_doc_pos_toc = "top";
public static final Xog_history_itm Null = new Xog_history_itm(null, null, null, null, false, null);
}

View File

@@ -0,0 +1,77 @@
/*
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.history; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_history_mgr {
private final Ordered_hash hash = Ordered_hash_.New_bry(); private final Xog_history_stack stack = new Xog_history_stack();
public int Count() {return hash.Count();}
public Xoae_page Cur_page(Xowe_wiki wiki) {return Get_or_fetch(wiki, stack.Cur_itm());}
public Xoae_page Go_bwd(Xowe_wiki wiki) {return Go_by_dir(wiki, Bool_.N);}
public Xoae_page Go_fwd(Xowe_wiki wiki) {return Go_by_dir(wiki, Bool_.Y);}
public Xoae_page Go_by_dir(Xowe_wiki wiki, boolean fwd) {
Xog_history_itm itm = fwd ? stack.Go_fwd() : stack.Go_bwd();
if (itm == Xog_history_itm.Null) return Xoae_page.Empty;
Xoae_page rv = Get_or_fetch(wiki, itm);
byte[] anch_key = itm.Anch();
rv.Url().Anch_bry_(anch_key); // must override anchor as it may be different for cached page
rv.Html_data().Bmk_pos_(itm.Bmk_pos());
return rv;
}
public void Add(Xoae_page page) {
Xog_history_itm new_itm = Xog_history_mgr.new_(page);
stack.Add(new_itm);
byte[] page_key = Build_page_key(page);
if (!hash.Has(page_key))
hash.Add(page_key, page);
}
public void Update_html_doc_pos(Xoae_page page, byte history_nav_type) {
Xog_history_itm itm = Get_recent(page, history_nav_type);
if (itm != null) itm.Bmk_pos_(page.Html_data().Bmk_pos());
}
private Xog_history_itm Get_recent(Xoae_page page, byte history_nav_type) {
int pos = -1;
int list_pos = stack.Cur_pos();
switch (history_nav_type) {
case Xog_history_stack.Nav_fwd: pos = list_pos - 1; break;
case Xog_history_stack.Nav_bwd: pos = list_pos + 1; break;
case Xog_history_stack.Nav_by_anchor: pos = list_pos; break;
}
if (pos < 0 || pos >= stack.Len()) return null;
Xog_history_itm recent = stack.Get_at(pos);
Xog_history_itm page_itm = Xog_history_mgr.new_(page);
return page_itm.Eq_wo_bmk_pos(recent) ? recent : null; // check that recent page actually matches current; DATE:2014-05-10
}
private Xoae_page Get_or_fetch(Xowe_wiki wiki, Xog_history_itm itm) {
byte[] page_key = Build_page_key(itm.Wiki(), itm.Page(), itm.Qarg());
Xoae_page rv = (Xoae_page)hash.Get_by(page_key);
if (rv != null) return rv;
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, itm.Page());
return wiki.Data_mgr().Load_page_by_ttl(ttl);
}
private static byte[] Build_page_key(Xoae_page page) {return Build_page_key(page.Wiki().Domain_bry(), page.Ttl().Full_url(), page.Url().Qargs_mgr().To_bry());}
private static byte[] Build_page_key(byte[] wiki_key, byte[] page_key, byte[] args_key) {return Bry_.Add_w_dlm(Byte_ascii.Pipe, wiki_key, page_key, args_key);}
public static Xog_history_itm new_(Xoae_page pg) {
byte[] wiki = pg.Wiki().Domain_bry();
byte[] page = pg.Ttl().Full_url(); // get page_name only (no anchor; no query args)
byte[] anch = pg.Url().Anch_bry();
byte[] qarg = pg.Url().Qargs_mgr().To_bry();
boolean redirect_force = pg.Url().Qargs_mgr().Match(Xoa_url_.Qarg__redirect, Xoa_url_.Qarg__redirect__no);
String bmk_pos = pg.Html_data().Bmk_pos();
if (bmk_pos == null) bmk_pos = Xog_history_itm.Html_doc_pos_toc; // never allow null doc_pos; set to top
return new Xog_history_itm(wiki, page, anch, qarg, redirect_force, bmk_pos);
}
}

View File

@@ -0,0 +1,70 @@
/*
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.history; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_history_stack {
private final List_adp list = List_adp_.New();
public int Len() {return list.Count();}
public void Clear() {list.Clear(); cur_pos = 0;}
public Xog_history_itm Get_at(int i) {return (Xog_history_itm)list.Get_at(i);}
public int Cur_pos() {return cur_pos;} private int cur_pos = 0;
public Xog_history_itm Cur_itm() {return list.Count() == 0 ? Xog_history_itm.Null : (Xog_history_itm)list.Get_at(cur_pos);}
public void Add(Xog_history_itm new_itm) {
Xog_history_itm cur_itm = this.Cur_itm();
if (cur_itm != Xog_history_itm.Null && cur_itm.Eq_wo_bmk_pos(new_itm)) return; // do not add if last itm is same;
this.Del_from(cur_pos + 1);
list.Add(new_itm);
cur_pos = list.Count() - 1;
}
public Xog_history_itm Go_bwd() {
if (list.Count() == 0) return Xog_history_itm.Null;
if (cur_pos == 0) return Xog_history_itm.Null;
--cur_pos;
return this.Cur_itm();
}
public Xog_history_itm Go_fwd() {
int list_count = list.Count();
if (list_count == 0) return Xog_history_itm.Null;
if (cur_pos == list_count - 1) return Xog_history_itm.Null;
++cur_pos;
return this.Cur_itm();
}
private void Del_from(int from) {
int len = list.Count();
if (from <= len - 1)
list.Del_range(from, len - 1);
}
public void Srl_save(Bry_bfr bfr) {
int len = list.Count();
for (int i = 0; i < len; ++i) {
Xog_history_itm itm = (Xog_history_itm)list.Get_at(i);
itm.Srl_save(bfr);
}
}
public void Srl_load(byte[] bry) {
list.Clear();
byte[][] lines = Bry_split_.Split_lines(bry);
int len = lines.length;
for (int i = 0; i < len; ++i) {
byte[] line = lines[i];
Xog_history_itm itm = Xog_history_itm.Srl_load(line);
this.Add(itm);
}
}
public void Cur_pos_(int v) {this.cur_pos = v;}
public static final byte Nav_fwd = 1, Nav_bwd = 2, Nav_by_anchor = 3;
}

View File

@@ -0,0 +1,85 @@
/*
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.history; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import org.junit.*;
public class Xog_history_stack_tst {
@Before public void init() {fxt.Clear();} private Xog_history_stack_fxt fxt = new Xog_history_stack_fxt();
@Test public void Init() {fxt.Test_cur(null);}
@Test public void Add_1() {fxt.Exec_add_many("A").Test_cur("A").Test_len(1).Test_pos(0);}
@Test public void Add_same() {fxt.Exec_add_many("A", "A").Test_cur("A").Test_len(1).Test_pos(0);}
@Test public void Add_3() {fxt.Exec_add_many("A", "B", "C").Test_cur("C").Test_len(3).Test_pos(2);}
@Test public void Add_3_bwd() {fxt.Exec_add_many("A", "B", "C").Exec_go_bwd().Test_cur("B").Test_pos(1);}
@Test public void Add_3_bwd_fwd() {fxt.Exec_add_many("A", "B", "C").Exec_go_bwd().Exec_go_fwd().Test_cur("C").Test_pos(2);}
@Test public void Add_3_bwd_add() {fxt.Exec_add_many("A", "B", "C").Exec_go_bwd().Exec_add_many("D").Test_len(3).Test_cur("D").Test_pos(2);}
@Test public void Add_3_bwd_bwd_add() {fxt.Exec_add_many("A", "B", "C").Exec_go_bwd().Exec_go_bwd().Exec_add_many("D").Test_len(2).Test_cur("D").Test_pos(1);}
@Test public void Add_dif_ns() {fxt.Exec_add_many("A", "Help:A").Test_cur("Help:A");} // PURPOSE.fix: page_stack was only differtiating by Page_db, not Full; EX: Unicode -> Category:Unicode
@Test public void Add_qargs() {// PURPOSE.fix: page_stack was only differentiating by qtxt args
fxt .Exec_add_one("Special:AllPages", "?from=A")
.Exec_add_one("Special:AllPages", "?from=B")
.Exec_add_many("B")
.Exec_go_bwd()
.Test_cur("Special:AllPages")
.Test_cur_qargs("?from=B")
;
}
}
class Xog_history_stack_fxt {
public Xog_history_stack_fxt Clear() {
stack.Clear();
if (app == null) {
app = Xoa_app_fxt.Make__app__edit();
wiki = Xoa_app_fxt.Make__wiki__edit(app);
}
return this;
} private Xoae_app app; private Xowe_wiki wiki; private Xog_history_stack stack = new Xog_history_stack();
public Xog_history_stack_fxt Test_cur(String expd) {
Xog_history_itm page = stack.Cur_itm();
String actl = page == null ? null : String_.new_u8(page.Page());
Tfds.Eq(expd, actl, "cur");
return this;
}
public Xog_history_stack_fxt Test_cur_qargs(String expd) {
Xog_history_itm page = stack.Cur_itm();
String actl = page == null ? null : String_.new_u8(page.Qarg());
Tfds.Eq(expd, actl, "cur_qargs");
return this;
}
public Xog_history_stack_fxt Exec_go_bwd() {stack.Go_bwd(); return this;}
public Xog_history_stack_fxt Exec_go_fwd() {stack.Go_fwd(); return this;}
public Xog_history_stack_fxt Exec_add_many(String... ary) {
int len = ary.length;
for (int i = 0; i < len; i++) {
String ttl = ary[i];
Exec_add_one(ttl, null);
}
return this;
}
public Xog_history_stack_fxt Exec_add_one(String ttl_str, String arg_str) {
byte[] ttl_bry = Bry_.new_u8(ttl_str);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
Xoae_page page = Xoae_page.New_test(wiki, ttl);
byte[] url_bry = ttl_bry;
if (arg_str != null) url_bry = Bry_.Add(url_bry, Bry_.new_u8(arg_str));
Xoa_url url = app.User().Wikii().Utl__url_parser().Parse(url_bry);
page.Url_(url); // set url b/c history_mgr.Add uses url
stack.Add(Xog_history_mgr.new_(page));
return this;
}
public Xog_history_stack_fxt Test_pos(int expd) {Tfds.Eq(expd, stack.Cur_pos(), "pos"); return this;}
public Xog_history_stack_fxt Test_len(int expd) {Tfds.Eq(expd, stack.Len(), "len"); return this;}
}

View File

@@ -0,0 +1,45 @@
/*
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.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.gfui.*; import gplx.gfui.draws.*;
public class Xol_font_info implements Gfo_invk, Gfo_evt_mgr_owner {
private FontStyleAdp style;
public Xol_font_info(String name, float size, FontStyleAdp style) {
this.name = name; this.size = size; this.style = style;
}
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 String Name() {return name;} public Xol_font_info Name_(String v) {name = v; Font_changed_pub(); return this;} private String name;
public float Size() {return size;} public Xol_font_info Size_(float v) {size = v; Font_changed_pub(); return this;} private float size;
public FontAdp To_font() {return FontAdp.new_(name, size, style);}
public boolean Eq(FontAdp font) {return String_.Eq(name, font.Name()) && size == font.Size() && style.Val() == font.Style().Val();}
public void Init_by_app(Xoae_app app) {
app.Cfg().Bind_many_app(this, Cfg__font_name, Cfg__font_size);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Cfg__font_name)) Name_(m.ReadStr("v"));
else if (ctx.Match(k, Cfg__font_size)) Size_(m.ReadFloat("v"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static final String Font_changed = "font_changed";
private void Font_changed_pub() {Gfo_evt_mgr_.Pub_obj(this, Font_changed, "font", this);}
private static final String Cfg__font_name = "xowa.gui.app.font.name";
public static final String Cfg__font_size = "xowa.gui.app.font.size";
}

View File

@@ -0,0 +1,65 @@
/*
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.menus; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.xowa.guis.cmds.*;
class Xog_menu_bldr {
private int indent = 0;
private Bry_bfr bfr = Bry_bfr_.Reset(0);
public String Gen_str() {return bfr.To_str_and_clear();}
private Xog_menu_bldr Indent_add() {indent += 2; return this;}
private Xog_menu_bldr Indent_del() {indent -= 2; return this;}
private void Indent() {
if (indent > 0)
bfr.Add_byte_repeat(Byte_ascii.Space, indent);
}
public Xog_menu_bldr Add_spr() {
Indent();
bfr.Add(Const_spr);
return this;
}
public Xog_menu_bldr Add_grp_bgn(String key) {
Indent();
bfr.Add(Const_itm_grp_bgn_lhs);
bfr.Add_str_u8(key);
bfr.Add(Const_itm_grp_bgn_rhs);
Indent_add();
return this;
}
public Xog_menu_bldr Add_grp_end() {
Indent_del();
Indent();
bfr.Add(Const_itm_grp_end);
return this;
}
public Xog_menu_bldr Add_btn(String key) {
Indent();
bfr.Add(Const_itm_btn_bgn_lhs);
bfr.Add_str_u8(key);
bfr.Add(Const_itm_btn_bgn_rhs);
return this;
}
private static final byte[]
Const_spr = Bry_.new_a7("add_spr;\n")
, Const_itm_btn_bgn_lhs = Bry_.new_a7("add_btn_default('")
, Const_itm_btn_bgn_rhs = Bry_.new_a7("');\n")
, Const_itm_grp_bgn_lhs = Bry_.new_a7("add_grp_default('")
, Const_itm_grp_bgn_rhs = Bry_.new_a7("') {\n")
, Const_itm_grp_end = Bry_.new_a7("}\n")
;
public static final Xog_menu_bldr Instance = new Xog_menu_bldr(); Xog_menu_bldr() {}
}

View File

@@ -0,0 +1,57 @@
/*
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.menus; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.xowa.guis.menus.dom.*;
import gplx.xowa.langs.*;
public class Xog_menu_mgr implements Gfo_invk {
private Xoae_app app;
public Xog_menu_mgr(Xoa_gui_mgr gui_mgr) {
menu_bldr = new Xog_mnu_bldr();
regy = new Xog_mnu_regy(gui_mgr);
popup_mnu_mgr = new Xog_popup_mnu_mgr(gui_mgr, this);
window_mnu_mgr = new Xog_window_mnu_mgr(gui_mgr, this);
}
public Xog_mnu_regy Regy() {return regy;} private Xog_mnu_regy regy;
public Xog_popup_mnu_mgr Popup() {return popup_mnu_mgr;} private Xog_popup_mnu_mgr popup_mnu_mgr;
public Xog_window_mnu_mgr Window() {return window_mnu_mgr;} private Xog_window_mnu_mgr window_mnu_mgr;
public Xog_mnu_bldr Menu_bldr() {return menu_bldr;} private Xog_mnu_bldr menu_bldr;
public void Init_by_app(Xoae_app app) {
this.app = app;
regy.Init_by_app(app);
}
public void Init_by_kit() {
try {
if (!app.Mode().Tid_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(app);
window_mnu_mgr.Init_by_kit(app);
Lang_changed(app.Usere().Lang());
}
catch (Exception e) { // ignore errors while loading custom menus, else fatal error; DATE:2014-07-01
app.Usr_dlg().Warn_many("", "", "error while loading menus; err=~{0}", Err_.Message_gplx_full(e));
}
}
public void Lang_changed(Xol_lang_itm lang) {
window_mnu_mgr.Lang_changed(lang);
popup_mnu_mgr.Lang_changed(lang);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_contexts)) return popup_mnu_mgr;
else if (ctx.Match(k, Invk_windows)) return window_mnu_mgr;
else return Gfo_invk_.Rv_unhandled;
} private static final String Invk_contexts = "contexts", Invk_windows = "windows";
}

View File

@@ -0,0 +1,73 @@
/*
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.menus; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.xowa.guis.menus.dom.*;
import gplx.xowa.langs.*;
public class Xog_popup_mnu_mgr implements Gfo_invk {
private final Ordered_hash hash = Ordered_hash_.New();
private final Xog_mnu_grp[] mnus = new Xog_mnu_grp[6];
private Xoa_gui_mgr gui_mgr;
public Xog_popup_mnu_mgr(Xoa_gui_mgr gui_mgr, Xog_menu_mgr menu_mgr) {
this.gui_mgr = gui_mgr;
html_page = Ctor(0, Root_key_html_page); // NOTE: default menu; always build first;
html_link = Ctor(1, Root_key_html_link);
html_file = Ctor(2, Root_key_html_file);
tabs_btns = Ctor(3, Root_key_tabs_btns);
prog = Ctor(4, Root_key_prog);
info = Ctor(5, Root_key_info);
}
public Xog_mnu_grp Tabs_btns() {return tabs_btns;} private Xog_mnu_grp tabs_btns;
public Xog_mnu_grp Html_page() {return html_page;} private Xog_mnu_grp html_page;
public Xog_mnu_grp Html_link() {return html_link;} private Xog_mnu_grp html_link;
public Xog_mnu_grp Html_file() {return html_file;} private Xog_mnu_grp html_file;
public Xog_mnu_grp Prog() {return prog;} private Xog_mnu_grp prog;
public Xog_mnu_grp Info() {return info;} private Xog_mnu_grp info;
public void Init_by_kit(Xoae_app app) {
for (int i = 0; i < mnus.length; i++)
mnus[i].Source_exec(gui_mgr.App().Gfs_mgr()); // NOTE: build menu now; NOTE: do not set default here, or else will override user setting
app.Cfg().Bind_many_app(this, Cfg__tabs, Cfg__html__basic, Cfg__html__file, Cfg__html__link, Cfg__status);
}
public void Lang_changed(Xol_lang_itm lang) {
for (int i = 0; i < mnus.length; i++)
Xog_mnu_base.Update_grp_by_lang(gui_mgr.Menu_mgr().Menu_bldr(), lang, mnus[i]);
}
private Xog_mnu_grp Ctor(int i, String key) {
Xog_mnu_grp rv = new Xog_mnu_grp(gui_mgr, true, key);
hash.Add(key, rv);
mnus[i] = rv;
return rv;
}
private void Source_(Xog_mnu_grp mnu, String source) {mnu.Source_(source);}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Cfg__tabs)) Source_(tabs_btns , m.ReadStr("v"));
else if (ctx.Match(k, Cfg__html__basic)) Source_(html_page , m.ReadStr("v"));
else if (ctx.Match(k, Cfg__html__link)) Source_(html_link , m.ReadStr("v"));
else if (ctx.Match(k, Cfg__html__file)) Source_(html_file , m.ReadStr("v"));
else if (ctx.Match(k, Cfg__status)) Source_(prog , m.ReadStr("v"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static final String Root_key_tabs_btns = "browser.tabs.btns", Root_key_prog = "browser.prog", Root_key_info = "browser.info"
, Root_key_html_page = "html_box", Root_key_html_link = "browser.html.link", Root_key_html_file = "browser.html.file";
private static final String
Cfg__tabs = "xowa.gui.menus.tabs.source"
, Cfg__html__basic = "xowa.gui.menus.html.basic.source"
, Cfg__html__link = "xowa.gui.menus.html.link.source"
, Cfg__html__file = "xowa.gui.menus.html.file.source"
, Cfg__status = "xowa.gui.menus.status.source";
}

View File

@@ -0,0 +1,55 @@
/*
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.menus; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.xowa.guis.menus.dom.*;
import gplx.xowa.langs.*;
public class Xog_window_mnu_mgr implements Gfo_invk {
private final Ordered_hash hash = Ordered_hash_.New();
public Xog_mnu_grp Browser() {return browser;} private Xog_mnu_grp browser;
public Xog_window_mnu_mgr(Xoa_gui_mgr gui_mgr, Xog_menu_mgr menu_mgr) {
this.gui_mgr = gui_mgr;
browser = Get_or_new(Root_key_browser_win);
} private Xoa_gui_mgr gui_mgr;
public void Init_by_kit(Xoae_app app) {
browser.Source_exec(gui_mgr.App().Gfs_mgr()); // NOTE: build menu now; NOTE: do not set default here, or else will override user setting
app.Cfg().Bind_many_app(this, Cfg__browser__enabled, Cfg__browser__source);
}
public Xog_mnu_grp Get_or_new(String key) {
Xog_mnu_grp rv = (Xog_mnu_grp)hash.Get_by(key);
if (rv == null) {
rv = new Xog_mnu_grp(gui_mgr, false, key);
hash.Add(key, rv);
}
return rv;
}
public void Lang_changed(Xol_lang_itm lang) {
Xog_mnu_base.Update_grp_by_lang(gui_mgr.Menu_mgr().Menu_bldr(), lang, browser);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Cfg__browser__enabled)) browser.Enabled_(m.ReadYn("v"));
else if (ctx.Match(k, Cfg__browser__source)) browser.Source_(m.ReadStr("v"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String Root_key_browser_win = "main_win";
private static final String
Cfg__browser__enabled = "xowa.gui.menus.browser.enabled"
, Cfg__browser__source = "xowa.gui.menus.browser.source"
;
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.menus.dom; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.menus.*;
import gplx.gfui.*; import gplx.gfui.imgs.*;
import gplx.xowa.langs.*; import gplx.xowa.guis.cmds.*;
public abstract class Xog_mnu_base implements Gfo_invk {
private List_adp list = List_adp_.New();
public Xog_mnu_base() {evt_mgr = new Xog_mnu_evt_mgr(this);}
public Xog_mnu_evt_mgr Evt_mgr() {return evt_mgr;} private Xog_mnu_evt_mgr evt_mgr;
public void Evt_mgr_(Xog_mnu_evt_mgr v) {this.evt_mgr = v;}
public Xoa_gui_mgr Gui_mgr() {return gui_mgr;} private Xoa_gui_mgr gui_mgr;
public abstract boolean Tid_is_app_menu_grp();
public void Ctor(Xoa_gui_mgr gui_mgr) {this.gui_mgr = gui_mgr;}
public void Clear() {
int len = list.Count();
for (int i = 0; i < len; i++) {
Xog_mnu_itm itm = (Xog_mnu_itm)list.Get_at(i);
itm.Clear();
}
list.Clear();
}
public int Len() {return list.Count();}
public Xog_mnu_itm Get_at(int i) {return (Xog_mnu_itm)list.Get_at(i);}
public Xog_mnu_itm Add_btn_default(String key) {return Add_itm_default(Xog_mnu_itm.Tid_btn, key);}
public Xog_mnu_itm Add_chk_default(String key) {return Add_itm_default(Xog_mnu_itm.Tid_chk, key);}
public Xog_mnu_itm Add_rdo_default(String key) {return Add_itm_default(Xog_mnu_itm.Tid_rdo, key);}
public Xog_mnu_itm Add_grp_default(String key) {return Add_itm_default(Xog_mnu_itm.Tid_grp, key);}
private Xog_mnu_itm Add_itm_default(byte tid, String key) {
Xog_mnu_itm itm = gui_mgr.Menu_mgr().Regy().Get_or_make(key);
itm.Tid_(tid);
list.Add(itm);
return itm;
}
public Xog_mnu_itm Add_btn(String key, String text, String shortcut, String img, String cmd) {
Xog_mnu_itm rv = Add_itm(Xog_mnu_itm.Tid_btn, key, text, shortcut, img);
rv.Cmd_(cmd);
return rv;
}
public Xog_mnu_itm Add_chk(String key, String text, String shortcut, String img, String cmd) {
Xog_mnu_itm rv = Add_itm(Xog_mnu_itm.Tid_chk, key, text, shortcut, img);
rv.Cmd_(cmd);
return rv;
}
public Xog_mnu_itm Add_rdo(String key, String text, String shortcut, String img, String cmd) {
Xog_mnu_itm rv = Add_itm(Xog_mnu_itm.Tid_rdo, key, text, shortcut, img);
rv.Cmd_(cmd);
return rv;
}
public Xog_mnu_itm Add_grp(String key, String text, String shortcut, String img) {return Add_itm(Xog_mnu_itm.Tid_grp, key, text, shortcut, img);}
private Xog_mnu_itm Add_itm(byte tid, String key, String text, String shortcut, String img) {
Xog_mnu_itm itm = gui_mgr.Menu_mgr().Regy().Get_or_make(key);
itm.Tid_(tid);
list.Add(itm);
itm.Init_by_custom(text, shortcut, img);
return itm;
}
public Xog_mnu_itm Add_spr() {
String key = "xowa.spr" + Int_.To_str(list.Count());
Xog_mnu_itm rv = new Xog_mnu_itm(gui_mgr, key).Tid_(Xog_mnu_itm.Tid_spr);
list.Add(rv);
return rv;
}
@gplx.Virtual public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_clear)) this.Clear();
// else if (ctx.Match(k, Invk_add)) return Add_itm_default(Xog_mnu_itm.Tid_nil, m.ReadStr("v"));
else if (ctx.Match(k, Invk_add_spr)) return Add_spr();
else if (ctx.Match(k, Invk_add_grp_default)) return Add_grp_default(m.ReadStr("v"));
else if (ctx.Match(k, Invk_add_grp)) return Add_grp(m.ReadStr("key"), m.ReadStr("text"), m.ReadStr("shortcut"), m.ReadStrOr("img", ""));
else if (ctx.Match(k, Invk_add_btn_default)) return Add_btn_default(m.ReadStr("v"));
else if (ctx.Match(k, Invk_add_btn)) return Add_btn(m.ReadStr("key"), m.ReadStr("text"), m.ReadStr("shortcut"), m.ReadStr("img"), m.ReadStr("cmd"));
else if (ctx.Match(k, Invk_add_chk_default)) return Add_chk_default(m.ReadStr("v"));
else if (ctx.Match(k, Invk_add_chk)) return Add_chk(m.ReadStr("key"), m.ReadStr("text"), m.ReadStr("shortcut"), m.ReadStr("img"), m.ReadStr("cmd"));
else if (ctx.Match(k, Invk_add_rdo_default)) return Add_rdo_default(m.ReadStr("v"));
else if (ctx.Match(k, Invk_add_rdo)) return Add_rdo(m.ReadStr("key"), m.ReadStr("text"), m.ReadStr("shortcut"), m.ReadStr("img"), m.ReadStr("cmd"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String
Invk_clear = "clear"
, Invk_add_spr = "add_spr"
, Invk_add_grp_default = "add_grp_default", Invk_add_grp = "add_grp"
, Invk_add_btn_default = "add_btn_default", Invk_add_btn = "add_btn"
, Invk_add_chk_default = "add_chk_default", Invk_add_chk = "add_chk"
, Invk_add_rdo_default = "add_rdo_default", Invk_add_rdo = "add_rdo"
;
public static void Update_grp_by_lang(Xog_mnu_bldr bldr, Xol_lang_itm lang, Xog_mnu_base grp) {
int len = grp.Len();
for (int i = 0; i < len; i++) {
Xog_mnu_itm itm = grp.Get_at(i);
itm.Init_by_lang(lang);
if (itm.Under_gui() != null) {
itm.Under_gui().Text_(itm.Gui_text());
ImageAdp img = grp.Tid_is_app_menu_grp()
? ImageAdp_.Null // set image to null if window menu grp
: bldr.Get_img(itm.Img_nest())
;
itm.Under_gui().Img_(img);
}
if (itm.Tid() == Xog_mnu_itm.Tid_grp)
Update_grp_by_lang(bldr, lang, itm);
}
}
}

View File

@@ -0,0 +1,85 @@
/*
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.menus.dom; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.menus.*;
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.gfui.imgs.*;
import gplx.xowa.guis.cmds.*; import gplx.xowa.apps.gfs.*;
public class Xog_mnu_bldr {
private Xoae_app app; private Gfui_kit kit; private Io_url img_dir;
public void Init_by_kit(Xoae_app app, Gfui_kit kit, Io_url img_dir) {
this.app = app; this.kit = kit; this.img_dir = img_dir;
}
public void Build(Gfui_mnu_grp grp_gui, Xog_mnu_grp grp_dom) {
if (grp_gui == null) return; // NOTE: hackish, ignore call from user.gfs b/c it fires before kit is inited; note that Xog_popup_mnu_mgr will call html_box's context menu explicitly
grp_gui.Itms_clear();
Build_owner(grp_gui, grp_dom);
}
private void Build_owner(Gfui_mnu_grp grp_gui, Xog_mnu_base grp_dom) {
int len = grp_dom.Len();
for (int i = 0; i < len; i++) {
Xog_mnu_itm sub_dom = grp_dom.Get_at(i);
Gfui_mnu_itm sub_gui = null;
String sub_text = sub_dom.Name(), sub_shortcut = sub_dom.Shortcut();
switch (sub_dom.Tid()) {
case Xog_mnu_itm.Tid_spr: sub_gui = grp_gui.Itms_add_separator(); break;
case Xog_mnu_itm.Tid_btn: sub_gui = Add_btn(grp_gui, sub_dom, sub_text, sub_shortcut); break;
case Xog_mnu_itm.Tid_chk: sub_gui = Add_chk(grp_gui, sub_dom, sub_text, sub_shortcut); break;
case Xog_mnu_itm.Tid_rdo: sub_gui = Add_rdo(grp_gui, sub_dom, sub_text, sub_shortcut); break;
case Xog_mnu_itm.Tid_grp: {
Gfui_mnu_grp sub_gui_grp = grp_gui.Itms_add_grp(sub_dom.Gui_text(), Get_img(sub_dom.Img_nest()));
Build_owner(sub_gui_grp, (Xog_mnu_base)sub_dom);
sub_gui = sub_gui_grp;
break;
}
default: throw Err_.new_unhandled(sub_dom.Tid());
}
sub_dom.Under_gui_(sub_gui);
}
}
public ImageAdp Get_img(String[] img_nest) {
Io_url img_url = img_nest.length == 0 ? Io_url_.Empty : img_dir.GenSubFil_nest(img_nest);
return Io_mgr.Instance.ExistsFil(img_url) ? kit.New_img_load(img_url) : ImageAdp_null.Instance; // NOTE: must check if file exists else swt exception; NOTE: must use ImageAdp_null.Instance, not ImageAdp_.Null, else error in non-X11 environments
}
private Gfui_mnu_itm Add_btn(Gfui_mnu_grp owner_gui, Xog_mnu_itm sub, String sub_text, String sub_shortcut) {
String cmd_text = "app.api.exec('" + sub.Key() + "');";
GfoMsg msg = Xoa_gfs_mgr_.Parse_to_msg(cmd_text);
ImageAdp img = Get_img(sub.Img_nest());
return owner_gui.Itms_add_btn_msg(sub.Gui_text(), img, app, app.Gfs_mgr(), msg);
}
private Gfui_mnu_itm Add_chk(Gfui_mnu_grp owner_gui, Xog_mnu_itm sub, String sub_text, String sub_shortcut) {
ImageAdp img = Get_img(sub.Img_nest());
GfoMsg msg_n = Xoa_gfs_mgr_.Parse_to_msg("app.api.exec('" + sub.Key() + "n_');");
GfoMsg msg_y = Xoa_gfs_mgr_.Parse_to_msg("app.api.exec('" + sub.Key() + "y_');");
Gfui_mnu_itm mnu_itm = owner_gui.Itms_add_chk_msg(sub.Gui_text(), img, app, app.Gfs_mgr(), msg_n, msg_y);
sub.Evt_mgr().Sub(mnu_itm);
Xog_cmd_itm cmd = app.Gui_mgr().Cmd_mgr().Get_or_null(sub.Key());
boolean v = Bool_.Cast(app.Gfs_mgr().Run_str_for(app, cmd.Cmd()));
mnu_itm.Selected_(v);
return mnu_itm;
}
// private void Add_chk(String key, String text, String shortcut, String img) {
// Xog_mnu_itm rv = Add_itm(Xog_mnu_itm.Tid_chk, key, text, shortcut, img);
// Xog_cmd_itm cmd = gui_mgr.Cmd_mgr().Regy().Get_or_null(key); if (cmd == null) throw Err_.new_wo_type("unknown cmd; key={0}", key);
// Gfo_evt_itm pub = gui_mgr.App().Gfs_mgr().Get_owner_as_event_obj(cmd.Cmd());
// Gfo_evt_mgr_.Sub_same(pub, Xog_mnu_evt_mgr.Evt_selected_changed, rv.Evt_mgr());
// }
private Gfui_mnu_itm Add_rdo(Gfui_mnu_grp owner_gui, Xog_mnu_itm sub, String sub_text, String sub_shortcut) {
ImageAdp img = Get_img(sub.Img_nest());
GfoMsg msg = Xoa_gfs_mgr_.Parse_to_msg("app.api.exec('" + sub.Key() + "');");
return owner_gui.Itms_add_rdo_msg(sub.Gui_text(), img, app, app.Gfs_mgr(), msg);
}
}

View File

@@ -0,0 +1,38 @@
/*
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.menus.dom; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.menus.*;
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.xowa.guis.cmds.*;
public class Xog_mnu_evt_mgr implements Gfo_evt_itm {
private Ordered_hash itms = Ordered_hash_.New();
public Xog_mnu_evt_mgr(Xog_mnu_base owner) {this.ev_mgr = new Gfo_evt_mgr(this);}
public Gfo_evt_mgr Evt_mgr() {return ev_mgr;} private Gfo_evt_mgr ev_mgr;
public void Sub(Gfui_mnu_itm mnu_itm) {
itms.Add(mnu_itm.Uid(), mnu_itm);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Evt_selected_changed)) {
int len = itms.Count();
for (int i = 0; i < len; i++) {
Gfui_mnu_itm itm = (Gfui_mnu_itm)itms.Get_at(i);
itm.Selected_(m.ReadBool("v"));
}
}
return this;
}
public static final String Evt_selected_changed = "selected_changed";
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.menus.dom; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.menus.*;
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.gfui.controls.standards.*;
import gplx.xowa.apps.*; import gplx.xowa.apps.gfs.*;
import gplx.xowa.guis.views.*;
public class Xog_mnu_grp extends Xog_mnu_base {
public Xog_mnu_grp(Xoa_gui_mgr gui_mgr, boolean mnu_is_popup, String key) {
this.app = gui_mgr.App(); this.mnu_is_popup = mnu_is_popup; this.key = key;
this.Ctor(gui_mgr);
} private Xoae_app app;
public String Key() {return key;} private String key; private boolean mnu_is_popup;
public Gfui_mnu_grp Under_mnu() {
if (under_mnu.Disposed()) Build(); // NOTE: menu may be disposed when calling .dispose on Swt_html; rebuild if needed; DATE:2014-07-09
return under_mnu;
} private Gfui_mnu_grp under_mnu;
@Override public boolean Tid_is_app_menu_grp() {return !mnu_is_popup;}
public boolean Enabled() {return enabled;} private boolean enabled = true;
public void Enabled_(boolean v) {
this.enabled = v;
if (under_mnu != null) // null when changed by cfg.gfs
under_mnu.Itms_clear();
if (v)
this.Source_exec(app.Gfs_mgr());
else
this.Clear();
if (!mnu_is_popup && app.Gui_mgr().Browser_win().Win_box() != null)
Gfo_invk_.Invk_by_key(app.Gui_mgr().Browser_win(), Gfui_html.Evt_win_resized);
}
public String Source() {return source;} private String source = ""; // NOTE: default to "" not null, else init will try to run "clear;\nnullbuild;"
public void Source_(String v) {this.source = v; this.Source_exec(app.Gfs_mgr());}
public Object Source_exec(Xoa_gfs_mgr gfs_mgr) {return Source_exec(gfs_mgr, source);}
private Object Source_exec(Xoa_gfs_mgr gfs_mgr, String v) {
if (!enabled) return Gfo_invk_.Rv_handled;
String script = "clear;\n" + v + "build;";
return gfs_mgr.Run_str_for(this, script);
}
public void Build() {
Xoa_gui_mgr gui_mgr = app.Gui_mgr(); Gfui_kit kit = gui_mgr.Kit(); Xog_win_itm win = gui_mgr.Browser_win();
if (!kit.Kit_mode__ready()) return; // NOTE: .gfs will fire Build before Kit.Init; check that kit is inited
if (under_mnu == null) {
if (mnu_is_popup) {
if (String_.Eq(key, Xog_popup_mnu_mgr.Root_key_tabs_btns))
under_mnu = kit.New_mnu_popup(key, win.Tab_mgr().Tab_mgr());
else
under_mnu = kit.New_mnu_popup(key, win.Win_box());
}
else
under_mnu = kit.New_mnu_bar(key, win.Win_box());
}
Xog_mnu_bldr bldr = gui_mgr.Menu_mgr().Menu_bldr();
bldr.Build(under_mnu, this);
Xog_mnu_base.Update_grp_by_lang(bldr, app.Usere().Lang(), this); // NOTE: always set lang after rebuild; else changes in home/wiki/Options/Menus will show blank captions; DATE:2014-06-05
if (mnu_is_popup) {
boolean rebind_to_win = false;
if (String_.Eq(key, Xog_popup_mnu_mgr.Root_key_tabs_btns)) {
kit.Set_mnu_popup(win.Tab_mgr().Tab_mgr(), under_mnu);
rebind_to_win = true;
}
else if (String_.Eq(key, Xog_popup_mnu_mgr.Root_key_html_page)) // rebind new popup box; DATE:2014-05-16
Bind_popup_menu(gui_mgr);
else if (String_.Eq(key, Xog_popup_mnu_mgr.Root_key_html_link))
rebind_to_win = true;
else if (String_.Eq(key, Xog_popup_mnu_mgr.Root_key_prog))
kit.Set_mnu_popup(win.Prog_box(), under_mnu);
else if (String_.Eq(key, Xog_popup_mnu_mgr.Root_key_info))
kit.Set_mnu_popup(win.Info_box(), under_mnu);
if (rebind_to_win) { // WORKAROUND: SWT seems to bind popup menus to window; always rebind window to html_page; DATE:2014-05-17
kit.Set_mnu_popup(win.Win_box(), gui_mgr.Menu_mgr().Popup().Html_page().Under_mnu());
}
}
}
private void Bind_popup_menu(Xoa_gui_mgr gui_mgr) {
Gfui_kit kit = gui_mgr.Kit(); Xog_win_itm win = gui_mgr.Browser_win(); Xog_tab_mgr tab_mgr = win.Tab_mgr();
int tabs_len = tab_mgr.Tabs_len();
for (int i = 0; i < tabs_len; i++) {
Xog_tab_itm tab = tab_mgr.Tabs_get_at(i);
kit.Set_mnu_popup(tab.Html_box(), under_mnu);
}
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_build)) this.Build();
else return super.Invk(ctx, ikey, k, m);
return this;
}
private static final String Invk_build = "build";
}

View File

@@ -0,0 +1,88 @@
/*
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.menus.dom; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.menus.*;
import gplx.gfui.*; import gplx.gfui.kits.core.*;
import gplx.xowa.langs.*; import gplx.xowa.guis.cmds.*; import gplx.xowa.langs.msgs.*;
public class Xog_mnu_itm extends Xog_mnu_base {
private Xoa_gui_mgr gui_mgr;
public Xog_mnu_itm(Xoa_gui_mgr gui_mgr, String key) {
this.gui_mgr = gui_mgr; this.key = key; this.key_bry = Bry_.new_u8(key);
this.Ctor(gui_mgr);
}
public byte Tid() {return tid;} public Xog_mnu_itm Tid_(byte v) {tid = v; return this;} private byte tid;
@Override public boolean Tid_is_app_menu_grp() {return false;}
public String Key() {return key;} private String key; private byte[] key_bry;
public String Name() {return name;} public void Name_(String v) {this.name = v; Gui_text_calc_();} private String name = "";
public String Shortcut() {return shortcut;} public void Shortcut_(String v) {this.shortcut = v; Gui_text_calc_();} private String shortcut;
public String Gui_text() {return gui_text;} public void Gui_text_calc_() {gui_text = Gui_text_calc(name, shortcut);} private String gui_text = "";
public String[] Img_nest() {return img_nest;} private String[] img_nest = String_.Ary_empty;
private String Cmd() {
Xog_cmd_itm cmd_itm = gui_mgr.Cmd_mgr().Get_or_null(key);
return cmd_itm == null ? "" : cmd_itm.Cmd();
}
public Xog_mnu_itm Cmd_(String cmd) {
Xog_cmd_itm cmd_itm = gui_mgr.Cmd_mgr().Get_or_make(key);
cmd_itm.Cmd_(cmd);
return this;
}
public Gfui_mnu_itm Under_gui() {return under_gui;} public void Under_gui_(Gfui_mnu_itm v) {under_gui = v;} private Gfui_mnu_itm under_gui;
private Xog_mnu_itm Init_by_clone(Xog_mnu_itm comp) {
this.tid = comp.tid; this.name = comp.name; this.shortcut = comp.shortcut; this.img_nest = comp.img_nest; this.gui_text = comp.gui_text;
return this;
}
public void Init_by_lang(Xol_lang_itm lang) {
this.name = Xol_msg_mgr_.Get_msg_val_gui_or(lang.Lang_mgr(), lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_name, name); // NOTE: custom cmds must use Get_val_or, not Get_val_or_null; DATE:2014-05-30
this.shortcut = Xol_msg_mgr_.Get_msg_val_gui_or(lang.Lang_mgr(), lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_letter, shortcut);
this.img_nest = Img_nest_of(Xol_msg_mgr_.Get_msg_val_gui_or(lang.Lang_mgr(), lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_image, ""));
this.gui_text = Gui_text_calc(name, shortcut);
}
public void Init_by_custom(String name, String shortcut, String img_nest_str) {
this.name = name;
this.shortcut = shortcut;
this.img_nest = Img_nest_of(img_nest_str);
this.gui_text = Gui_text_calc(name, shortcut);
}
public static String Gui_text_calc(String name, String shortcut) {
if (shortcut == null || String_.Len(shortcut) != 1) return name; // shortcut is null or > 1 char; return name
int pos = String_.FindFwd(String_.Lower(name), String_.Lower(shortcut)); // search for shortcut in name
if (pos == String_.Find_none) return name; // shortcut not found; return name; EX: "x" in "File" returns "File"
return String_.Mid(name, 0, pos) + "&" + String_.Mid(name, pos); // add & before shortcut; EX: "x" in "Exit" -> "E&xit"
}
public Xog_mnu_itm Clone() {
Xog_mnu_itm rv = new Xog_mnu_itm(gui_mgr, key).Init_by_clone(this);
rv.Evt_mgr_(this.Evt_mgr());
return rv;
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_text)) return name;
else if (ctx.Match(k, Invk_text_)) Name_(m.ReadStr("v"));
else if (ctx.Match(k, Invk_shortcut)) return shortcut;
else if (ctx.Match(k, Invk_shortcut_)) Shortcut_(m.ReadStr("v"));
else if (ctx.Match(k, Invk_cmd)) return this.Cmd();
else if (ctx.Match(k, Invk_cmd_)) Cmd_(m.ReadStr("v"));
else if (ctx.Match(k, Invk_img)) return String_.Concat_with_str("/", img_nest);
else if (ctx.Match(k, Invk_img_)) img_nest = Img_nest_of(m.ReadStr("v"));
else return super.Invk(ctx, ikey, k, m);
return this;
}
private static final String Invk_text = "text", Invk_text_ = "text_", Invk_shortcut = "shortcut", Invk_shortcut_ = "shortcut_", Invk_cmd = "cmd", Invk_cmd_ = "cmd_", Invk_img = "img", Invk_img_ = "img_"
;
public static final byte Tid_nil = 0, Tid_grp = 1, Tid_spr = 2, Tid_btn = 3, Tid_chk = 4, Tid_rdo = 5;
private static String[] Img_nest_of(String img) {return String_.Len_eq_0(img) ? String_.Ary_empty : String_.Split(img, "/");}
public static final Xog_mnu_itm Null = new Xog_mnu_itm(null, "null");
}

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.menus.dom; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.menus.*;
import gplx.xowa.guis.cmds.*;
public class Xog_mnu_regy {
private Ordered_hash hash;
private Xoa_gui_mgr gui_mgr;
public Xog_mnu_regy(Xoa_gui_mgr gui_mgr) {
this.gui_mgr = gui_mgr;
}
public void Init_by_app(Xoae_app app) {
hash = Ordered_hash_.New();
Xog_cmd_mgr cmd_mgr = app.Gui_mgr().Cmd_mgr();
int len = cmd_mgr.Len();
for (int i = 0; i < len; i++) {
Xog_cmd_itm cmd_itm = cmd_mgr.Get_at(i);
String key = cmd_itm.Key();
Xog_mnu_itm rv = new Xog_mnu_itm(gui_mgr, key);
hash.Add(key, rv);
}
Init_obsolete(hash, gui_mgr);
}
public Xog_mnu_itm Get_or_make(String key) {
Xog_mnu_itm rv = (Xog_mnu_itm)hash.Get_by(key);
if (rv == null) {
rv = new Xog_mnu_itm(gui_mgr, key);
hash.Add(key, rv);
}
else
rv = rv.Clone();
return rv;
}
private static void Init_obsolete(Ordered_hash hash, Xoa_gui_mgr gui_mgr) {
Init_obsolete_itm(hash, gui_mgr, "xowa.file" , Xog_cmd_itm_.Key_gui_menus_group_file);
Init_obsolete_itm(hash, gui_mgr, "xowa.tabs.new_dflt__at_dflt__focus_y" , Xog_cmd_itm_.Key_gui_browser_tabs_new_dflt__at_dflt__focus_y);
Init_obsolete_itm(hash, gui_mgr, "xowa.tabs.close_cur" , Xog_cmd_itm_.Key_gui_browser_tabs_close_cur);
Init_obsolete_itm(hash, gui_mgr, "xowa.file.save_as" , Xog_cmd_itm_.Key_gui_page_view_save_as);
Init_obsolete_itm(hash, gui_mgr, "xowa.file.print" , Xog_cmd_itm_.Key_gui_page_view_print);
Init_obsolete_itm(hash, gui_mgr, "xowa.file.exit" , Xog_cmd_itm_.Key_app_exit);
Init_obsolete_itm(hash, gui_mgr, "xowa.edit" , Xog_cmd_itm_.Key_gui_menus_group_edit);
Init_obsolete_itm(hash, gui_mgr, "xowa.edit.select_all" , Xog_cmd_itm_.Key_gui_page_selection_select_all);
Init_obsolete_itm(hash, gui_mgr, "xowa.edit.copy" , Xog_cmd_itm_.Key_gui_page_selection_copy);
Init_obsolete_itm(hash, gui_mgr, "xowa.edit.find" , Xog_cmd_itm_.Key_gui_browser_find_show_by_paste);
Init_obsolete_itm(hash, gui_mgr, "xowa.view" , Xog_cmd_itm_.Key_gui_menus_group_view);
Init_obsolete_itm(hash, gui_mgr, "xowa.view.font.increase" , Xog_cmd_itm_.Key_gui_font_increase);
Init_obsolete_itm(hash, gui_mgr, "xowa.view.font.decrease" , Xog_cmd_itm_.Key_gui_font_decrease);
Init_obsolete_itm(hash, gui_mgr, "xowa.view.page.read" , Xog_cmd_itm_.Key_gui_page_view_mode_read);
Init_obsolete_itm(hash, gui_mgr, "xowa.view.page.edit" , Xog_cmd_itm_.Key_gui_page_view_mode_edit);
Init_obsolete_itm(hash, gui_mgr, "xowa.view.page.html" , Xog_cmd_itm_.Key_gui_page_view_mode_html);
Init_obsolete_itm(hash, gui_mgr, "xowa.view.windows.progress.show" , Xog_cmd_itm_.Key_gui_browser_prog_log_show);
Init_obsolete_itm(hash, gui_mgr, "xowa.history" , Xog_cmd_itm_.Key_gui_menus_group_history);
Init_obsolete_itm(hash, gui_mgr, "xowa.history.go_bwd" , Xog_cmd_itm_.Key_nav_go_bwd);
Init_obsolete_itm(hash, gui_mgr, "xowa.history.go_fwd" , Xog_cmd_itm_.Key_nav_go_fwd);
Init_obsolete_itm(hash, gui_mgr, "xowa.history.show" , Xog_cmd_itm_.Key_usr_history_show);
Init_obsolete_itm(hash, gui_mgr, "xowa.bookmarks" , Xog_cmd_itm_.Key_gui_menus_group_bookmarks);
Init_obsolete_itm(hash, gui_mgr, "xowa.bookmarks.goto_main_page" , Xog_cmd_itm_.Key_nav_wiki_main_page);
Init_obsolete_itm(hash, gui_mgr, "xowa.bookmarks.add" , Xog_cmd_itm_.Key_usr_bookmarks_add);
Init_obsolete_itm(hash, gui_mgr, "xowa.bookmarks.show" , Xog_cmd_itm_.Key_usr_bookmarks_show);
Init_obsolete_itm(hash, gui_mgr, "xowa.tools" , Xog_cmd_itm_.Key_gui_menus_group_tools);
Init_obsolete_itm(hash, gui_mgr, "xowa.tools.options" , Xog_cmd_itm_.Key_nav_cfg_main);
Init_obsolete_itm(hash, gui_mgr, "xowa.tools.wikis.import_from_list" , Xog_cmd_itm_.Key_nav_setup_import_from_list);
Init_obsolete_itm(hash, gui_mgr, "xowa.tools.wikis.import_from_script" , Xog_cmd_itm_.Key_nav_setup_import_from_script);
Init_obsolete_itm(hash, gui_mgr, "xowa.tools.wikis.maintenance" , Xog_cmd_itm_.Key_nav_setup_maintenance);
Init_obsolete_itm(hash, gui_mgr, "xowa.tools.wikis.download" , Xog_cmd_itm_.Key_nav_setup_download);
Init_obsolete_itm(hash, gui_mgr, "xowa.help" , Xog_cmd_itm_.Key_gui_menus_group_help);
Init_obsolete_itm(hash, gui_mgr, "xowa.help.help" , Xog_cmd_itm_.Key_nav_help_help);
Init_obsolete_itm(hash, gui_mgr, "xowa.help.change_log" , Xog_cmd_itm_.Key_nav_help_change_log);
Init_obsolete_itm(hash, gui_mgr, "xowa.help.diagnostics" , Xog_cmd_itm_.Key_nav_help_diagnostics);
Init_obsolete_itm(hash, gui_mgr, "xowa.help.context_menu" , Xog_cmd_itm_.Key_nav_cfg_menu);
Init_obsolete_itm(hash, gui_mgr, "xowa.system.data" , Xog_cmd_itm_.Key_gui_menus_group_system_data);
Init_obsolete_itm(hash, gui_mgr, "xowa.system.data.log_session" , Xog_cmd_itm_.Key_nav_system_data_log_session);
Init_obsolete_itm(hash, gui_mgr, "xowa.system.data.cfg_app" , Xog_cmd_itm_.Key_nav_system_data_cfg_app);
Init_obsolete_itm(hash, gui_mgr, "xowa.system.data.cfg_lang" , Xog_cmd_itm_.Key_nav_system_data_cfg_lang);
Init_obsolete_itm(hash, gui_mgr, "xowa.system.data.usr_history" , Xog_cmd_itm_.Key_nav_system_data_usr_history);
Init_obsolete_itm(hash, gui_mgr, "xowa.help.about" , Xog_cmd_itm_.Key_nav_help_about);
Init_obsolete_itm(hash, gui_mgr, "xowa.tabs.new_link__at_dflt__focus_n" , Xog_cmd_itm_.Key_gui_browser_tabs_new_link__at_dflt__focus_n);
Init_obsolete_itm(hash, gui_mgr, "xowa.tabs.new_link__at_dflt__focus_y" , Xog_cmd_itm_.Key_gui_browser_tabs_new_link__at_dflt__focus_y);
Init_obsolete_itm(hash, gui_mgr, "xowa.widgets.find.show_by_paste" , Xog_cmd_itm_.Key_gui_browser_find_show_by_paste);
Init_obsolete_itm(hash, gui_mgr, "xowa.file.save_file_as" , Xog_cmd_itm_.Key_gui_page_selection_save_file_as);
Init_obsolete_itm(hash, gui_mgr, "xowa.widgets.prog_log.show" , Xog_cmd_itm_.Key_gui_browser_prog_log_show);
}
private static void Init_obsolete_itm(Ordered_hash hash, Xoa_gui_mgr gui_mgr, String old, String cur) {
Xog_mnu_itm rv = new Xog_mnu_itm(gui_mgr, cur);
hash.Add(old, rv);
}
}

View File

@@ -0,0 +1,21 @@
/*
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.tabs; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public interface Xog_tab_mgr extends Gfo_invk {
void New_tab(boolean focus, String site, String page);
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.tabs; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_tab_mgr_ {
public static Xog_tab_mgr New_mem() {return new Xog_tab_mgr__mem();}
public static final String Invk__new_tab = "new_tab";
}
class Xog_tab_mgr__mem implements Xog_tab_mgr {
public void New_tab(boolean focus, String site, String page) {}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return this;}
}

View File

@@ -0,0 +1,32 @@
/*
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.tabs; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_tab_mgr__swt implements Xog_tab_mgr {
private final Xoa_gui_mgr gui_mgr;
public Xog_tab_mgr__swt(Xoa_gui_mgr gui_mgr) {this.gui_mgr = gui_mgr;}
public void New_tab(boolean focus, String site, String page) {
// gui_mgr.Browser_win().Tab_mgr().Tabs_new_link(url, focus); // TODO_OLD: handle html dumps
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Xog_tab_mgr_.Invk__new_tab)) gui_mgr.Kit().New_cmd_sync(this).Invk(ctx, ikey, Invk__new_tab_async, m);
else if (ctx.Match(k, Invk__new_tab_async)) this.New_tab(m.ReadYn("focus"), m.ReadStr("site"), m.ReadStr("page"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String Invk__new_tab_async = "new_tab_async";
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.core.net.*; import gplx.core.net.qargs.*; import gplx.core.envs.*;
import gplx.gfui.controls.standards.*;
import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*;
import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.doms.*;
import gplx.xowa.guis.views.*;
public class Xog_url_wkr {
private final Xoa_url tmp_url = Xoa_url.blank();
private Xoae_app app; private Xog_win_itm win; private Xowe_wiki wiki; private Xoae_page page;
public Xoa_url Parse(Xog_win_itm win, String href_str) {
if (href_str == null) return tmp_url; // text is not link; return;
byte[] href_bry = Bry_.new_u8(href_str);
this.win = win; this.app = win.App();
this.page = win.Active_page();
this.wiki = win.Active_tab().Wiki();
app.Html__href_parser().Parse_as_url(tmp_url, href_bry, wiki, page.Ttl().Page_url());
return tmp_url;
}
public void Init(Xowe_wiki wiki) { // TEST:
this.wiki = wiki;
}
public Xoa_url Exec_url(Xoa_url url) {
switch (url.Tid()) {
case Xoa_url_.Tid_unknown: return Xoa_url.Null; // unknown; return null which will become a noop
case Xoa_url_.Tid_inet: return Exec_url_http(app); // http://site.org
case Xoa_url_.Tid_anch: return Exec_url_anchor(win); // #anchor
case Xoa_url_.Tid_xcmd: return Exec_url_xowa(app); // xowa:app.version or /xcmd/app.version
case Xoa_url_.Tid_file: return Exec_url_file(app, wiki, page, win, url.Raw()); // file:///xowa/A.png
case Xoa_url_.Tid_page: return Exec_url_page(wiki, url.Orig()); // /wiki/Page
default: throw Err_.new_unhandled(url.Tid());
}
}
private Xoa_url Exec_url_xowa(Xoae_app app) { // EX: xowa:app.version
// NOTE: must catch exception else it will bubble to SWT browser and raise secondary exception of xowa is not a registered protocol
try {app.Gfs_mgr().Run_str(String_.new_u8(tmp_url.Page_bry()));}
catch (Exception e) {app.Gui_mgr().Kit().Ask_ok("", "", Err_.Message_gplx_full(e));}
return Rslt_handled;
}
private Xoa_url Exec_url_http(Xoae_app app) { // EX: http://a.org
app.Prog_mgr().Exec_view_web(tmp_url.Raw());
return Rslt_handled;
}
private Xoa_url Exec_url_anchor(Xog_win_itm win) { // EX: #anchor
win.Active_html_itm().Scroll_page_by_id_gui(tmp_url.Anch_str()); // NOTE: was originally directly; changed to call on thread; DATE:2014-05-03
return Rslt_handled;
}
private Xoa_url Exec_url_file(Xoae_app app, Xowe_wiki cur_wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: file:///xowa/A.png
Xog_url_wkr__file wkr = new Xog_url_wkr__file(app, cur_wiki, page);
wkr.Extract_data(win.Active_html_box().Html_js_eval_proc_as_str(Xog_js_procs.Doc__root_html_get), href_bry);
wkr.Download_and_run();
return Rslt_handled;
}
private Xoa_url Exec_url_page(Xowe_wiki wiki, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19
return wiki.Utl__url_parser().Parse(href_bry);
}
public static Xoa_url Rslt_handled = null;
public static Xoa_url Exec_url(Xog_win_itm win, String href_str) {
Xog_url_wkr url_wkr = new Xog_url_wkr();
Xoa_url url = url_wkr.Parse(win, href_str);
return url_wkr.Exec_url(url);
}
public static void Get_href_url() {
}
}

View File

@@ -0,0 +1,84 @@
/*
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.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.xowa.files.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.repos.*;
import gplx.xowa.htmls.doms.*;
import gplx.xowa.parsers.lnkis.*;
class Xog_url_wkr__file {
private final Xoae_app app;
private final Xowe_wiki page_wiki;
private final Xoae_page page;
private final Xof_img_size img_size = new Xof_img_size();
private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2();
public Xog_url_wkr__file(Xoae_app app, Xowe_wiki page_wiki, Xoae_page page) {
this.app = app;
this.page_wiki = page_wiki;
this.page = page;
}
public byte[] File_page_db() {return file_page_db;} private byte[] file_page_db;
public Io_url File_url() {return file_url;} private Io_url file_url;
public Xof_fsdb_itm Fsdb() {return fsdb;} private Xof_fsdb_itm fsdb;
public Xowe_wiki File_wiki() {return file_wiki;} private Xowe_wiki file_wiki;
public void Extract_data(String html_doc, byte[] href_bry) { // EX: file:///xowa/A.png
// find xowa_ttl from html_doc for given file; EX: file:///xowa/A.png -> xowa_ttl = "A.png"
String xowa_ttl = Xoh_dom_.Title_by_href(href_bry, Bry_.new_u8(html_doc));
if (xowa_ttl == null) {
app.Gui_mgr().Kit().Ask_ok("", "", "could not find anchor with href in html: href=~{0}", href_bry);
return;
}
// get fsdb itm
this.file_page_db = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(Xoa_ttl.Replace_spaces(Bry_.new_u8(xowa_ttl)));
this.file_wiki = (Xowe_wiki)page.Commons_mgr().Source_wiki_or(page_wiki);
this.fsdb = Xog_url_wkr__file.Make_fsdb(file_wiki, file_page_db, img_size, url_bldr);
this.file_url = Io_url_.New__http_or_fail(String_.new_u8(gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(href_bry)));
}
public void Download_and_run() {
// download file if it doesn't exist
if (!Io_mgr.Instance.ExistsFil(file_url)) {
if (!Xof_file_wkr.Show_img(fsdb, Xoa_app_.Usr_dlg(), file_wiki.File__bin_mgr(), file_wiki.File__mnt_mgr(), file_wiki.App().User().User_db_mgr().Cache_mgr(), file_wiki.File__repo_mgr(), gplx.xowa.guis.cbks.js.Xog_js_wkr_.Noop, img_size, url_bldr, page))
return;
}
// try to launch file
gplx.core.ios.IoItmFil fil = Io_mgr.Instance.QueryFil(file_url);
if (fil.Exists()) {
gplx.core.envs.Process_adp media_player = app.Prog_mgr().App_by_ext(file_url.Ext());
media_player.Args__include_quotes_(gplx.core.envs.Op_sys.Cur().Tid_is_wnt()); // NOTE:Windows "cmd /c start" requies first quoted argument to be title; note that url must be 2nd arg and quoted; DATE:2016-11-14
media_player.Run(file_url);
fsdb.File_size_(fil.Size());
gplx.xowa.files.caches.Xou_cache_mgr cache_mgr = file_wiki.Appe().User().User_db_mgr().Cache_mgr();
cache_mgr.Update(fsdb);
cache_mgr.Db_save();
}
}
public static Xof_fsdb_itm Make_fsdb(Xowe_wiki wiki, byte[] lnki_ttl, Xof_img_size img_size, Xof_url_bldr url_bldr) {
Xof_fsdb_itm fsdb = new Xof_fsdb_itm();
lnki_ttl = Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(lnki_ttl));
fsdb.Init_at_lnki(Xof_exec_tid.Tid_viewer_app, wiki.Domain_itm().Abrv_xo(), lnki_ttl, Xop_lnki_type.Id_none, Xop_lnki_tkn.Upright_null, Xof_img_size.Size__neg1, Xof_img_size.Size__neg1, Xof_lnki_time.Null, Xof_lnki_page.Null, Xof_patch_upright_tid_.Tid_all);
fsdb.Init_at_hdoc(Int_.Max_value, Xof_html_elem.Tid_img);// NOTE: set elem_id to "impossible" number, otherwise it will auto-update an image on the page with a super-large size; [[File:Alfred Sisley 062.jpg]]
Xof_orig_itm orig = wiki.File__orig_mgr().Find_by_ttl_or_null(lnki_ttl); if (orig == Xof_orig_itm.Null) return null; // orig not found; need orig in order to get repo
Xof_repo_itm repo = wiki.File__repo_mgr().Get_trg_by_id_or_null(orig.Repo(), lnki_ttl, Bry_.Empty); if (repo == null) return null; // repo not found
fsdb.Init_at_orig(orig.Repo(), repo.Wiki_domain(), orig.Ttl(), orig.Ext(), orig.W(), orig.H(), orig.Redirect());
fsdb.Init_at_html(Xof_exec_tid.Tid_viewer_app, img_size, repo, url_bldr);
fsdb.File_is_orig_(true);
return fsdb;
}
}

View File

@@ -0,0 +1,68 @@
/*
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.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import org.junit.*; import gplx.core.tests.*;
import gplx.xowa.files.origs.*;
public class Xog_url_wkr__file__tst {
private final Xog_url_wkr__file__fxt fxt = new Xog_url_wkr__file__fxt();
@Test public void Basic() {
fxt.Test__extract("A.png", "file:///mem/xowa/file/commons.wikimedia.org/orig/7/0/A.png", 300, 200);
}
@Test public void Url_encoded() {
fxt.Test__extract("A,b.png", "file:///mem/xowa/file/commons.wikimedia.org/orig/d/6/A%2Cb.png", 300, 200);
}
@Test public void Utf8() {
fxt.Test__extract("Volcán_Chimborazo,_\"El_Taita_Chimborazo\".jpg", "file:///mem/xowa/file/commons.wikimedia.org/orig/3/c/Volc%C3%A1n_Chimborazo%2C_%22El_Taita_Chimborazo%22.jpg", 300, 200);
}
}
class Xog_url_wkr__file__fxt {
private final Xowe_wiki wiki;
private final Bry_bfr bfr = Bry_bfr_.New();
private final Xog_url_wkr__file wkr;
private final Xof_orig_wkr__mock orig_wkr = new Xof_orig_wkr__mock();
public Xog_url_wkr__file__fxt() {
Xoae_app app = Xoa_app_fxt.Make__app__edit();
wiki = Xoa_app_fxt.Make__wiki__edit(app);
Xoa_app_fxt.repo2_(app, wiki);
wiki.File__orig_mgr().Wkrs__add(orig_wkr);
this.wkr = new Xog_url_wkr__file(app, wiki, Xoae_page.New_edit(wiki, wiki.Ttl_parse(Bry_.new_a7("Test_page"))));
}
public String Make__html(byte[] href_bry, byte[] xowa_ttl) {
bfr.Add_str_u8_fmt("<a href=\"{0}\" class=\"@gplx.Internal protected\" title=\"test_title\" xowa_title=\"{1}\">Full resolution</a>", href_bry, xowa_ttl);
return bfr.To_str_and_clear();
}
public void Make__orig(byte repo, byte[] page, int w, int h, byte[] redirect) {
orig_wkr.Add_orig(repo, page, gplx.xowa.files.Xof_ext_.new_by_ttl_(page).Id(), w, h, redirect);
}
public void Exec__extract_data(byte[] href_bry, String html_doc) {
wkr.Extract_data(html_doc, href_bry);
}
public void Test__extract(String file_page_db, String a_href_str, int orig_w, int orig_h) {
byte[] a_href = Bry_.new_u8(a_href_str);
this.Make__orig(Xof_orig_itm.Repo_wiki, Bry_.new_u8(file_page_db), orig_w, orig_h, Bry_.Empty);
byte[] xowa_title_bry = gplx.xowa.htmls.core.wkrs.lnkis.htmls.Xoh_file_fmtr__basic.Escape_xowa_title(Bry_.new_u8(file_page_db));
this.Exec__extract_data(a_href, this.Make__html(a_href, xowa_title_bry));
Gftest.Eq__str(file_page_db , wkr.File_page_db() , "file_page_db");
Gftest.Eq__bry(a_href , wkr.File_url().To_http_file_bry() , "file_url");
Gftest.Eq__bry(a_href , wkr.Fsdb().Html_view_url().To_http_file_bry() , "fsdb.view_url");
Gftest.Eq__int(orig_w , wkr.Fsdb().Orig_w() , "fsdb.orig_w");
Gftest.Eq__int(orig_h , wkr.Fsdb().Orig_h() , "fsdb.orig_h");
}
}

View File

@@ -0,0 +1,48 @@
/*
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.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import org.junit.*; import gplx.core.tests.*;
public class Xog_url_wkr__tst {
private final Xog_url_wkr__fxt fxt = new Xog_url_wkr__fxt();
@Test public void Basic() {
fxt.Exec__parse("/wiki/A?k1=B%26C");
fxt.Test__raw("/wiki/A?k1=B%26C");
}
@Test public void Anch_early() { // de.wikipedia.org/wiki/Kategorie:Begriffskl%C3%A4rung?pagefrom=#::12%20PANZERDIVISION#mw-pages
fxt.Exec__parse("/wiki/A?pagefrom=%23%3A7p#mw-pages");
fxt.Test__qarg("?pagefrom=#:7p");
fxt.Test__anch("mw-pages");
}
}
class Xog_url_wkr__fxt {
private final Xowe_wiki wiki;
private final Xog_url_wkr wkr = new Xog_url_wkr();
private Xoa_url url;
public Xog_url_wkr__fxt() {
Xoae_app app = Xoa_app_fxt.Make__app__edit();
this.wiki = Xoa_app_fxt.Make__wiki__edit(app);
wkr.Init(wiki);
}
public void Exec__parse(String href) {
this.url = wiki.Utl__url_parser().Parse(Bry_.new_u8(href));
this.url = wkr.Exec_url(url);
}
public void Test__raw(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Raw()));}
public void Test__qarg(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Qargs_mgr().To_bry()));}
public void Test__anch(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Anch_bry()));}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.urls.url_macros; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.urls.*;
import gplx.core.btries.*; import gplx.core.brys.fmtrs.*;
public class Xog_url_macro_grp implements Gfo_invk {
public Btrie_slim_mgr Trie() {return trie;} private Btrie_slim_mgr trie = Btrie_slim_mgr.cs();
public void Del(byte[] abrv) {trie.Del(abrv);}
public void Set(String abrv, String fmt) {Set(Bry_.new_u8(abrv), Bry_.new_u8(fmt));}
public void Set(byte[] abrv, byte[] fmt) {trie.Add_obj(abrv, new Xog_url_macro_itm(abrv, fmt));}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_clear)) trie.Clear();
else if (ctx.Match(k, Invk_set)) Set(m.ReadBry("abrv"), m.ReadBry("fmt"));
else if (ctx.Match(k, Invk_del)) Del(m.ReadBry("abrv"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String Invk_clear = "clear", Invk_set = "set", Invk_del = "del";
}
class Xog_url_macro_itm {
private Bry_fmtr fmtr;
public Xog_url_macro_itm(byte[] abrv, byte[] fmt) {this.abrv = abrv; this.fmt = fmt;}
public byte[] Abrv() {return abrv;} private byte[] abrv;
public byte[] Fmt() {return fmt;} private byte[] fmt;
public byte[] Fmtr_exec(Bry_bfr bfr, Object... args) {
if (fmtr == null) fmtr = new Bry_fmtr().Fmt_(fmt).Compile();
fmtr.Bld_bfr_many(bfr, args);
return bfr.To_bry_and_clear();
}
}

View File

@@ -0,0 +1,92 @@
/*
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.urls.url_macros; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.urls.*;
public class Xog_url_macro_mgr {
private Bry_bfr bfr = Bry_bfr_.Reset(255);
public Xog_url_macro_mgr() {
this.Init();
}
public void Lang_default_(byte[] v) {lang_default = v;} private byte[] lang_default = Bry_.new_a7("en");
public Xog_url_macro_grp Types_mgr() {return types_mgr;} private Xog_url_macro_grp types_mgr = new Xog_url_macro_grp();
public Xog_url_macro_grp Custom_mgr() {return custom_mgr;} private Xog_url_macro_grp custom_mgr = new Xog_url_macro_grp();
public byte[] Fmt_or_null(byte[] raw) {
int raw_len = raw.length;
int dot_pos = -1;
for (int i = 0; i < raw_len; i++) {
byte b = raw[i];
switch (b) {
case Byte_ascii.Dot:
dot_pos = i;
break;
case Byte_ascii.Colon:
return Fmt_or_null__type(raw, raw_len, dot_pos, i);
}
}
return Unhandled;
}
private byte[] Fmt_or_null__type(byte[] raw, int raw_len, int dot_pos, int colon_pos) {
boolean dot_missing = dot_pos == -1;
int type_bgn = dot_pos + 1, type_end = colon_pos; // +1 to start type after dot;
if (dot_missing) type_bgn = 0;
Object custom_obj = custom_mgr.Trie().Match_exact(raw, 0, type_end); // match entire prefix
if (custom_obj == null) {
Object type_obj = types_mgr.Trie().Match_exact(raw, type_bgn, type_end);
if (type_obj == null) return Unhandled; // type abrv is not known; exit; EX: "en.unknown:Page"; "Page"
byte[] lang_bry = dot_missing ? lang_default : Bry_.Mid(raw, 0, dot_pos);
Xog_url_macro_itm type_itm = (Xog_url_macro_itm)type_obj;
return type_itm.Fmtr_exec(bfr, lang_bry, Bry_.Mid(raw, colon_pos + 1, raw_len));
}
else {
Xog_url_macro_itm custom_itm = (Xog_url_macro_itm)custom_obj;
return custom_itm.Fmtr_exec(bfr, Bry_.Mid(raw, colon_pos + 1, raw_len));
}
}
private void Init() {
types_mgr.Set("w" , "~{0}.wikipedia.org/wiki/~{1}");
types_mgr.Set("d" , "~{0}.wiktionary.org/wiki/~{1}");
types_mgr.Set("s" , "~{0}.wikisource.org/wiki/~{1}");
types_mgr.Set("v" , "~{0}.wikivoyage.org/wiki/~{1}");
types_mgr.Set("q" , "~{0}.wikiquote.org/wiki/~{1}");
types_mgr.Set("b" , "~{0}.wikibooks.org/wiki/~{1}");
types_mgr.Set("u" , "~{0}.wikiversity.org/wiki/~{1}");
types_mgr.Set("n" , "~{0}.wikinews.org/wiki/~{1}");
types_mgr.Set("a" , "~{0}.wikia.com/wiki/~{1}");
types_mgr.Set("m" , "~{0}.wikimedia.com/wiki/~{1}");
custom_mgr.Set("c" , "commons.wikimedia.org/wiki/~{0}");
custom_mgr.Set("wd" , "www.wikidata.org/wiki/~{0}");
custom_mgr.Set("wd.q" , "www.wikidata.org/wiki/Q~{0}");
custom_mgr.Set("wd.p" , "www.wikidata.org/wiki/Property:P~{0}");
custom_mgr.Set("sp" , "wikispecies.wikimedia.org/wiki/~{0}");
custom_mgr.Set("meta" , "meta.wikimedia.org/wiki/~{0}");
custom_mgr.Set("s.w" , "simple.wikipedia.org/wiki/~{0}");
custom_mgr.Set("s.d" , "simple.wiktionary.org/wiki/~{0}");
custom_mgr.Set("s.b" , "simple.wikibooks.org/wiki/~{0}");
custom_mgr.Set("s.q" , "simple.wikiquote.org/wiki/~{0}");
custom_mgr.Set("?" , "Special:Search/~{0}?fulltext=y");
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_lang_default)) return String_.new_u8(lang_default);
else if (ctx.Match(k, Invk_lang_default_)) lang_default = m.ReadBry("v");
else if (ctx.Match(k, Invk_types)) return types_mgr;
else if (ctx.Match(k, Invk_custom)) return custom_mgr;
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String Invk_lang_default = "lang_default", Invk_lang_default_ = "lang_default_", Invk_types = "types", Invk_custom = "custom";
public static final byte[] Unhandled = null;
}

View File

@@ -0,0 +1,56 @@
/*
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.urls.url_macros; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.urls.*;
import org.junit.*;
public class Xog_url_macro_mgr_tst {
@Before public void init() {fxt.Clear();} private Xog_url_macro_mgr_fxt fxt = new Xog_url_macro_mgr_fxt();
@Test public void Custom_basic() {fxt.Test("?:Page" , "Special:Search/Page?fulltext=y");}
@Test public void Type_basic() {fxt.Test("en.w:Page" , "en.wikipedia.org/wiki/Page");}
@Test public void Type_main() {fxt.Test("en.w:" , "en.wikipedia.org/wiki/");}
@Test public void Type_tid() {fxt.Test("w:Page" , "en.wikipedia.org/wiki/Page");}
@Test public void Type_lang() {fxt.Test("fr.w:Page" , "fr.wikipedia.org/wiki/Page");}
@Test public void Type_unhandled() {fxt.Test("x:A" , null);}
@Test public void Type_unhandled_ns() {fxt.Test("Help:A" , null);}
@Test public void Type_custom() {fxt.Test("wd.q:123" , "www.wikidata.org/wiki/Q123");}
@Test public void Type_del() {
fxt.Test("w:A", "en.wikipedia.org/wiki/A");
fxt.Abrv_mgr().Types_mgr().Del(Bry_.new_a7("w"));
fxt.Test("w:A", null);
}
@Test public void Type_set() {
fxt.Abrv_mgr().Types_mgr().Set("w", "~{0}.~{1}");
fxt.Test("w.A", null);
}
@Test public void Lang_default() {
fxt.Abrv_mgr().Lang_default_(Bry_.new_a7("fr"));
fxt.Test("w:Page", "fr.wikipedia.org/wiki/Page");
}
@Test public void Precedence() { // PURPOSE: Custom should take precedence over type
fxt.Abrv_mgr().Custom_mgr().Set("w", "custom:~{0}");
fxt.Test("w:Page" , "custom:Page");
}
}
class Xog_url_macro_mgr_fxt {
public void Clear() {
abrv_mgr = new Xog_url_macro_mgr();
}
public Xog_url_macro_mgr Abrv_mgr() {return abrv_mgr;} private Xog_url_macro_mgr abrv_mgr;
public void Test(String raw, String expd) {
Tfds.Eq(expd, String_.new_a7(abrv_mgr.Fmt_or_null(Bry_.new_a7(raw))));
}
}

View File

@@ -0,0 +1,56 @@
/*
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.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 boolean show_warn, show_note;
public Gfo_usr_dlg__gui__swt(Xoa_app app, Gfui_kit kit, GfuiTextBox prog_box, GfuiTextBox info_box, GfuiTextBox warn_box) {
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;
app.Cfg().Bind_many_app(this, Cfg__show_warn, Cfg__show_note);
}
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 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 (show_note) Write(Invk_write_note, text);}
public void Write_warn(String text) {if (show_warn) 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);
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 if (ctx.Match(k, Cfg__show_warn)) show_warn = m.ReadYn("v");
else if (ctx.Match(k, Cfg__show_note)) show_note = m.ReadYn("v");
else return Gfo_invk_.Rv_unhandled;
return this;
}
private void Info_box_write(String v, boolean warn) {
if (info_box_is_warn) return;
info_box.Text_(v);
info_box_is_warn = warn;
} boolean info_box_is_warn;
private static final String Invk_write_prog = "write_prog", Invk_write_note = "write_note", Invk_write_warn = "write_warn", Invk_write_stop = "write_stop";
private static final String Cfg__show_warn = "xowa.app.debug.show_warn", Cfg__show_note = "xowa.app.debug.show_note";
}

View File

@@ -0,0 +1,34 @@
/*
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.*;
public class Gfo_usr_dlg_fmt {
public boolean Write_prog_cur(int cur, Gfo_usr_dlg usr_dlg) {
if (cur < prog_prv + prog_interval) return usr_dlg.Canceled();
prog_prv = cur;
String pct = Decimal_adp_.CalcPctStr(cur + List_adp_.Base1, end, "00.00");
usr_dlg.Prog_many(grp_key, msg_key, fmt, Int_.To_str_pad_bgn_zero(cur + List_adp_.Base1, endLen), end, pct);
return usr_dlg.Canceled();
} String fmt; int end, endLen;
public static Gfo_usr_dlg_fmt fmt_(String grp_key, String msg_key, String fmt, int end, float pct) {
Gfo_usr_dlg_fmt rv = new Gfo_usr_dlg_fmt();
rv.grp_key = grp_key; rv.msg_key = msg_key;
rv.fmt = fmt; rv.end = end; rv.endLen = Int_.DigitCount(end); rv.prog_interval = (int)((float)end * (float)(pct / (float)100));;
return rv;
} String grp_key, msg_key;
int prog_interval; int prog_prv = Int_.Min_value;
}

View File

@@ -0,0 +1,61 @@
/*
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.core.envs.*;
public class Load_page_wkr implements Gfo_thread_wkr {
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 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);
// wait_for_popups; free mem check;
this.page = wiki.Page_mgr().Load_page(url, ttl, tab);
// 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;
Gfo_invk_.Invk_by_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_failed_swt, this);
}
finally {
Running_(false);
}
}
private static final Object thread_lock = new Object(); private static boolean running = false;
public static boolean Running() {
boolean rv = false;
synchronized (thread_lock) {
rv = running;
}
return rv;
}
private static void Running_(boolean v) {
synchronized (thread_lock) {
running = v;
}
}
}

View File

@@ -0,0 +1,38 @@
/*
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.*;
public class Rect_ref {
public Rect_ref(int x, int y, int w, int h) {this.x = x; this.y = y; this.w = w; this.h = h;}
public int X() {return x;} public Rect_ref X_(int v) {x = v; return this;} private int x;
public int Y() {return y;} public Rect_ref Y_(int v) {y = v; return this;} private int y;
public int W() {return w;} public Rect_ref W_(int v) {w = v; return this;} private int w;
public int H() {return h;} public Rect_ref H_(int v) {h = v; return this;} private int h;
public int X_max() {return x + w;}
public int Y_max() {return y + h;}
public gplx.gfui.RectAdp XtoRectAdp() {return gplx.gfui.RectAdp_.new_(x, y, w, h);}
public gplx.gfui.RectAdp XtoRectAdp_add(Rect_ref v) {return gplx.gfui.RectAdp_.new_(x + v.x, y + v.y, w + v.w, h + v.h);}
@Override public String toString() {return String_.Format("{0},{1},{2},{3}", x, y, w, h);}
public static final Rect_ref Zero = new Rect_ref(0, 0, 0, 0);
public static Rect_ref rectAdp_(gplx.gfui.RectAdp v) {return new Rect_ref(v.X(), v.Y(), v.Width(), v.Height());}
public static Rect_ref parse(String raw) {
try {
String[] ary = String_.Split(raw, ",");
return new Rect_ref(Int_.parse(ary[0]), Int_.parse(ary[1]), Int_.parse(ary[2]), Int_.parse(ary[3]));
} catch(Exception exc) {throw Err_.new_parse_exc(exc, Rect_ref.class, raw);}
}
}

View File

@@ -0,0 +1,80 @@
/*
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.wikis.pages.lnkis.*;
import gplx.xowa.guis.cbks.js.*;
public class Xog_async_wkr {
public static void Async(Xog_tab_itm tab) {Xog_async_wkr.Async(tab.Page(), tab.Html_itm());}
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);
gplx.xowa.xtns.math.Xomath_latex_bldr.Async(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) {
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));}
}
// if gallery.packed exists, call pack; NOTE:must fire even when there are 0 items in queue b/c hdump will restore images without placing in queue; PAGE:en.w:Mexico DATE:2016-08-14
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();
// call imap
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_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
Xopg_redlink_mgr.Run_async(page, js_wkr);
}
}

View File

@@ -0,0 +1,231 @@
/*
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.primitives.*; import gplx.core.btries.*;
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.guis.cbks.js.*;
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, 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;
app = owner_tab.Tab_mgr().Win().App();
js_cbk = new Xoh_js_cbk(this);
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 = new Gfo_evt_mgr(this);
}
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 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;
comp.owner_tab = temp_owner_tab;
}
public void Html_box_(Gfui_html html_box) {
this.html_box = html_box;
html_box.Html_js_cbks_add("xowa_exec", js_cbk);
Gfo_evt_mgr_.Sub_same(html_box, Gfui_html.Evt_zoom_changed, this);
}
public String Html_selected_get_src_or_empty() {return html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_src_or_empty);}
public String Html_selected_get_href_or_text() {return Html_extract_text(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_href_or_text));}
public String Html_selected_get_text_or_href() {return Html_extract_text(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_text_or_href));}
public String Html_selected_get_active_or_selection() {return Html_extract_text(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_or_selection));}
private String Html_extract_text(String v) {
if (v == null) return ""; // NOTE: Selection__get_text_or_href never gets called on blank hdoc, which is what happens for Special:XowaDefaultTab; DATE:2015-07-09
Xoae_page page = owner_tab.Page();
String site = owner_tab.Wiki().Domain_str();
String ttl = String_.new_u8(page.Ttl().Full_db());
return Xoh_href_gui_utl.Html_extract_text(site, ttl, v);
}
public void Show(Xoae_page page) {
byte view_mode = owner_tab.View_mode();
byte[] html_src = page.Wikie().Html_mgr().Page_wtr_mgr().Gen(page, view_mode); // NOTE: must use wiki of page, not of owner tab; DATE:2015-03-05
Html_src_(page, html_src);
if (view_mode == Xopg_page_.Tid_read){ // used only for Xosrh test; DATE:2014-01-29
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Win__focus_body); // 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_u8(html_bry);
if (owner_tab.Tab_mgr().Page_load_mode_is_url()) {
Io_url html_url = app.Usere().Fsys_mgr().App_temp_html_dir().GenSubFil_ary(owner_tab.Tab_key(), ".html");
try {html_box.Html_doc_html_load_by_url(html_url, html_str);}
catch (Exception e) {
app.Usr_dlg().Warn_many("", "", "failed to write html to file; writing directly by memory: page=~{0} file=~{1} err=~{2}", page.Url().To_str(), html_url.Raw(), Err_.Message_gplx_full(e));
html_box.Html_doc_html_load_by_mem(html_str);
}
}
else
html_box.Html_doc_html_load_by_mem(html_str);
}
public void Html_swap(Xog_html_itm trg_itm) {
Xog_html_itm src_itm = this;
Gfui_html src_html = html_box;
Gfui_html trg_html = trg_itm.html_box;
Xoh_js_cbk src_js_cbk = js_cbk;
Xoh_js_cbk trg_js_cbk = trg_itm.js_cbk;
src_itm.html_box = trg_html;
trg_itm.html_box = src_html;
src_itm.js_cbk = trg_js_cbk;
trg_itm.js_cbk = src_js_cbk;
}
public byte[] Get_elem_value_for_edit_box_as_bry() {return Bry_.new_u8(this.Get_elem_value_for_edit_box());}
public String Get_elem_value_for_edit_box() {return 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_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);
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);
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));}
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);
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.wikis.pages.lnkis.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);
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);
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);
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);
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);
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;
public void Tab_selected(Xoae_page page) {
Xoh_head_mgr module_mgr = page.Html_data().Head_mgr();
if (module_mgr.Itm__gallery().Enabled() && !module_packed_done)
this.Html_gallery_packed_exec();
if (module_mgr.Itm__popups().Enabled() && !module_popups_done)
this.Html_popups_bind_hover_to_doc();
}
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();
if (html_doc_pos == null) {
String auto_focus_id = app.Gui_mgr().Html_mgr().Auto_focus_id();
if (String_.Len_eq_0(auto_focus_id)) return; // don't focus anything
if (String_.Eq(auto_focus_id, " first_anchor")) // NOTE: HTML 4/5 do not allow space as id; XOWA using space here to create a unique_key that will never collide with any id
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Win__focus_body); // NOTE: will focus body if content-editable, else first_anchor
else
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__elem_focus, auto_focus_id);
}
else if (String_.Eq(html_doc_pos, gplx.xowa.guis.history.Xog_history_itm.Html_doc_pos_toc)) // NOTE: special case to handle TOC clicks; DATE:2013-07-17
Scroll_page_by_id("toc");
else {
Html_window_vpos_parse(html_doc_pos, scroll_top, node_path);
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) {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
: html_box.Html_js_eval_proc_as_bool(Xog_js_procs.Win__scroll_elem_into_view, gplx.langs.htmls.encoders.Gfo_url_encoder_.Id.Encode_str(id));
}
public void Js_enabled_(boolean v) {
html_box.Html_js_enabled_(v);
}
private void When_menu_detected() {
Xoa_gui_mgr gui_mgr = app.Gui_mgr(); Gfui_kit kit = gui_mgr.Kit();
Xog_popup_mnu_mgr popup_mnu_mgr = gui_mgr.Menu_mgr().Popup();
Xog_mnu_grp popup_mnu = popup_mnu_mgr.Html_page();
if (String_.Len_gt_0(this.Html_selected_get_src_or_empty()))
popup_mnu = popup_mnu_mgr.Html_file();
else if (String_.Len_gt_0(this.Html_selected_get_text_or_href()))
popup_mnu = popup_mnu_mgr.Html_link();
kit.Set_mnu_popup(html_box, popup_mnu.Under_mnu());
}
private void When_zoom_changed(boolean clicks_is_positive) {
app.Api_root().Gui().Font().Adj(clicks_is_positive ? 1 : -1);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_html_img_update)) html_box.Html_js_eval_proc_as_bool (Xog_js_procs.Doc__elem_img_update , m.ReadStr("elem_id"), m.ReadStr("elem_src"), m.ReadInt("elem_width"), m.ReadInt("elem_height"));
else if (ctx.Match(k, Invk_html_elem_atr_set)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Doc__atr_set , m.ReadStr("elem_id"), m.ReadStr("atr_key"), m.ReadStr("atr_val"));
else if (ctx.Match(k, Invk_html_doc_atr_append_or_set)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Doc__atr_append_or_set , m.ReadStr("elem_id"), m.ReadStr("atr_key"), m.ReadStr("atr_val"));
else if (ctx.Match(k, Invk_html_elem_delete)) html_box.Html_js_eval_proc_as_bool (Xog_js_procs.Doc__elem_delete , m.ReadStr("elem_id"));
else if (ctx.Match(k, Invk_html_elem_replace_html)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Doc__elem_replace_html , m.ReadStr("id"), m.ReadStr("html"));
else if (ctx.Match(k, Invk_html_elem_append_above)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Doc__elem_append_above , m.ReadStr("id"), m.ReadStr("html"));
else if (ctx.Match(k, Invk_html_gallery_packed_exec)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Xtn__gallery_packed_exec);
else if (ctx.Match(k, Invk_html_popups_bind_hover_to_doc)) html_box.Html_js_eval_script("xowa_popups_bind_doc();");
else if (ctx.Match(k, Invk_scroll_page_by_bmk)) Scroll_page_by_bmk();
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 if (ctx.Match(k, Gfui_html.Evt_zoom_changed)) When_zoom_changed(m.ReadBool("clicks_is_positive"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String
Invk_html_gallery_packed_exec = "html_gallery_packed_exec", Invk_html_popups_bind_hover_to_doc = "html_popups_bind_hover_to_doc"
, Invk_html_img_update = "html_img_update", Invk_html_elem_atr_set = "html_elem_atr_set"
, Invk_html_doc_atr_append_or_set = "html_doc_atr_append_or_set", Invk_html_elem_delete = "html_elem_delete", Invk_html_elem_replace_html = "html_elem_replace_html", Invk_html_elem_append_above = "html_elem_append_above"
, Invk_scroll_page_by_bmk = "scroll_page_by_bmk", Invk_scroll_page_by_id = "scroll_page_by_id"
;
public static final String
Elem_id__xowa_edit_data_box = "xowa_edit_data_box"
, Elem_id__xowa_edit_rename_box = "xowa_edit_rename_box"
, Elem_id__first_heading = "firstHeading"
, Invk_html_elem_focus = "html_elem_focus"
;
public static void Html_window_vpos_parse(String v, String_obj_ref scroll_top, String_obj_ref node_path) {
int pipe_pos = String_.FindFwd(v, "|"); if (pipe_pos == String_.Find_none) return; // if elem_get_path returns invalid value, don't fail; DATE:2014-04-05
scroll_top.Val_(String_.Mid(v, 0, pipe_pos));
String node_path_val = String_.Mid(v, pipe_pos + 1, String_.Len(v));
node_path_val = "'" + String_.Replace(node_path_val, ",", "','") + "'";
node_path.Val_(node_path_val);
}
}

View File

@@ -0,0 +1,46 @@
/*
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.*;
public class Xog_js_procs {
public static final String
Win__focus_body = "xowa.js.win.focus_body"
, Win__vpos_get = "xowa.js.win.vpos_get"
, Win__vpos_set = "xowa.js.win.vpos_set"
, Win__find_in_hdoc = "xowa.js.win.find_in_hdoc"
, Win__find_in_textarea = "xowa.js.win.find_in_textarea"
, Win__scroll_elem_into_view = "xowa.js.win.scroll_elem_into_view"
, Win__print_preview = "xowa.js.win.print_preview"
, Doc__root_html_get = "xowa.js.doc.root_html_get"
, Doc__atr_get_as_obj = "xowa.js.doc.atr_get_as_obj"
, Doc__atr_get_to_str = "xowa.js.doc.atr_get_to_str"
, Doc__atr_set = "xowa.js.doc.atr_set"
, Doc__atr_append_or_set = "xowa.js.doc.atr_append_or_set"
, Doc__elem_focus = "xowa.js.doc.elem_focus"
, Doc__elem_delete = "xowa.js.doc.elem_delete"
, Doc__elem_append_above = "xowa.js.doc.elem_append_above"
, Doc__elem_replace_html = "xowa.js.doc.elem_replace_html"
, Doc__elem_img_update = "xowa.js.doc.elem_img_update"
, Selection__get_text_or_href = "xowa.js.selection.get_text_or_href"
, Selection__get_href_or_text = "xowa.js.selection.get_href_or_text"
, Selection__get_active_or_selection = "xowa.js.selection.get_active_or_selection"
, Selection__get_src_or_empty = "xowa.js.selection.get_src_or_empty"
, Selection__get_active_for_editable_mode = "xowa.js.selection.get_active_for_editable_mode"
, Selection__toggle_focus_for_anchor = "xowa.js.selection.toggle_focus_for_anchor"
, Xtn__gallery_packed_exec = "xowa.js.xtn.gallery_packed_exec"
;
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
import gplx.xowa.apps.urls.*;
class Xog_launcher_tabs {
public void Launch(Xog_win_itm win) {
Xoae_app app = win.App(); Gfo_log_bfr log_bfr = app.Log_bfr();
log_bfr.Add("app.launch.page.bgn");
Io_fil_marker fil_marker = new Io_fil_marker().Usr_dlg_(app.Usr_dlg()).Url_(app.Usere().Fsys_mgr().App_temp_dir().GenSubFil_nest("session", "launch.tabs.marker"));
boolean tabs_restored = false;
Xowe_wiki home_wiki = app.Usere().Wiki();
if (fil_marker.Bgn())
tabs_restored = Restore_tabs(app, home_wiki, win, fil_marker);
if (!tabs_restored)
Restore_tab_failover(app, home_wiki, win);
// tab.Html_itm().Html_box().Focus(); // focus the html_box so wheel scroll works; DATE:2013-02-08
app.Usr_dlg().Prog_none("", "", "");
log_bfr.Add("app.launch.page.end");
app.Usr_dlg().Log_wkr().Log_to_session_direct(log_bfr.Xto_str());
}
private boolean Restore_tabs(Xoae_app app, Xowe_wiki home_wiki, Xog_win_itm win, Io_fil_marker fil_marker) {
Xog_startup_tabs startup_tabs = new Xog_startup_tabs().Init_by_app(app).Calc();
String[] launch_urls = startup_tabs.Startup_urls();
try {
int launch_urls_len = launch_urls.length;
for (int i = 0; i < launch_urls_len; ++i) {
String launch_url = launch_urls[i];
Launch_tab(win, home_wiki, launch_url);
}
app.Gui_mgr().Browser_win().Tab_mgr().Tabs_select_by_idx(startup_tabs.Startup_idx());
fil_marker.End();
return true;
}
catch (Exception e) {
app.Usr_dlg().Warn_many("", "", "failed to launch urls: urls=~{0} err=~{1}", String_.AryXtoStr(launch_urls), Err_.Message_gplx_full(e));
Restore_tab_failover(app, home_wiki, win);
return false;
}
}
private void Restore_tab_failover(Xoae_app app, Xowe_wiki home_wiki, Xog_win_itm win) {
try {Launch_tab(win, home_wiki, Xog_startup_tabs.Url__home_main);}
catch (Exception e) {app.Usr_dlg().Warn_many("", "", "failed to launch failover tab: err=~{0}", Err_.Message_gplx_full(e));}
}
private void Launch_tab(Xog_win_itm win, Xowe_wiki home_wiki, String launch_str) {
Xoae_app app = win.App();
Xoa_url launch_url = home_wiki.Utl__url_parser().Parse_by_urlbar_or_null(launch_str); if (launch_url == null) return;
Xowe_wiki launch_wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(launch_url.Wiki_bry());
Xoa_ttl launch_ttl = Xoa_ttl.Parse(launch_wiki, launch_url.Page_bry());
Xog_tab_itm tab = win.Tab_mgr().Tabs_new_init(launch_wiki, Xoae_page.New(launch_wiki, launch_ttl)); // WORKAROUND: set the tab to an empty page, else null ref later; DATE:2014-07-23
tab.Show_url_bgn(launch_url);
}
public static final Xog_launcher_tabs Instance = new Xog_launcher_tabs(); Xog_launcher_tabs() {}
}
class Io_fil_marker {
private Io_url url;
private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Instance;
public Io_fil_marker Usr_dlg_(Gfo_usr_dlg v) {this.usr_dlg = v; return this;}
public Io_fil_marker Url_(Io_url url) {this.url = url; return this;}
public boolean Bgn() {
boolean rv = false;
synchronized (this) {
try {
rv = !Io_mgr.Instance.ExistsFil(url); // exists = fail; !exists = pass;
if (rv) // pass: file does not exist;
Io_mgr.Instance.SaveFilStr(url, ""); // create
else // file exists from previous run
Io_mgr.Instance.DeleteFil(url); // delete
}
catch (Exception exc) { // something unexpected happened
usr_dlg.Warn_many("", "", "marker.bgn failed: url=~{0} err=~{1}", url.Raw(), Err_.Message_gplx_full(exc));
Io_mgr.Instance.DeleteFil(url); // try to delete it again
}
}
return rv;
}
public void End() {
synchronized (this) {
try {
Io_mgr.Instance.DeleteFil(url); // delete
}
catch (Exception exc) {
usr_dlg.Warn_many("", "", "marker.end failed: url=~{0} err=~{1}", url.Raw(), Err_.Message_gplx_full(exc));
Io_mgr.Instance.DeleteFil(url); // try to delete it again
}
}
}
}

View File

@@ -0,0 +1,110 @@
/*
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.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);
url_box.Owner_(this);
url_exec_btn.Owner_(this);
find_close_btn.Owner_(this);
search_box.Owner_(this);
search_exec_btn.Owner_(this);
html_box.Owner_(this);
find_box.Owner_(this);
prog_box.Owner_(this);
note_box.Owner_(this);
main_win.Owner_(this);
}
public Xog_layout_box Go_fwd_btn() {return go_fwd_btn;} private Xog_layout_box go_fwd_btn = new Xog_layout_box();
public Xog_layout_box Go_bwd_btn() {return go_bwd_btn;} private Xog_layout_box go_bwd_btn = new Xog_layout_box();
public Xog_layout_box Url_box() {return url_box;} private Xog_layout_box url_box = new Xog_layout_box();
public Xog_layout_box Url_exec_btn() {return url_exec_btn;} private Xog_layout_box url_exec_btn = new Xog_layout_box();
public Xog_layout_box Find_close_btn() {return find_close_btn;} private Xog_layout_box find_close_btn = new Xog_layout_box();
public Xog_layout_box Search_box() {return search_box;} private Xog_layout_box search_box = new Xog_layout_box();
public Xog_layout_box Search_exec_btn() {return search_exec_btn;} private Xog_layout_box search_exec_btn = new Xog_layout_box();
public Xog_layout_box Html_box() {return html_box;} private Xog_layout_box html_box = new Xog_layout_box();
public Xog_layout_box Find_box() {return find_box;} private Xog_layout_box find_box = new Xog_layout_box();
public Xog_layout_box Find_fwd_btn() {return find_fwd_btn;} private Xog_layout_box find_fwd_btn = new Xog_layout_box();
public Xog_layout_box Find_bwd_btn() {return find_bwd_btn;} private Xog_layout_box find_bwd_btn = new Xog_layout_box();
public Xog_layout_box Prog_box() {return prog_box;} private Xog_layout_box prog_box = new Xog_layout_box();
public Xog_layout_box Note_box() {return note_box;} private Xog_layout_box note_box = new Xog_layout_box();
public Xog_layout_box Browser_win() {return main_win;} private Xog_layout_box main_win = new Xog_layout_box();
public void Find_show() {
Visible_(true, win.Find_box(), win.Find_bwd_btn(), win.Find_fwd_btn(), win.Find_close_btn());
GfuiTextBox find_box = win.Find_box();
find_box.Focus();
int text_len = String_.Len(find_box.Text());
if (text_len > 0) { // if text exists, select it; GUI:Firefox
find_box.SelBgn_set(0);
find_box.SelLen_set(text_len);
}
}
public void Find_close() {
Visible_(false, win.Find_box(), win.Find_bwd_btn(), win.Find_fwd_btn(), win.Find_close_btn());
win.Active_html_box().Focus();
}
private void Visible_(boolean v, GfuiElem... ary) {
int ary_len = ary.length;
for (int i = 0; i < ary_len; i++)
ary[i].Visible_set(v);
}
public void Init(Xog_win_itm win) {
this.win = win;
go_bwd_btn.Adj_text(win.Go_bwd_btn());
go_fwd_btn.Adj_text(win.Go_fwd_btn());
url_box.Adj_text(win.Url_box());
url_exec_btn.Adj_text(win.Url_exec_btn());
find_close_btn.Adj_text(win.Find_close_btn());
search_box.Adj_text(win.Search_box());
search_exec_btn.Adj_text(win.Search_exec_btn());
find_box.Adj_text(win.Find_box());
find_fwd_btn.Adj_text(win.Find_fwd_btn());
find_bwd_btn.Adj_text(win.Find_bwd_btn());
prog_box.Adj_text(win.Prog_box());
note_box.Adj_text(win.Info_box());
win.Tab_mgr().Tab_mgr().TextMgr().Font_(win.Url_box().TextMgr().Font());
Visible_(false, win.Find_box(), win.Find_bwd_btn(), win.Find_fwd_btn(), win.Find_close_btn());
} private Xog_win_itm win;
public int Box_height_calc(Gfui_kit kit, GfuiElem url_box) {
if (box_height > 0) return box_height;
float font_height = kit.Calc_font_height(url_box, "I");
box_height = (int)(font_height * 2);
return box_height;
} private int box_height = 0;
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_go_fwd_btn)) return go_fwd_btn;
else if (ctx.Match(k, Invk_go_bwd_btn)) return go_bwd_btn;
else if (ctx.Match(k, Invk_url_box)) return url_box;
else if (ctx.Match(k, Invk_url_exec_btn)) return url_exec_btn;
else if (ctx.Match(k, Invk_find_close_btn)) return find_close_btn;
else if (ctx.Match(k, Invk_search_box)) return search_box;
else if (ctx.Match(k, Invk_search_exec_btn)) return search_exec_btn;
else if (ctx.Match(k, Invk_html_box)) return html_box;
else if (ctx.Match(k, Invk_find_box)) return find_box;
else if (ctx.Match(k, Invk_find_fwd_btn)) return find_fwd_btn;
else if (ctx.Match(k, Invk_find_bwd_btn)) return find_bwd_btn;
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 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

@@ -0,0 +1,83 @@
/*
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.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;} private int x_abs = Int_.Min_value;
public int Y_abs() {return y_abs;} private int y_abs = Int_.Min_value;
public int W_abs() {return w_abs;} private int w_abs = Int_.Min_value;
public int H_abs() {return h_abs;} private int h_abs = Int_.Min_value;
private int x_rel = Int_.Min_value;
private int y_rel = Int_.Min_value;
public Xog_layout_box W_rel_(int v) {w_rel = v; return this;} private int w_rel = Int_.Min_value;
public Xog_layout_box H_rel_(int v) {h_rel = v; return this;} private int h_rel = Int_.Min_value;
private String text;
private String font_name;
private float font_size = Float_.NaN;
private FontStyleAdp font_style;
public byte Mode() {return mode;} private byte mode = Mode_rel;
public void Adj_size(Rect_ref rect) {
if (w_abs > -1) rect.W_(w_abs); if (w_rel != Int_.Min_value) rect.W_(w_rel + rect.W());
if (h_abs > -1) rect.H_(h_abs); if (h_rel != Int_.Min_value) rect.H_(h_rel + rect.H());
}
public void Adj_pos(Rect_ref rect) {
if (x_abs > -1) rect.X_(x_abs); if (x_rel != Int_.Min_value) rect.X_(x_rel + rect.X());
if (y_abs > -1) rect.Y_(y_abs); if (y_rel != Int_.Min_value) rect.Y_(y_rel + rect.Y());
}
public void Adj_text(GfuiElem elem) {
if (text != null) elem.Text_(text);
if (font_name != null || !Float_.IsNaN(font_size) || font_style != null)
elem.TextMgr().Font_(Font_make(font_name, font_size, font_style));
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_x_abs_)) x_abs = m.ReadInt("v");
else if (ctx.Match(k, Invk_y_abs_)) y_abs = m.ReadInt("v");
else if (ctx.Match(k, Invk_w_abs_)) w_abs = m.ReadInt("v");
else if (ctx.Match(k, Invk_h_abs_)) h_abs = m.ReadInt("v");
else if (ctx.Match(k, Invk_x_rel_)) x_rel = m.ReadInt("v");
else if (ctx.Match(k, Invk_y_rel_)) y_rel = m.ReadInt("v");
else if (ctx.Match(k, Invk_w_rel_)) w_rel = m.ReadInt("v");
else if (ctx.Match(k, Invk_h_rel_)) h_rel = m.ReadInt("v");
else if (ctx.Match(k, Invk_size_abs_)) {int[] ary = Int_.Ary_parse(m.ReadStr("v"), 2, null); if (ary != null) {w_abs = ary[0]; h_abs = ary[1];}}
else if (ctx.Match(k, Invk_size_rel_)) {int[] ary = Int_.Ary_parse(m.ReadStr("v"), 2, null); if (ary != null) {w_rel = ary[0]; h_rel = ary[1];}}
else if (ctx.Match(k, Invk_pos_abs_)) {int[] ary = Int_.Ary_parse(m.ReadStr("v"), 2, null); if (ary != null) {x_abs = ary[0]; y_abs = ary[1];}}
else if (ctx.Match(k, Invk_pos_rel_)) {int[] ary = Int_.Ary_parse(m.ReadStr("v"), 2, null); if (ary != null) {x_rel = ary[0]; y_rel = ary[1];}}
else if (ctx.Match(k, Invk_rect_abs_)) {int[] ary = Int_.Ary_parse(m.ReadStr("v"), 4, null); if (ary != null) {w_abs = ary[0]; h_abs = ary[1]; x_abs = ary[2]; y_abs = ary[3];}}
else if (ctx.Match(k, Invk_rect_rel_)) {int[] ary = Int_.Ary_parse(m.ReadStr("v"), 4, null); if (ary != null) {w_rel = ary[0]; h_rel = ary[1]; x_rel = ary[2]; y_rel = ary[3];}}
else if (ctx.Match(k, Invk_text_)) text = m.ReadStr("v");
else if (ctx.Match(k, Invk_font_name_)) font_name = m.ReadStr("v");
else if (ctx.Match(k, Invk_font_size_)) font_size = m.ReadFloat("v");
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 Gfo_invk_.Rv_unhandled;
return this;
}
public static final byte Mode_abs = 0, Mode_rel = 1;
private static final String Invk_x_abs_ = "x_abs_", Invk_y_abs_ = "y_abs_", Invk_w_abs_ = "w_abs_", Invk_h_abs_ = "h_abs_", Invk_x_rel_ = "x_rel_", Invk_y_rel_ = "y_rel_", Invk_w_rel_ = "w_rel_", Invk_h_rel_ = "h_rel_"
, Invk_size_abs_ = "size_abs_", Invk_pos_abs_ = "pos_abs_", Invk_rect_abs_ = "rect_abs_", Invk_size_rel_ = "size_rel_", Invk_pos_rel_ = "pos_rel_", Invk_rect_rel_ = "rect_rel_"
, Invk_text_ = "text_"
, Invk_font_name_ = "font_name_", Invk_font_size_ = "font_size_", Invk_font_style_ = "font_style_", Invk_mode_ = "mode_", Invk_owner = "owner";
private static FontAdp Font_make(String font_name, float font_size, FontStyleAdp font_style) {
String new_font_name = font_name == null ? "Arial" : font_name;
float new_font_size = Float_.IsNaN(font_size) ? 8 : font_size;
FontStyleAdp new_font_style = font_style == null ? FontStyleAdp_.Plain : font_style;
return FontAdp.new_(new_font_name, new_font_size, new_font_style);
}
}

View File

@@ -0,0 +1,123 @@
/*
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.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.updates.specials.*;
public class Xog_startup_tabs {
private String type, custom_list, prev_list, prev_version, curr_version;
private boolean show_app_update;
public int Startup_idx() {return startup_idx;} private int startup_idx;
public String[] Startup_urls() {return startup_urls;} private String[] startup_urls = String_.Ary_empty;
public Xog_startup_tabs Init_by_app(Xoae_app app) {
Xocfg_mgr cfg = app.Cfg();
this.type = cfg.Get_str_app_or(Cfg__startup_type, Opt__startup_type__previous);
this.custom_list = cfg.Get_str_app_or(Cfg__custom_list, "");
this.prev_list = cfg.Get_str_app_or(Cfg__prev_list, "");
this.prev_version = cfg.Get_str_app_or(Cfg__prev_version, "");
this.curr_version = Xoa_app_.Version;
this.startup_idx = cfg.Get_int_app_or(Cfg__prev_selected, -1);
this.show_app_update = gplx.xowa.addons.apps.updates.Xoa_update_startup.Show_at_startup(app);
return this;
}
public Xog_startup_tabs Calc() {
List_adp list = List_adp_.New(); // NOTE: do not change to hash; duplicate urls are possible
// process main types
if (Manual == null) {
if (String_.Eq(type, "blank")) list.Add(gplx.xowa.specials.Xow_special_meta_.Itm__default_tab.Ttl_str());
else if (String_.Eq(type, "xowa")) list.Add(Url__home_main);
else if (String_.Eq(type, "custom")) Parse_ary(list, custom_list);
else if (String_.Eq(type, Opt__startup_type__previous)) Parse_ary(list, prev_list);
else throw Err_.new_unhandled(type);
}
else
list.Add(Manual);
// if new version, add home/wiki/Main_Page
if (gplx.xowa.apps.versions.Xoa_version_.Compare(prev_version, curr_version) == CompareAble_.Less) {
startup_idx = Add_if_absent(list, Url__home_main);
}
// if show_app_update, add page
if (show_app_update) {
startup_idx = Add_if_absent(list, Xoa_update_special.Prototype.Special__meta().Url__home());
}
// generate urls
startup_urls = (String[])list.To_ary_and_clear(String.class);
// do bounds check
if (startup_idx < 0 || startup_idx >= startup_urls.length)
startup_idx = startup_urls.length - 1;
return this;
}
private static int Add_if_absent(List_adp list, String page) {
// check list for page
int len = list.Len();
for (int i = 0; i < len; i++) {
String itm = (String)list.Get_at(i);
// page found; return its index
if (String_.Eq(itm, page)) {
return i;
}
}
// add if not found
list.Add(page);
return list.Len();
}
private static void Parse_ary(List_adp list, String s) {
if (String_.Len_eq_0(s)) return;
String[] ary = String_.SplitLines_nl(String_.Trim(s));
int len = ary.length;
for (int i = 0; i < len; i++) {
String itm = ary[i];
if (String_.Len_eq_0(itm)) continue;
list.Add(itm);
}
}
public static String Version_previous(Xoa_app app) {return app.Cfg().Get_str_app_or(Cfg__prev_version, "");}
public static void Shutdown(Xoae_app app) {
app.Cfg().Set_str_app(Cfg__prev_version, Xoa_app_.Version);
if (String_.Eq(app.Cfg().Get_str_app_or(Cfg__startup_type, Opt__startup_type__previous), Opt__startup_type__previous)) {
app.Cfg().Set_str_app(Cfg__prev_list , Calc_previous_tabs(app.Gui_mgr().Browser_win().Tab_mgr()));
app.Cfg().Set_int_app(Cfg__prev_selected, app.Gui_mgr().Browser_win().Tab_mgr().Active_tab().Tab_idx());
}
}
private static String Calc_previous_tabs(gplx.xowa.guis.views.Xog_tab_mgr tab_mgr) {
Bry_bfr bfr = Bry_bfr_.New();
int len = tab_mgr.Tabs_len();
for (int i = 0; i < len; ++i) {
if (i != 0) bfr.Add_byte_nl();
gplx.xowa.guis.views.Xog_tab_itm tab = tab_mgr.Tabs_get_at(i);
bfr.Add_str_u8(tab.Page().Url().To_str());
}
return bfr.To_str_and_clear();
}
public static String Manual = null; // note set by command-line at startup;
private static final String
Cfg__startup_type = "xowa.app.startup.tabs.type"
, Cfg__custom_list = "xowa.app.startup.tabs.custom"
, Cfg__prev_list = "xowa.app.startup.tabs.previous_list"
, Cfg__prev_selected = "xowa.app.startup.tabs.previous_selected"
, Cfg__prev_version = "xowa.app.setup.previous_version"
, Opt__startup_type__previous = "previous";
public static final String
Url__home_main = "home/wiki/Main_Page"
;
}

View File

@@ -0,0 +1,109 @@
/*
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.envs.*;
import gplx.gfui.*; import gplx.gfui.envs.*; import gplx.gfui.controls.windows.*;
public class Xog_startup_win_ {
public static void Startup(Xoa_app app, GfuiWin win) {
gplx.xowa.addons.apps.cfgs.Xocfg_mgr cfg_mgr = app.Cfg();
String window_mode = cfg_mgr.Get_str_app_or(Cfg__window_mode, "previous");
Rect_ref manual_rect = Rect_ref.parse(cfg_mgr.Get_str_app_or(Cfg__manual_rect, "0,0,800,640"));
// change win_rect per mode: previous; absolute; etc.
boolean init_is_maximized = false;
if (String_.Eq(window_mode, "previous")) {
if (cfg_mgr.Get_bool_app_or(Cfg__prev_maximized, false)) {
win.Maximized_(true);
init_is_maximized = true;
}
else {
Rect_ref previous_rect = null;
String s = cfg_mgr.Get_str_app_or(Cfg__prev_rect, "");
if (String_.Eq(s, "")) {
SizeAdp size = Screen_maximized_calc();
previous_rect = new Rect_ref(0, 0, size.Width(), size.Height());
}
else
previous_rect = Rect_ref.parse(s);
win.Rect_set(previous_rect.XtoRectAdp());
}
}
else if (String_.Eq(window_mode, "absolute")) {
win.Rect_set(manual_rect.XtoRectAdp());
}
else if (String_.Eq(window_mode, "maximized")) {
win.Maximized_(true);
init_is_maximized = true;
}
else if (String_.Eq(window_mode, "default")) {} // noop
else if (String_.Eq(window_mode, "relative")) {
SizeAdp screen_maximized = Screen_maximized_calc();
Rect_ref win_rect = new Rect_ref(0, 0, screen_maximized.Width(), screen_maximized.Height());
win.Rect_set(win_rect.XtoRectAdp_add(manual_rect));
}
// make sure win_rect is safe
boolean safe_mode = cfg_mgr.Get_bool_app_or(Cfg__manual_safe, true);
if (safe_mode && !init_is_maximized) {
RectAdp rect = win.Rect();
boolean force = false; int x = rect.X(), y = rect.Y(), w = rect.Width(), h = rect.Height();
SizeAdp screen_size = Screen_maximized_calc();
int max_w = screen_size.Width(), max_h = screen_size.Height();
int Safe_mode_buffer = 20; // allow minor negative positioning (x=-5), off-screen positioning (w=1605)
if (x < -Safe_mode_buffer || x > max_w + Safe_mode_buffer) {force = true; x = 0;}
if (y < -Safe_mode_buffer || y > max_h + Safe_mode_buffer) {force = true; y = 0;}
if (w < Safe_mode_buffer || x + w > max_w + Safe_mode_buffer) {force = true; w = max_w - x;}
if (h < Safe_mode_buffer || y + h > max_h + Safe_mode_buffer) {force = true; h = max_h - y;}
if (force)
win.Rect_set(RectAdp_.new_(x, y, w, h));
}
}
public static void Shutdown(Xoae_app app, GfuiWin win) {
gplx.xowa.addons.apps.cfgs.Xocfg_mgr cfg_mgr = app.Cfg();
if (String_.Eq(cfg_mgr.Get_str_app_or(Cfg__window_mode, "previous"), "previous")) {
cfg_mgr.Set_str_app(Cfg__prev_rect , win.Rect().Xto_str());
cfg_mgr.Set_str_app(Cfg__prev_maximized , Yn.To_str(win.Maximized()));
}
Xog_startup_tabs.Shutdown(app);
}
public static SizeAdp Screen_maximized_calc() {
Op_sys os = Op_sys.Cur();
SizeAdp screen = ScreenAdp_.screen_(0).Size();
int w = screen.Width();
int h = screen.Height() - 30; // -20=application menu bar; -10 for start bar padding
switch (os.Tid()) {
case Op_sys.Tid_wnt:
switch (os.Sub_tid()) {
case Op_sys.Sub_tid_win_xp: h += -4; break; // NOOP; will keep values as above
default: break; // for all else, use Windows 7 border (which is thicker); note that Windows 8 is being detected as "Windows NT (unknown)", so need to use default; this may not work with Windows 2000
}
break;
default:
h += -4; // default adjustments since version 0.0.0.0; seems to work on XP and LNX
break;
}
return SizeAdp_.new_(w, h);
}
private static final String
Cfg__window_mode = "xowa.app.startup.window.mode"
, Cfg__manual_rect = "xowa.app.startup.window.manual_rect"
, Cfg__manual_safe = "xowa.app.startup.window.manual_safe"
, Cfg__prev_rect = "xowa.app.startup.window.previous_rect"
, Cfg__prev_maximized = "xowa.app.startup.window.previous_maximized"
;
}

View File

@@ -0,0 +1,21 @@
/*
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.*;
public interface Xog_tab_close_lnr {
boolean When_close(Xog_tab_itm tab, Xoa_url url);
}

View File

@@ -0,0 +1,33 @@
/*
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.*;
public class Xog_tab_close_mgr {
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();}
public Xog_tab_close_lnr Get_at(int i) {return (Xog_tab_close_lnr)list.Get_at(i);}
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, url)) return false;
}
return true;
}
}

View File

@@ -0,0 +1,245 @@
/*
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.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.wikis.pages.lnkis.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.skins.*;
public class Xog_tab_itm implements Gfo_invk {
private Xog_win_itm win;
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;
this.win = tab_mgr.Win();
this.html_itm = new Xog_html_itm(this);
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 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();
Gfui_html html_box = kit.New_html("html_box" + Int_.To_str(uid), owner);
html_box.Html_js_enabled_(tab_mgr.Javascript_enabled());
html_box.Html_invk_src_(win);
html_itm.Html_box_(html_box);
if (app.Mode().Tid_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);
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
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());
}
}
public void Switch_mem(Xog_tab_itm comp) {
html_itm.Switch_mem(comp.html_itm); // switch html_itm.owner_tab reference only
Xog_html_itm temp_html_itm = html_itm; // switch .html_itm, since the underlying CTabFolder has reparented the control
this.html_itm = comp.html_itm;
comp.html_itm = temp_html_itm;
Xoae_page temp_page = page; // switch .page, since its underlying html_box has changed and .page must reflect html_box
this.page = comp.page;
comp.page = temp_page;
page.Tab_data().Tab_(this); comp.Page().Tab_data().Tab_(comp);
byte temp_view_mode = view_mode; // switch .view_mode to match .page
this.view_mode = comp.view_mode;
comp.view_mode = temp_view_mode;
Xog_history_mgr temp_history_mgr = history_mgr; // switch .history_mgr along with .page
this.history_mgr = comp.history_mgr;
comp.history_mgr = temp_history_mgr;
}
public Gfui_tab_itm_data Tab_data() {return tab_data;} private Gfui_tab_itm_data tab_data;
public String Tab_key() {return tab_data.Key();}
public int Tab_idx() {return tab_data.Idx();} public void Tab_idx_(int v) {tab_data.Idx_(v);}
public Xog_tab_mgr Tab_mgr() {return tab_mgr;} private Xog_tab_mgr tab_mgr;
public Gfui_tab_itm Tab_box() {return tab_box;} private Gfui_tab_itm tab_box;
public boolean Tab_is_loading() {return tab_is_loading;} private boolean tab_is_loading;
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_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() {
this.Tab_name_();
tab_box.Tab_tip_text_(page.Url().To_str());
}
public void Tab_name_() {
byte[] tab_name = page.Html_data().Custom_tab_name(); // Custom_tab_name set by Special:Default_tab or variants; DATE:2015-10-05
if (tab_name == null) tab_name = page.Ttl().Full_txt_w_ttl_case(); // no custom_tab_name; use ttl's text
Tab_name_(String_.new_u8(tab_name));
}
public void Tab_name_(String tab_name) {
tab_name = Xog_tab_itm_.Tab_name_min(tab_name, tab_mgr.Btns__min_chars());
tab_name = Xog_tab_itm_.Tab_name_max(tab_name, tab_mgr.Btns__max_chars());
tab_box.Tab_name_(tab_name);
}
public Xog_history_mgr History_mgr() {return history_mgr;} private Xog_history_mgr history_mgr = new Xog_history_mgr();
public byte View_mode() {return view_mode;} public Xog_tab_itm View_mode_(byte v) {view_mode = v; return this;} private byte view_mode = Xopg_page_.Tid_read;
public void Pin_toggle() {}
public void Show_url_bgn(Xoa_url url) {
this.tab_is_loading = true;
Xoae_app app = win.App(); Gfo_usr_dlg usr_dlg = app.Usr_dlg();
// get new_tab_name
this.wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(url.Wiki_bry()); // NOTE: must go before wiki.Props().Main_page(); DATE:2016-08-02; NOTE: must load wiki; DATE:2015-07-22
if (url.Page_is_main()) url.Page_bry_(wiki.Props().Main_page()); // NOTE: must go before ttl.Make; DATE:2016-07-31
Xoa_ttl ttl = wiki.Ttl_parse(url.Page_bry());
if (ttl == null) {usr_dlg.Prog_one("", "", "title is invalid: ~{0}", String_.new_u8(url.Raw())); return;}
String new_tab_name = String_.new_u8(ttl.Full_txt_w_ttl_case());
// if clicking on anchor, just scroll; do not load page
if ( url.Anch_str() != null // url has anchor
&& url.Eq_page(page.Url()) // url has same page_name as existing page
&& url.Qargs_ary().length == 0 // url has no args; needed for Category:A?from=b#mw-pages
&& String_.Eq(new_tab_name, tab_data.Name()) // NOTE: name will be null / empty when starting app and last session had page with #anchor; EX:Main_Page#Links; DATE:2016-07-21
) {
html_itm.Scroll_page_by_id_gui(url.Anch_str());
return;
}
if (win.Page__async__working(url)) return;
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.Gui_wkr().Clear();
if (url.Vnt_bry() != null) {
byte[] vnt = url.Vnt_bry();
if (!Bry_.Eq(vnt, wiki.Lang().Vnt_mgr().Cur_itm().Key()))
wiki.Appe().Cfg().Set_bry_wiki(wiki, Xowe_wiki.Cfg__variant__current, vnt);
}
Tab_name_(new_tab_name);
usr_dlg.Prog_one("", "", "loading: ~{0}", String_.new_u8(ttl.Raw()));
if (wiki.Html_mgr().Head_mgr().Popup_mgr().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
app.Thread_mgr_old().Page_load_mgr().Add_at_end(new Load_page_wkr(this, wiki, url, ttl)).Run();
}
private void Show_url_loaded(Load_page_wkr wkr) {
Xowe_wiki wiki = wkr.Wiki(); Xoae_page page = wkr.Page();
Xoa_url url = page.Url(); Xoa_ttl ttl = page.Ttl();
Xoae_app app = wiki.Appe(); Gfo_usr_dlg usr_dlg = app.Usr_dlg();
try {
if (page.Tab_data().Cancel_show()) return; // Special:Search canceled show; NOTE: must be inside try b/c finally handles thread
wiki.Parser_mgr().Ctx().Page_(page);
if ( page.Db().Page().Exists_n()
&& !page.Commons_mgr().Xowa_mockup()) { // do not enter "missing" section if File_mockup; EX:en.wikipedia.org/wiki/File:Protoplanetary-disk.jpg DATE:2016-11-13
if (wiki.Db_mgr().Save_mgr().Create_enabled()) {
page = Xoae_page.New_edit(wiki, ttl);
view_mode = Xopg_page_.Tid_edit;
history_mgr.Add(page); // NOTE: must put new_page on stack so that pressing back will pop new_page, not previous page
Xog_tab_itm_read_mgr.Show_page(this, page, false);
}
else {
wkr.Page().Tab_data().Tab().Page_(page); // NOTE: must set tab's page to current page, so that switching to it will update url bar; EX:pt.b:A"MANUAL_DE_PROCEDURI_.Sectiunea:""CONTABILITATE_SI_MANAGEMENT_FINANCIAR""" DATE:2015-09-17
if (page.Redirect_trail().Itms__len() > 0)
usr_dlg.Prog_many("", "", "could not find page in wiki: ~{0} (redirected from ~{1})", String_.new_u8(page.Url().Page_bry()), page.Redirect_trail().Itms__get_at_0th_or_null());
else {
if (ttl.Ns().Id_is_file())
usr_dlg.Prog_one("", "", "commons.wikimedia.org must be installed in order to view the file. See [[App/Wiki_types/Commons]]: ~{0}", String_.new_u8(url.Raw()));// HOME
else
usr_dlg.Prog_one("", "", "could not find page in wiki: ~{0}", String_.new_u8(url.Raw()));
}
}
app.Log_wtr().Queue_enabled_(false);
return;
}
// if (!page.Redirected()) page.Url_(url); // NOTE: handle redirect from commons; COMMENTED: part of redirect rewrite; DATE:2016-07-05
if (page.Ttl().Anch_bgn() != Bry_find_.Not_found) page.Url().Anch_bry_(page.Ttl().Anch_txt()); // NOTE: occurs when page is a redirect to an anchor; EX: w:Duck race -> Rubber duck#Races
history_mgr.Add(page);
Xog_tab_itm_read_mgr.Show_page(this, page, true);
if (app.Usere().History_mgr().Enabled()) {
app.Usere().History_mgr().Add(page);
app.User().User_db_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()); // 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 (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_mgr().Imgs());
async_wkr = new Load_files_wkr(this);
if (wiki.Html__hdump_enabled() && page.Db().Page().Html_db_id() == -1) {
wiki.Html__hdump_mgr().Save_mgr().Save(page);
}
}
else
async_wkr = new Load_files_wkr(this);
page.Html_data().Mode_wtxt_shown_y_();
app.Thread_mgr_old().File_load_mgr().Add_at_end(async_wkr).Run();
// app.Thread_mgr().Get_by_or_new("on_page_load").Add(new Xopg_img_thread(), new Xopg_rl_thread());
}
finally {
app.Thread_mgr_old().Page_load_mgr().Resume();
this.tab_is_loading = false;
}
}
public void Exec_async_hdump(Xoa_app app, Xow_wiki wiki, gplx.xowa.guis.cbks.js.Xog_js_wkr js_wkr, gplx.core.threads.Gfo_thread_pool thread_pool, Xoa_page page, List_adp imgs, int[] redlink_ary) {
if (imgs.Count() > 0) {
Xof_file_wkr file_thread = new Xof_file_wkr
( wiki.File__orig_mgr(), wiki.File__bin_mgr(), wiki.File__mnt_mgr()
, app.User().User_db_mgr().Cache_mgr(), wiki.File__repo_mgr(), html_itm, page, imgs
);
thread_pool.Add_at_end(file_thread); thread_pool.Run();
}
if (redlink_ary.length > 0) {
Xog_redlink_thread redlink_thread = new Xog_redlink_thread(redlink_ary, js_wkr);
thread_pool.Add_at_end(redlink_thread); thread_pool.Run();
}
}
public void Exec_notify(boolean pass, String msg) {
this.Html_box().Html_js_eval_proc_as_str("xowa.cmds.exec_by_str", "xowa.notify", "{\"text\":\"" + msg + "\",\"status\":\"" + (pass ? "success" : "error") + "\"}");
}
@gplx.Internal protected void Show_url_failed(Load_page_wkr wkr) {
try {
Xog_tab_itm_read_mgr.Show_page_err(win, this, wkr.Wiki(), wkr.Url(), wkr.Ttl(), wkr.Exec_err());
} finally {
wkr.Wiki().Appe().Thread_mgr_old().Page_load_mgr().Resume();
}
}
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 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";
}
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 Thread__name() {return "xowa.load_files_wkr";}
public boolean Thread__resume() {return true;}
public void Thread__exec() {
try {Xog_async_wkr.Async(tab);}
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

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_tab_itm_ {
public static String Tab_name_min(String name, int min) {
int name_len = String_.Len(name);
return min == Tab_name_min_disabled || name_len > min ? name : name + String_.Repeat(" ", min - name_len);
}
public static String Tab_name_max(String name, int max) {
int name_len = String_.Len(name);
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;
}

View File

@@ -0,0 +1,132 @@
/*
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.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 {
public static void Save(Xog_tab_itm tab, boolean quick_save) {
if (tab.View_mode() != Xopg_page_.Tid_edit) return; // exit if not edit; handles ctrl+s being pressed in read/html modes
Xoae_page page = tab.Page(); Xowe_wiki wiki = tab.Wiki(); Xog_win_itm win_itm = tab.Tab_mgr().Win();
byte[] new_text = Get_new_text(tab, page.Db().Text().Text_bry());
if (page.Edit_mode() == Xoa_page_.Edit_mode_create) {
int page_id = wiki.Db_mgr().Save_mgr().Data_create(page.Ttl(), new_text);
page.Db().Page().Id_(page_id);
page.Edit_mode_update_(); // set to update so that next save does not try to create
}
else {
wiki.Db_mgr().Save_mgr().Data_update(page, new_text);
}
Invalidate(wiki);
page.Db().Text().Text_bry_(new_text);
wiki.Parser_mgr().Parse(page, true); // refresh html
if (wiki.Html__hdump_enabled()) wiki.Html__hdump_mgr().Save_mgr().Save(page); // must go after wiki.Parse
win_itm.Usr_dlg().Prog_one("", "", "saved page ~{0}", String_.new_u8(page.Ttl().Full_txt_raw())); // NOTE: show message after Parse, b/c Parse will flash "Loading page"; DATE:2014-05-17
if (!quick_save) { // full_save; save page and go to read mode
page.Html_data().Edit_preview_(Bry_.Empty);
Xoae_page stack_page = tab.History_mgr().Cur_page(wiki); // NOTE: must be to CurPage() else changes will be lost when going Bwd,Fwd
stack_page.Db().Text().Text_bry_(page.Db().Text().Text_bry()); // NOTE: overwrite with "saved" changes
stack_page.Wikie().Parser_mgr().Parse(page, true); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save
page.Url_(Xoa_url.New(tab.Wiki().Domain_bry(), tab.Page().Ttl().Full_db()));
win_itm.Page__mode_(Xopg_page_.Tid_read);
win_itm.Page__async__bgn(tab);
}
// wiki.Db_mgr().Hdump_mgr().Save(page);
}
public static void Preview(Xog_tab_itm tab) {
if (tab.View_mode() != Xopg_page_.Tid_edit) return; // exit if not edit; handles preview somehow being called?
Xoae_page page = tab.Page(); Xowe_wiki wiki = tab.Wiki(); Xog_win_itm win_itm = tab.Tab_mgr().Win();
Xog_html_itm html_itm = tab.Html_itm();
byte[] new_text = Get_new_text(tab, null);
Xoae_page new_page = Xoae_page.New(wiki, page.Ttl());
new_page.Db().Page().Id_(page.Db().Page().Id()); // NOTE: page_id needed for sqlite (was not needed for xdat)
new_page.Db().Text().Text_bry_(new_text);
wiki.Parser_mgr().Parse(new_page, true); // refresh html
tab.Page_(new_page); new_page.Tab_data().Tab_(tab); // replace old page with new_page; DATE:2014-10-09
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, 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);
Invalidate(wiki);
win_itm.Page__mode_(Xopg_page_.Tid_edit);
html_itm.Scroll_page_by_id_gui(Xog_html_itm.Elem_id__first_heading);// NOTE: was originally directly; changed to call on thread; DATE:2014-05-03
win_itm.Page__async__bgn(tab); // NOTE: needed to show images during preview; DATE:2014-06-21
}
public static void Rename(Xog_tab_itm tab) {
if (tab.View_mode() != Xopg_page_.Tid_edit) return; // exit if not edit; handles ctrl+r being pressed
Xoae_page page = tab.Page(); Xowe_wiki wiki = tab.Wiki(); Xog_win_itm win_itm = tab.Tab_mgr().Win();
if (Bry_.Eq(page.Ttl().Page_db(), wiki.Props().Main_page())) {
win_itm.Usr_dlg().Warn_many("", "", "The Main Page cannot be renamed");
win_itm.Kit().Ask_ok("", "", "The Main Page cannot be renamed");
return;
}
byte[] new_text = Bry_.new_u8(tab.Html_itm().Get_elem_value(Xog_html_itm.Elem_id__xowa_edit_rename_box));
if (Bry_.Len_eq_0(new_text)) return; // no ttl given; exit
new_text = Xoa_ttl.Replace_spaces(new_text); // ttls cannot have spaces; only underscores
Xoa_ttl new_ttl = Xoa_ttl.Parse(wiki, new_text);
int new_ns_id = new_ttl.Ns().Id();
if (new_ns_id != Xow_ns_.Tid__main) {
win_itm.Usr_dlg().Warn_many("", "", "The new page name must remain in the same namespace");
return;
}
wiki.Db_mgr().Save_mgr().Data_rename(page, new_ns_id, new_text);
page.Ttl_(Xoa_ttl.Parse(wiki, Bry_.Add(page.Ttl().Ns().Name_db_w_colon(), new_text)));
win_itm.Page__mode_(Xopg_page_.Tid_read);
win_itm.Usr_dlg().Prog_one("", "", "renamed page to {0}", String_.new_u8(page.Ttl().Full_txt_raw()));
}
public static void Focus(Xog_win_itm win, String elem_focus_id) {
Gfui_html html_box = win.Active_html_box();
html_box.Focus();
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__elem_focus, elem_focus_id);
}
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_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);
byte[] data = tab.Html_itm().Get_elem_value_for_edit_box_as_bry();
new_page.Db().Text().Text_bry_(data);
wiki.Parser_mgr().Parse(new_page, true);
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_m001();
bfr.Add(new_page.Root().Root_src());
wiki.Parser_mgr().Ctx().Defn_trace().Print(data, bfr);
new_page.Db().Text().Text_bry_(bfr.To_bry_and_rls());
byte old = tab.View_mode();
tab.View_mode_(view_tid);
Xog_tab_itm_read_mgr.Show_page(tab, new_page, false);
tab.History_mgr().Add(new_page);
tab.View_mode_(old);
}
private static void Invalidate(Xowe_wiki wiki) {// invalidate everything on updates; especially needed for page transclusion; {{/my_subpage}} DATE:2014-04-10
wiki.Parser_mgr().Scrib().Core_term();
wiki.Cache_mgr().Free_mem__all();
}
private static byte[] Get_new_text(Xog_tab_itm tab, byte[] orig) {
byte[] rv = tab.Html_itm().Get_elem_value_for_edit_box_as_bry();
if (orig != null) // orig == null for Preview
rv = tab.Wiki().Parser_mgr().Hdr__section_editable__mgr().Merge_section(tab.Page().Url(), rv, orig);
rv = Bry_.Trim(rv, 0, rv.length, false, true, Bry_.Trim_ary_ws); // MW: trim all trailing ws; REF:EditPage.php!safeUnicodeInput; DATE:2014-04-25
return rv;
}
}

View File

@@ -0,0 +1,87 @@
/*
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.gfui.*; import gplx.gfui.controls.standards.*; import gplx.xowa.guis.langs.*; import gplx.xowa.guis.history.*;
import gplx.xowa.wikis.pages.lnkis.*; import gplx.xowa.wikis.pages.*;
public class Xog_tab_itm_read_mgr {
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);
if (new_page.Url().Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit))
tab.View_mode_(Xopg_page_.Tid_edit);
Xoae_page cur_page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm(); Gfui_html html_box = html_itm.Html_box();
Xog_win_itm win = tab.Tab_mgr().Win();
if (cur_page != null && !new_page_is_same) { // if new_page_is_same, don't update DocPos; will "lose" current position
cur_page.Html_data().Bmk_pos_(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_get));
tab.History_mgr().Update_html_doc_pos(cur_page, history_nav_type); // HACK: old_page is already in stack, but need to update its hdoc_pos
}
win.Usr_dlg().Prog_none("", "", "locating images");
Xowe_wiki wiki = new_page.Wikie();
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_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;
}
else
Show_page_err(win, tab, wiki, new_page.Url(), new_page.Ttl(), e);
return;
}
tab.Page_(new_page);
if (tab == tab.Tab_mgr().Active_tab())
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);
tab.Tab_mgr().Tab_mgr().Focus();
html_box.Focus();
win.Usr_dlg().Prog_none("", "", ""); // blank out status bar
if (tab.View_mode() == Xopg_page_.Tid_read)
html_itm.Scroll_page_by_bmk_gui();
else
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) {
String url_str = "", win_str = Win_text_blank;
if (url != null && ttl != null) {
url_str = url.To_str();
win_str = String_.new_u8(Bry_.Add(ttl.Full_txt_w_ttl_case(), Win_text_suffix_page));
}
win.Url_box().Text_(url_str);
win.Win_box().Text_(win_str);
}
private static final byte[] Win_text_suffix_page = Bry_.new_a7(" - XOWA"); private static final String Win_text_blank = "XOWA";
public static void Show_page_err(Xog_win_itm win, Xog_tab_itm tab, Xowe_wiki wiki, Xoa_url url, Xoa_ttl ttl, Exception e) {
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().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);
win.Win_box().Text_(err_msg);
}
public static void Launch(Xog_win_itm win) {
Xog_launcher_tabs.Instance.Launch(win);
}
}

View File

@@ -0,0 +1,280 @@
/*
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.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.apis.xowa.gui.browsers.*; import gplx.xowa.specials.*;
import gplx.xowa.apps.urls.*;
public class Xog_tab_mgr implements Gfo_evt_itm {
private Ordered_hash tab_regy = Ordered_hash_.New(); private int tab_uid = 0;
private boolean btns__hide_if_one; private int btns__height;
public Xog_tab_mgr(Xog_win_itm win) {
this.win = win;
ev_mgr = new Gfo_evt_mgr(this);
}
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 int Btns__min_chars() {return btns__min_chars;} private int btns__min_chars;
public int Btns__max_chars() {return btns__max_chars;} private int btns__max_chars;
public boolean Javascript_enabled() {return javascript_enabled;} private boolean javascript_enabled = true;
private byte page_load_mode;
public boolean Page_load_mode_is_url() {return page_load_mode == Gxw_html_load_tid_.Tid_url;}
public void Init_by_kit(Gfui_kit kit) {
tab_mgr = kit.New_tab_mgr("xowa.tab_mgr", win.Win_box());
active_tab = Xog_tab_itm_.Null;
tab_mgr.Btns_selected_color_(ColorAdp_.White);
tab_mgr.Btns_unselected_color_(ColorAdp_.LightGray);
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);
win.App().Cfg().Bind_many_app(this, Cfg__javascript_enabled, Cfg__page_load_mode
, Cfg__place_on_top, Cfg__height, Cfg__hide_if_one, Cfg__curved, Cfg__close_btn_visible, Cfg__unselected_close_btn_visible, Cfg__max_chars, Cfg__min_chars);
}
public Xog_tab_itm Active_tab() {return active_tab;} private Xog_tab_itm active_tab;
public Xog_tab_itm Active_tab_assert() {
if (active_tab == Xog_tab_itm_.Null) this.Tabs_new_dflt(true);
return active_tab;
}
public boolean Active_tab_is_null() {return active_tab == Xog_tab_itm_.Null;}
private void Btns_text_recalc() {
int len = this.Tabs_len();
for (int i = 0; i < len; i++) {
Xog_tab_itm tab_itm = this.Tabs_get_at(i);
tab_itm.Tab_name_();
}
}
public int Tabs_len() {return tab_regy.Count();}
public Xog_tab_itm Tabs_new_init(Xowe_wiki wiki, Xoae_page page) {return this.Tabs_new(true, true, wiki, page);}
public Xog_tab_itm Tabs_get_at(int i) {return (Xog_tab_itm)tab_regy.Get_at(i);}
public Xog_tab_itm Tabs_new_dflt() {return Tabs_new_dflt(false);}
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, 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();
rv.Show_url_bgn(url);
return rv;
}
private Xog_tab_itm Tabs_new(boolean focus, boolean active_tab_is_null, Xowe_wiki wiki, Xoae_page page) {
String tab_key = "tab_" + Int_.To_str(tab_uid++); int tab_idx = tab_regy.Count();
Gfui_tab_itm_data tab_data = new Gfui_tab_itm_data(tab_key, tab_idx);
Xog_tab_itm rv = new Xog_tab_itm(this, tab_data, wiki, page);
Gfui_tab_itm tab_box = tab_mgr.Tabs_add(tab_data);
rv.Make_html_box(tab_uid, tab_box, win, tab_mgr);
rv.Html_itm().Js_enabled_(javascript_enabled);
tab_box.Subs_add(rv.Html_itm().Html_box());
tab_regy.Add(tab_key, rv);
if ( focus
|| active_tab_is_null // NOTE: must select 1st tab, else nothing will show in tab box
) {
tab_mgr.Tabs_select_by_idx(rv.Tab_idx());
active_tab = rv;
}
Tabs_hide_if_one_chk(false);
return rv;
}
public void Tabs_new_dupe(boolean focus) {
if (this.Active_tab_is_null()) return;
String url = active_tab.Page().Url().To_str();
Tabs_new_dflt(focus);
win.Page__navigate_by_url_bar(url);
}
public void Tabs_javascript_enabled_(boolean v) {
this.javascript_enabled = v;
int len = tab_regy.Count();
for (int i = 0; i < len; i++) {
Xog_tab_itm tab = Tabs_get_by_idx_or_warn(i);
tab.Html_itm().Js_enabled_(v);
}
}
private void Tabs_selected(String key) {
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, page.Url(), page.Ttl());
tab.Html_itm().Tab_selected(page);
}
public void Tabs_close_cur() {
if (this.Active_tab_is_null()) return;
Tabs__pub_close(active_tab);
tab_mgr.Tabs_close_by_idx(active_tab.Tab_idx());
Xog_tab_itm cur_tab = this.Active_tab(); // get new current tab for line below
if (cur_tab != null) cur_tab.Html_box().Focus(); // NOTE: needed to focus tab box else tab button will be focused; DATE:2014-07-13
}
public void Tabs_close_others() {this.Tabs_close_to_bgn(); this.Tabs_close_to_end();}
public void Tabs_close_to_bgn() {if (Active_tab_is_null()) return; Tabs_close_rng(0 , active_tab.Tab_idx());}
public void Tabs_close_to_end() {if (Active_tab_is_null()) return; Tabs_close_rng(active_tab.Tab_idx() + 1 , tab_regy.Count());}
public void Tabs_close_rng(int bgn, int end) {
for (int i = bgn; i < end; i++) {
Xog_tab_itm tab = Tabs_get_at(bgn);
if (!Tabs__pub_close(tab)) return;
}
for (int i = bgn; i < end; i++)
tab_mgr.Tabs_close_by_idx(bgn); // NOTE: close at bgn, not at i, b/c each close will remove a tab from collection
}
public boolean Tabs__pub_close_all() {return Tabs__pub_close_rng(0, this.Tabs_len());}
public boolean Tabs__pub_close_rng(int bgn, int end) {
boolean rv = true;
for (int i = bgn; i < end; i++) {
Xog_tab_itm tab = Tabs_get_at(i);
boolean close_allowed = Tabs__pub_close(tab);
if (!close_allowed) rv = false;
}
return rv;
}
public boolean Tabs__pub_close(Xog_tab_itm 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;
String url = (String)List_adp_.Pop(closed_undo_list);
Tabs_new_dflt(true);
win.Page__navigate_by_url_bar(url);
}
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();
closed_undo_list.Add(itm.Page().Url().To_str());
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);
}
else
Tabs_recalc_idx();
Tabs_hide_if_one_chk(false);
}
private Xog_tab_itm Tabs_get_by_key_or_warn(String key) {
Xog_tab_itm rv = (Xog_tab_itm)tab_regy.Get_by(key); if (rv == null) win.App().Usr_dlg().Warn_many("", "", "tab.selected could not find tab; key={0}", key);
return rv;
}
private Xog_tab_itm Tabs_get_by_idx_or_warn(int idx) {
Xog_tab_itm rv = (Xog_tab_itm)tab_regy.Get_at(idx); if (rv == null) win.App().Usr_dlg().Warn_many("", "", "tab.selected could not find tab; idx={0}", idx);
return rv;
}
private void Tabs_recalc_idx() {
int len = tab_regy.Count();
for (int i = 0; i < len; i++) {
Xog_tab_itm itm = Tabs_get_by_idx_or_warn(i);
itm.Tab_idx_(i);
}
}
public void Tabs_select(boolean fwd) {
if (this.Active_tab_is_null()) return;
int new_idx = TabBox_.Cycle(fwd, active_tab.Tab_idx(), tab_regy.Count());
tab_mgr.Tabs_select_by_idx(new_idx);
}
public void Tabs_select_by_idx(int v) {
if (v < 0 || v >= tab_regy.Count()) return;
tab_mgr.Tabs_select_by_idx(v);
}
public void Tabs_move(boolean fwd) {
if (this.Active_tab_is_null()) return;
int src_idx = active_tab.Tab_idx();
int trg_idx = TabBox_.Cycle(fwd, src_idx, tab_regy.Count());
tab_mgr.Tabs_switch(src_idx, trg_idx);
}
private void Tabs_switched(String src_key, String trg_key) {
Xog_tab_itm src_itm = Tabs_get_by_key_or_warn(src_key);
Xog_tab_itm trg_itm = Tabs_get_by_key_or_warn(trg_key);
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) { // handle empty link
if (String_.Len_eq_0(link)) {
if (this.Active_tab_is_null()) return;
link = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode_str(active_tab.Html_itm().Html_selected_get_active_or_selection()); // NOTE: must decode else url-encoded special pages don't work; EX:home/wiki/Special:XowaCfg%3Fgrp%3Dxowa.html.css; DATE:2017-01-02
}
if (String_.Len_eq_0(link)) {win.App().Usr_dlg().Prog_many("", "", "no link or text selected"); return;}
Tabs_new_link(link, focus);
}
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 = wiki.Utl__url_parser().Parse_by_urlbar_or_null(link); if (url == null) return; // NOTE: link must be of form domain/wiki/page; DATE:2014-05-27
new_tab.Show_url_bgn(url);
if (focus)
tab_mgr.Tabs_select_by_idx(new_tab.Tab_idx());
}
private void Tabs_hide_if_one_chk(boolean force) {
if (btns__hide_if_one || force) {// run code only if enabled or forced
if (tab_regy.Count() == 1) {
int desired_height = btns__hide_if_one ? 0 : btns__height;
if (tab_mgr.Btns_height() != desired_height)
tab_mgr.Btns_height_(desired_height);
}
else {
if (tab_mgr.Btns_height() != btns__height)
tab_mgr.Btns_height_(btns__height);
}
}
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_tabs_new_dflt__at_dflt__focus_y)) Tabs_new_dflt(Bool_.Y);
else if (ctx.Match(k, Invk_tabs_new_link__at_dflt__focus_n)) Tabs_new_link(Bool_.N, m.ReadStrOr("v", null));
else if (ctx.Match(k, Invk_tabs_new_link__at_dflt__focus_y)) Tabs_new_link(Bool_.Y, m.ReadStrOr("v", null));
else if (ctx.Match(k, Gfui_tab_mgr.Evt_tab_selected)) Tabs_selected(m.ReadStr("key"));
else if (ctx.Match(k, Gfui_tab_mgr.Evt_tab_closed)) Tabs_closed(m.ReadStr("key"));
else if (ctx.Match(k, Gfui_tab_mgr.Evt_tab_switched)) Tabs_switched(m.ReadStr("src"), m.ReadStr("trg"));
else if (ctx.Match(k, Invk_tabs_close_cur)) Tabs_close_cur();
else if (ctx.Match(k, Invk_tabs_select_bwd)) Tabs_select(Bool_.N);
else if (ctx.Match(k, Invk_tabs_select_fwd)) Tabs_select(Bool_.Y);
else if (ctx.Match(k, Invk_tabs_switch_cur_bwd)) Tabs_move(Bool_.N);
else if (ctx.Match(k, Invk_tabs_switch_cur_fwd)) Tabs_move(Bool_.Y);
else if (ctx.Match(k, Cfg__place_on_top)) tab_mgr.Btns_place_on_top_(m.ReadYn("v"));
else if (ctx.Match(k, Cfg__height)) {btns__height = m.ReadInt("v"); tab_mgr.Btns_height_(btns__height);}
else if (ctx.Match(k, Cfg__hide_if_one)) {btns__hide_if_one = m.ReadYn("v"); Tabs_hide_if_one_chk(true);}
else if (ctx.Match(k, Cfg__curved)) tab_mgr.Btns_curved_(m.ReadYn("v"));
else if (ctx.Match(k, Cfg__close_btn_visible)) tab_mgr.Btns_close_visible_(m.ReadYn("v"));
else if (ctx.Match(k, Cfg__unselected_close_btn_visible)) tab_mgr.Btns_unselected_close_visible_(m.ReadYn("v"));
else if (ctx.Match(k, Cfg__max_chars)) {btns__max_chars = m.ReadInt("v"); Btns_text_recalc();}
else if (ctx.Match(k, Cfg__min_chars)) {btns__min_chars = m.ReadInt("v"); Btns_text_recalc();}
else if (ctx.Match(k, Cfg__javascript_enabled)) Tabs_javascript_enabled_(m.ReadYnOrY("v")); // NOTE: must be "OrY" else broken cfg.db will break cfg_maint; DATE:2016-12-15
else if (ctx.Match(k, Cfg__page_load_mode)) Page_load_mode_(m.ReadStr("v"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
private void Page_load_mode_(String v) {
page_load_mode = Gxw_html_load_tid_.Xto_tid(v);
// Gfo_evt_mgr_.Pub_val(this, Evt_load_tid_changed, load_tid);
}
public static final String
Invk_tabs_select_fwd = "tabs_select_fwd" , Invk_tabs_select_bwd = "tabs_select_bwd"
, Invk_tabs_switch_cur_fwd = "tabs_switch_cur_fwd" , Invk_tabs_switch_cur_bwd = "tabs_switch_cur_bwd"
, Invk_tabs_new_dflt__at_dflt__focus_y = "tabs_new_dflt__at_dflt__focus_y"
, Invk_tabs_new_link__at_dflt__focus_n = "tabs_new_link__at_dflt__focus_n"
, Invk_tabs_new_link__at_dflt__focus_y = "tabs_new_link__at_dflt__focus_y"
, Invk_tabs_close_cur = "tabs_close_cur"
;
private static final String
Cfg__place_on_top = "xowa.gui.tabs.place_on_top"
, Cfg__height = "xowa.gui.tabs.height"
, Cfg__hide_if_one = "xowa.gui.tabs.hide_if_one"
, Cfg__curved = "xowa.gui.tabs.curved"
, Cfg__close_btn_visible = "xowa.gui.tabs.close_btn_visible"
, Cfg__unselected_close_btn_visible = "xowa.gui.tabs.unselected_close_btn_visible"
, Cfg__max_chars = "xowa.gui.tabs.max_chars"
, Cfg__min_chars = "xowa.gui.tabs.min_chars"
, Cfg__javascript_enabled = "xowa.gui.html_box.javascript_enabled"
, Cfg__page_load_mode = "xowa.gui.html_box.page_load_mode"
;
}

View File

@@ -0,0 +1,353 @@
/*
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.core.envs.*;
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.wikis.pages.lnkis.*; import gplx.xowa.specials.*; import gplx.xowa.xtns.math.*;
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;
this.tab_mgr = new Xog_tab_mgr(this);
}
public Gfui_kit Kit() {return kit;} private Gfui_kit kit;
public Xoa_gui_mgr Gui_mgr() {return gui_mgr;} private Xoa_gui_mgr gui_mgr;
public GfuiWin Win_box() {return win_box;} private GfuiWin win_box;
public GfuiBtn Go_bwd_btn() {return go_bwd_btn;} private GfuiBtn go_bwd_btn;
public GfuiBtn Go_fwd_btn() {return go_fwd_btn;} private GfuiBtn go_fwd_btn;
public GfuiComboBox Url_box() {return url_box;} private GfuiComboBox url_box;
public GfuiBtn Url_exec_btn() {return url_exec_btn;} private GfuiBtn url_exec_btn;
public GfuiTextBox Search_box() {return search_box;} private GfuiTextBox search_box;
public GfuiBtn Search_exec_btn() {return search_exec_btn;} private GfuiBtn search_exec_btn;
public GfuiTextBox Find_box() {return find_box;} private GfuiTextBox find_box;
public GfuiBtn Find_close_btn() {return find_close_btn;} private GfuiBtn find_close_btn;
public GfuiBtn Find_fwd_btn() {return find_fwd_btn;} private GfuiBtn find_fwd_btn;
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 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();}
public Xoae_page Active_page() {return tab_mgr.Active_tab().Page();} public void Active_page_(Xoae_page v) {tab_mgr.Active_tab().Page_(v);}
public Xowe_wiki Active_wiki() {return tab_mgr.Active_tab().Wiki();}
public Xog_html_itm Active_html_itm() {return tab_mgr.Active_tab().Html_itm();}
public Gfui_html Active_html_box() {return tab_mgr.Active_tab().Html_itm().Html_box();}
public Xog_resizer Resizer() {return resizer;} private Xog_resizer resizer = new Xog_resizer();
public Gfo_usr_dlg Usr_dlg() {return app.Usr_dlg();}
public Xog_win_itm_cfg Cfg() {return cfg;} private final Xog_win_itm_cfg cfg = new Xog_win_itm_cfg();
public void Refresh_win_size() {
if (win_box != null) // NOTE: will be null when html box adjustment pref is set and application is starting
resizer.Exec_win_resize(app, win_box.Width(), win_box.Height());
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_link_click)) Win__link_click();
else if (ctx.Match(k, Invk_link_print)) Xog_win_itm__prog_href_mgr.Print(this);
else if (ctx.Match(k, Gfui_html.Evt_location_changed)) Win__link_clicked(m.ReadStr("v"));
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_async_wkr.Async(((Xog_tab_itm)m.ReadObj("v")));
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);
else if (ctx.Match(k, Invk_page_edit_save)) Xog_tab_itm_edit_mgr.Save(tab_mgr.Active_tab(), Bool_.N);
else if (ctx.Match(k, Invk_page_edit_save_draft)) Xog_tab_itm_edit_mgr.Save(tab_mgr.Active_tab(), Bool_.Y);
else if (ctx.Match(k, Invk_page_edit_preview)) Xog_tab_itm_edit_mgr.Preview(tab_mgr.Active_tab());
else if (ctx.Match(k, Invk_page_edit_rename)) Xog_tab_itm_edit_mgr.Rename(tab_mgr.Active_tab());
else if (ctx.Match(k, Invk_page_edit_focus_box)) Xog_tab_itm_edit_mgr.Focus(this, Xog_html_itm.Elem_id__xowa_edit_data_box);
else if (ctx.Match(k, Invk_page_edit_focus_first)) Xog_tab_itm_edit_mgr.Focus(this, Xog_html_itm.Elem_id__first_heading);
else if (ctx.Match(k, Invk_page_dbg_html)) Xog_tab_itm_edit_mgr.Debug(this, Xopg_page_.Tid_html);
else if (ctx.Match(k, Invk_page_dbg_wiki)) Xog_tab_itm_edit_mgr.Debug(this, Xopg_page_.Tid_edit);
else if (ctx.Match(k, Invk_page_goto)) Page__navigate_by_url_bar(m.ReadStr("v"));
else if (ctx.Match(k, Invk_page_goto_recent)) Page__navigate_by_url_bar(app.Usere().History_mgr().Get_at_last());
else if (ctx.Match(k, Invk_history_bwd)) {Page__navigate_by_history(Bool_.N);}
else if (ctx.Match(k, Invk_history_fwd)) {Page__navigate_by_history(Bool_.Y);}
else if (ctx.Match(k, Invk_eval)) App__eval(m.ReadStr("cmd"));
else if (ctx.Match(k, Invk_page_async_cancel_wait)) Page__async__cancel__wait();
else if (ctx.Match(k, Invk_page_async_restart)) Page__async__restart();
else if (ctx.Match(k, Invk_search)) Page__navigate_by_search();
else if (ctx.Match(k, Invk_window_font_changed)) Xog_win_itm_.Font_update(this, (Xol_font_info)m.CastObj("font"));
else if (ctx.Match(k, Invk_app)) return app;
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 if (ctx.Match(k, Gfui_html.Evt_link_hover)) {
if (this.Active_tab() != null) // NOTE: this.Active_tab() should not be null, but is null when running on raspberry pi; DATE:2016-09-23
Xog_win_itm__prog_href_mgr.Hover(app, cfg.Status__show_short_url(), this.Active_tab().Wiki(), this.Active_page(), Xoh_href_gui_utl.Standardize_xowa_link(m.ReadStr("v")));
}
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String
Invk_page_async_exec = "page_async_exec"
, Invk_page_async_cancel_wait = "page_async_cancel_wait", Invk_page_async_restart = "page_async_restart"
;
public static final String
Invk_app = "app", Invk_wiki = "wiki", Invk_page = "page", Invk_shortcuts = "shortcuts"
, Invk_link_click = "link_click", Invk_link_print = "link_print"
, Invk_window_font_changed = "winow_font_changed"
, Invk_search = "search"
, Invk_page_view_edit = "page_view_edit", Invk_page_view_read = "page_view_read", Invk_page_view_html = "page_view_html"
, Invk_history_fwd = "history_fwd", Invk_history_bwd = "history_bwd"
, Invk_page_refresh = "page_refresh"
, Invk_page_edit_focus_box = "page_edit_focus_box", Invk_page_edit_focus_first = "page_edit_focus_first"
, Invk_page_edit_save = "page_edit_save", Invk_page_edit_save_draft = "page_edit_save_draft", Invk_page_edit_preview = "page_edit_preview", Invk_page_edit_rename = "page_edit_rename"
, Invk_page_dbg_wiki = "page_dbg_wiki", Invk_page_dbg_html = "page_dbg_html"
, Invk_eval = "eval"
, Invk_exit = "exit"
// xowa.gfs: shortcuts
, Invk_page_goto = "page_goto", Invk_page_goto_recent = "page_goto_recent"
;
private void Win__link_click() { // NOTE: only applies when content_editable=y; if n, then link_click will be handled by SwtBrowser location changed (Win__link_clicked)
// COMMENT: ignore content editable; DATE:2016-12-25
//Xog_tab_itm tab = tab_mgr.Active_tab(); Xowe_wiki wiki = tab.Wiki();
//if (wiki.Gui_mgr().Cfg_browser().Content_editable()) {
// String href = tab.Html_itm().Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, Gfui_html.Atr_href, null);
// if (String_.Len_eq_0(href)) return; // NOTE: href can be null for images; EX: [[File:Loudspeaker.svg|11px|link=|alt=play]]; link= basically means don't link to image
// Page__navigate_by_href(tab, href);
//}
}
private void Win__link_clicked(String anchor_raw) {
String url = url_box.Text();
int pos = String_.FindFwd(url, gplx.langs.htmls.Gfh_tag_.Anchor_str);
if (pos != Bry_find_.Not_found) url = String_.Mid(url, 0, pos);
String anchor_str = Parse_evt_location_changing(anchor_raw);
byte[] anchor_bry = Bry_.new_u8(anchor_str);
Xog_tab_itm tab = tab_mgr.Active_tab(); Xoae_page page = tab.Page();
if (anchor_str != null) { // link has anchor
url_box.Text_(url + "#" + anchor_str); // update url box
page.Html_data().Bmk_pos_(Xog_history_itm.Html_doc_pos_toc); // HACK: anchor clicked; set docPos of curentPage to TOC (so back will go back to TOC)
tab.History_mgr().Update_html_doc_pos(page, Xog_history_stack.Nav_by_anchor); // HACK: update history_mgr; note that this must occur before setting Anchor (since Anchor will generate a new history itm)
page.Url().Anch_bry_(anchor_bry); // update url
}
tab.History_mgr().Add(page);
app.Usere().History_mgr().Add(page.Wiki().App(), page.Url(), page.Ttl(), Bry_.Add_w_dlm(Byte_ascii.Hash, page.Url().Page_bry(), anchor_bry));
}
public void App__exit() {
kit.Kit_term(); // NOTE: Kit_term calls shell.close() which in turn is hooked up to app.Term_cbk() event; DATE:2014-09-09
}
private void App__eval(String s) {
String snippet = this.Active_html_itm().Html_elem_atr_get_str(s, Gfui_html.Atr_innerHTML);
app.Gfs_mgr().Run_str(snippet);
}
private static String Parse_evt_location_changing(String v) { // EX: about:blank#anchor -> anchor
int pos = String_.FindFwd(v, gplx.langs.htmls.Gfh_tag_.Anchor_str);
return pos == Bry_find_.Not_found
? null
: String_.Mid(v, pos + 1);
}
public void Page__mode_(byte new_mode_tid) {
Xog_tab_itm tab = tab_mgr.Active_tab(); Xoae_page page = tab.Page(); Xowe_wiki wiki = tab.Wiki();
if ( new_mode_tid == Xopg_page_.Tid_read // used to be && cur_view_tid == Edit; removed clause else redlinks wouldn't show when going form html to read (or clicking read multiple times) DATE: 2013-11-26;
&& page.Db().Page().Exists() // if new page, don't try to reload
) {
// NOTE: if moving from "Edit" to "Read", reload page (else Preview changes will still show); NOTE: do not call Exec_page_reload / Exec_page_refresh, which will fire redlinks code
page = tab_mgr.Active_tab().History_mgr().Cur_page(wiki); // NOTE: must set to CurPage() else changes will be lost when going Bwd,Fwd
tab.Page_(page);
wiki.Parser_mgr().Parse(page, true); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save
Xoa_url url = page.Url();
if (url.Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit)) // url has ?action=edit
url = tab.Wiki().Utl__url_parser().Parse(url.To_bry_full_wo_qargs()); // remove all query args; handle (1) s.w:Earth?action=edit; (2) click on Read; DATE:2014-03-06
}
tab.View_mode_(new_mode_tid);
if (page.Db().Page().Exists_n()) return;
Xog_tab_itm_read_mgr.Show_page(tab, page, false);
// Exec_page_refresh(); // commented out; causes lnke to show as [2] instead of [1] when saving page; EX: [http://a.org b] DATE:2014-04-24
}
public void Page__navigate_by_search() {Page__navigate_by_url_bar(app.Gui_mgr().Win_cfg().Search_box_fmtr().Bld_str_many(search_box.Text()));}
public void Page__navigate_by_url_bar(String href) {
Xog_tab_itm tab = tab_mgr.Active_tab_assert();
Xoa_url url = tab.Wiki().Utl__url_parser().Parse_by_urlbar_or_null(href); if (url == null) return;
tab.Show_url_bgn(url);
}
private void Page__navigate_by_href(Xog_tab_itm tab, String href) { // NOTE: different from Navigate_by_url_bar in that it handles "file:///" and other @gplx.Internal protected formats; EX: "/site/", "about:blank"; etc..
Xoa_url url = Xog_url_wkr.Exec_url(this, href);
if (url != Xog_url_wkr.Rslt_handled)
tab.Show_url_bgn(url);
}
public void Page__navigate_by_history(boolean fwd) {
Xog_tab_itm tab = tab_mgr.Active_tab();
if (tab == Xog_tab_itm_.Null) return;
Xoae_page cur_page = tab.Page(); Xowe_wiki cur_wiki = tab.Wiki();
Xoae_page new_page = tab.History_mgr().Go_by_dir(cur_wiki, fwd);
if (new_page.Db().Page().Exists_n()) 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_and_parse(new_page.Url(), new_page.Ttl()); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save
else {
// WORKAROUND: if wikinews, then reload page; DATE:2016-11-03
// fixes bug wherein dump_html points images to wrong repo and causes images to be blank when going backwards / forwards
// note that this workaround will cause Wikitext Wikinews pages to reload page when going bwd / fwd, but this should be a smalldifference
if (new_page.Wiki().Domain_tid() == gplx.xowa.wikis.domains.Xow_domain_tid_.Tid__wikinews)
new_page = new_page.Wikie().Page_mgr().Load_page(new_page.Url(), new_page.Ttl(), tab);
}
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);
Page__async__bgn(tab);
}
public void Page__reload() {
Xog_tab_itm tab = tab_mgr.Active_tab();
Xoae_page page = tab.History_mgr().Cur_page(tab.Wiki()); // NOTE: must set to CurPage() else changes will be lost when going Bwd,Fwd
tab.Page_(page);
page = page.Wikie().Page_mgr().Load_page(page.Url(), page.Ttl(), tab); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save
Page__refresh();
}
public void Page__refresh() {
Xog_tab_itm tab = tab_mgr.Active_tab(); Xoae_page page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm();
if (page.Ttl().Ns().Id_is_special()) {
page = page.Wikie().Page_mgr().Load_page(page.Url(), page.Ttl(), tab); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save
}
page.Html_data().Bmk_pos_(html_itm.Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_get));
html_itm.Show(page);
if (page.Url().Anch_str() == null)
html_itm.Scroll_page_by_bmk_gui();
else
html_itm.Scroll_page_by_id_gui(page.Url().Anch_str());
Page__async__bgn(tab);
}
public void Page__async__bgn(Xog_tab_itm tab) {
page__async__thread = Thread_adp_.Start_by_val(gplx.xowa.apps.Xoa_thread_.Key_page_async, this, Invk_page_async_exec, tab);
} private Thread_adp page__async__thread = Thread_adp.Noop;
public boolean Page__async__working(Xoa_url url) {
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_.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.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
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);
} private Xoa_url page__async__restart_url;
public void Lang_changed(Xol_lang_itm lang) {
Xoae_app app = gui_mgr.App();
Xog_win_itm_.Update_tiptext(app, go_bwd_btn , Xol_msg_itm_.Id_xowa_window_go_bwd_btn_tooltip);
Xog_win_itm_.Update_tiptext(app, go_fwd_btn , Xol_msg_itm_.Id_xowa_window_go_fwd_btn_tooltip);
Xog_win_itm_.Update_tiptext(app, url_box , Xol_msg_itm_.Id_xowa_window_url_box_tooltip);
Xog_win_itm_.Update_tiptext(app, url_exec_btn , Xol_msg_itm_.Id_xowa_window_url_btn_tooltip);
Xog_win_itm_.Update_tiptext(app, search_box , Xol_msg_itm_.Id_xowa_window_search_box_tooltip);
Xog_win_itm_.Update_tiptext(app, search_exec_btn , Xol_msg_itm_.Id_xowa_window_search_btn_tooltip);
Xog_win_itm_.Update_tiptext(app, find_close_btn , Xol_msg_itm_.Id_xowa_window_find_close_btn_tooltip);
Xog_win_itm_.Update_tiptext(app, find_box , Xol_msg_itm_.Id_xowa_window_find_box_tooltip);
Xog_win_itm_.Update_tiptext(app, find_bwd_btn , Xol_msg_itm_.Id_xowa_window_find_bwd_btn_tooltip);
Xog_win_itm_.Update_tiptext(app, find_fwd_btn , Xol_msg_itm_.Id_xowa_window_find_fwd_btn_tooltip);
Xog_win_itm_.Update_tiptext(app, prog_box , Xol_msg_itm_.Id_xowa_window_prog_box_tooltip);
Xog_win_itm_.Update_tiptext(app, info_box , Xol_msg_itm_.Id_xowa_window_info_box_tooltip);
}
public byte[] App__retrieve_by_url(String url_str, String output_str) {
synchronized (App__retrieve__lock) {
boolean output_html = String_.Eq(output_str, "html");
Xowe_wiki home_wiki = app.Usere().Wiki();
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_and_parse(url, ttl);
if (new_page.Db().Page().Exists_n()) {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();
tab.Page_(new_page);
tab.History_mgr().Add(new_page);
byte[] rv = output_html
? wiki.Html_mgr().Page_wtr_mgr().Gen(new_page, tab.View_mode())
: new_page.Db().Text().Text_bry();
if (app.Shell().Fetch_page_exec_async())
app.Gui_mgr().Browser_win().Page__async__bgn(tab);
return rv;
}
} private Object App__retrieve__lock = new Object();
public void Init_by_kit(Gfui_kit kit) {
this.kit = kit;
win_box = kit.New_win_app("win");
sync_cmd = win_box.Kit().New_cmd_sync(this);
Io_url img_dir = app.Fsys_mgr().Bin_xowa_file_dir().GenSubDir_nest("app.window");
FontAdp ui_font = app.Gui_mgr().Win_cfg().Font().To_font();
go_bwd_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "go_bwd_btn", "go_bwd.png" );
go_fwd_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "go_fwd_btn", "go_fwd.png" );
url_box = Xog_win_itm_.new_cbo(app, kit, win_box, ui_font, "url_box" , true);
url_exec_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "url_exec_btn", "url_exec.png" );
search_box = Xog_win_itm_.new_txt(app, kit, win_box, ui_font, "search_box" , true);
search_exec_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "search_exec_btn", "search_exec.png" );
find_close_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "find_close_btn", "find_close.png" );
find_box = Xog_win_itm_.new_txt(app, kit, win_box, ui_font, "find_box" , true);
find_fwd_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "find_fwd_btn", "find_fwd.png" );
find_bwd_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "find_bwd_btn", "find_bwd.png" );
prog_box = Xog_win_itm_.new_txt(app, kit, win_box, ui_font, "prog_box" , false);
info_box = Xog_win_itm_.new_txt(app, kit, win_box, ui_font, "note_box" , false);
tab_mgr.Init_by_kit(kit);
this.Lang_changed(app.Usere().Lang());
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);
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
app.Usr_dlg().Gui_wkr_(new Gfo_usr_dlg__gui__swt(app, kit, prog_box, info_box, info_box));
cfg.Init_by_app(app);
resizer.Init_by_app(app, this);
}
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.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 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 = 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);
// always move cursor to end; emulates firefox url_bar behavior
url_box.Text_(text);
url_box.Sel_(String_.Len(text), String_.Len(text));
}
private void On_selection_accepted() {
app.Api_root().Nav().Goto(url_box.Text());
}
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 Gfo_invk_.Rv_unhandled;
return this;
}
}

View File

@@ -0,0 +1,64 @@
/*
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.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) {
Xoae_app app = win.App(); GfuiWin win_box = win.Win_box();
win_box.Focus_able_(false);
win_box.BackColor_(ColorAdp_.White);
win.Tab_mgr().Tab_mgr().BackColor_(ColorAdp_.White);
Xog_startup_win_.Startup(app, win_box);
win.Resizer().Exec_win_resize(app, win_box.Width(), win_box.Height());
win_box.Icon_(IconAdp.file_or_blank(app.Fsys_mgr().Bin_xowa_dir().GenSubFil_nest("file", "app.window", "app_icon.png")));
}
public static GfuiBtn new_btn(Xoae_app app, Gfui_kit kit, GfuiWin win, Io_url img_dir, String id, String file) {
GfuiBtn rv = kit.New_btn(id, win);
rv.Btn_img_(kit.New_img_load(img_dir.GenSubFil(file)));
return rv;
}
public static GfuiComboBox new_cbo(Xoae_app app, Gfui_kit kit, GfuiWin win, FontAdp ui_font, String id, boolean border_on) {
GfuiComboBox rv = kit.New_combo(id, win, Keyval_.new_(GfuiTextBox.CFG_border_on_, border_on));
rv.TextMgr().Font_(ui_font);
return rv;
}
public static GfuiTextBox new_txt(Xoae_app app, Gfui_kit kit, GfuiWin win, FontAdp ui_font, String id, boolean border_on) {
GfuiTextBox rv = kit.New_text_box(id, win, Keyval_.new_(GfuiTextBox.CFG_border_on_, border_on));
rv.TextMgr().Font_(ui_font);
return rv;
}
public static void Update_tiptext(Xoae_app app, GfuiElem elem, int tiptext_id) {
elem.TipText_(Xog_win_itm_.new_tiptext(app, tiptext_id));
}
public static void Font_update(Xog_win_itm win, Xol_font_info itm_font) {
FontAdp gui_font = win.Url_box().TextMgr().Font();
if (!itm_font.Eq(gui_font)) {
FontAdp new_font = itm_font.To_font();
win.Url_box().TextMgr().Font_(new_font);
win.Find_box().TextMgr().Font_(new_font);
win.Prog_box().TextMgr().Font_(new_font);
win.Tab_mgr().Tab_mgr().TextMgr().Font_(new_font);
}
}
public static String new_tiptext(Xoae_app app, int id) {return String_.new_u8(app.Usere().Lang().Msg_mgr().Val_by_id(app.Usere().Wiki(), id));}
}

View File

@@ -0,0 +1,38 @@
/*
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.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
href = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Decode_str(href); // remove url encodings
if (!String_.Eq(href, win.Prog_box().Text()))
win.Usr_dlg().Prog_direct(href);
}
public static void Hover(Xoae_app app, boolean show_status_url, Xowe_wiki wiki, Xoae_page page, String href) {
Gfo_usr_dlg usr_dlg = app.Usr_dlg();
if ( String_.Len_eq_0(href) // href is null / empty; occurs when hovering over empty space
|| String_.Eq(href, "file:///")) {
usr_dlg.Prog_direct(""); // clear out previous entry
return;
}
Xoa_url url = Xoa_url.blank();
app.Html__href_parser().Parse_as_url(url, Bry_.new_u8(href), wiki, page.Ttl().Page_txt());
usr_dlg.Prog_direct(String_.new_u8(url.To_bry(!show_status_url, Bool_.Y)));
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
public class Xog_win_itm_cfg implements Gfo_invk {
public boolean Status__show_short_url() {return status__show_short_url;} private boolean status__show_short_url = true;
public void Init_by_app(Xoa_app app) {
app.Cfg().Bind_many_app(this, Cfg__status__show_short_url);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Cfg__status__show_short_url)) status__show_short_url = m.ReadYn("v");
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String Cfg__status__show_short_url = "xowa.gui.prog_box.show_short_url";
}

View File

@@ -0,0 +1,68 @@
/*
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.boots; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*;
import gplx.core.envs.*;
public class Xog_error_data {
public Xog_error_data(String full_msg, String err_details, String err_msg) {
this.full_msg = full_msg;
this.err_details = err_details;
this.err_msg = err_msg;
}
public String Full_msg() {return full_msg;} private final String full_msg;
public String Err_details() {return err_details;} private final String err_details;
public String Err_msg() {return err_msg;} private final String err_msg;
public static Xog_error_data new_(String err_msg, String err_trace) {
String err_details = String_.Concat_lines_nl_skip_last
( "OS: " + Op_sys.Cur().Os_name()
, "Java: " + System_.Prop__java_version() + " (" + Op_sys.Cur().Bitness_str() + " bit)"
, "Java path: " + System_.Prop__java_home()
, "XOWA: " + Xoa_app_.Version
, "XOWA path: " + Env_.AppUrl().Raw()
, ""
, "Error: " + err_msg
, "Stack: " + err_trace
);
String advice = Make_advice(err_msg);
String full_msg = String_.Concat_lines_nl_skip_last
( "Sorry! XOWA failed to run!"
, ""
, advice
, ""
, "You can also open an issue or send an email with the data below."
, ""
, "Thanks!"
, ""
, "----"
, err_details
);
return new Xog_error_data(full_msg, err_details, err_msg);
}
private static String Make_advice(String err_msg) {
String check_troubleshooting_section = "check the TROUBLESHOOTING section in the readme.txt for known issues.";
if (String_.Has(err_msg, "Cannot load 64-bit SWT libraries on 32-bit JVM"))
return String_.Concat_lines_nl_skip_last
( "Your Java installation looks like it's 32-bit. Please use the 32-bit package of XOWA."
, ""
, "For example, if you downloaded xowa_app_windows_64_v2.10.1.1.zip (64-bit), download xowa_app_windows_v2.10.1.1.zip (32-bit)"
, ""
, "You may also want to " + check_troubleshooting_section
);
else
return "Please " + check_troubleshooting_section;
}
}

View File

@@ -0,0 +1,116 @@
/*
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.boots; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*;
import gplx.langs.htmls.encoders.*; import gplx.core.envs.*;
import java.awt.*;
import java.awt.event.*;
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 Gfo_invk {
private Xog_error_data error_data;
public Xog_error_win(Xog_error_data error_data) {
super("XOWA Error");
this.setTitle("XOWA Error");
this.error_data = error_data;
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {System.out.println(e.getMessage());}
this.setSize(700, 580);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setBackground(Color.WHITE);
JPanel main_panel = new JPanel();
main_panel.setSize(700, 580);
this.setContentPane(main_panel);
this.setLayout(null);
new_text_area(main_panel, error_data);
new_link_lbl(this, main_panel, 10, 520, Invk_open_site, "<html><a href=\"\">open issue</a></html>");
new_link_lbl(this, main_panel, 605, 520, Invk_send_mail, "<html><a href=\"\">send email</a></html>");
this.setVisible(true);
}
private static JScrollPane new_text_area(JPanel owner, Xog_error_data error_data) {
JTextArea text_area = new JTextArea();
text_area.setForeground(Color.BLACK);
text_area.setBackground(Color.WHITE);
text_area.setMargin(new Insets(0, 0, 0,0));
text_area.setLineWrap(true);
text_area.setWrapStyleWord(true); // else text will wrap in middle of words
text_area.setCaretColor(Color.BLACK);
text_area.getCaret().setBlinkRate(0);
text_area.setText(error_data.Full_msg());
JScrollPane text_scroll_pane = new JScrollPane(text_area);
text_scroll_pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
owner.add(text_scroll_pane);
text_scroll_pane.setSize(675, 500);
text_scroll_pane.setLocation(10, 10);
return text_scroll_pane;
}
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(Gfo_invk_cmd.New_by_key(invk, invk_cmd)));
rv.setLocation(x, y);
rv.setSize(80, 20);
owner.add(rv);
return rv;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_send_mail)) {
try {
Gfo_url_encoder url_encoder = Gfo_url_encoder_.New__fsys_wnt().Make();
String subject = url_encoder.Encode_str("XOWA boot error: " + error_data.Err_msg());
String body = url_encoder.Encode_str(error_data.Err_details());
Desktop.getDesktop().mail(new URI("mailto:gnosygnu+xowa_error_boot@gmail.com?subject=" + subject + "&body=" + body));
}
catch (URISyntaxException ex) {}
catch (IOException ex) {}
}
else if (ctx.Match(k, Invk_open_site)) {
try {
Desktop.getDesktop().browse(new URI("https://github.com/gnosygnu/xowa/issues"));
}
catch (URISyntaxException ex) {}
catch (IOException ex) {}
}
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) {
Xog_error_data error_data = Xog_error_data.new_(err_msg, err_trace);
Gfo_usr_dlg_.Instance.Log_many("", "", error_data.Err_details());
if (Op_sys.Cur().Tid_is_osx())
gplx.core.consoles.Console_adp__sys.Instance.Write_str(error_data.Err_msg());
else
new Xog_error_win(error_data);
}
}
class Swing_mouse_adapter extends MouseAdapter {
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.Exec();}
catch (Exception e) {
System.out.println(Err_.Message_gplx_full(e));
}
}
}

View File

@@ -0,0 +1,51 @@
/*
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.boots; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*;
import java.awt.*;
import java.awt.event.*;
public class Xog_splash_win implements Rls_able {
private SplashScreen splash;
private Graphics2D graphics; private boolean graphics_init = true;
public Xog_splash_win(boolean app_mode_is_gui) {
if (app_mode_is_gui) {
this.splash = SplashScreen.getSplashScreen();
if (splash == null) System.out.println("SplashScreen.getSplashScreen() returned null");
}
}
public void Write(String msg) {
if (splash == null) return;
if (graphics_init) {
graphics_init = false;
if (graphics == null) {
graphics = splash.createGraphics();
if (graphics == null) System.out.println("graphics is null");
}
}
if (graphics == null) return;
graphics.setComposite(AlphaComposite.Clear);
graphics.fillRect(120,140,200,40);
graphics.setPaintMode();
graphics.setColor(Color.BLACK);
graphics.drawString(msg, 0, 0);
splash.update();
}
public void Rls() {
if (splash == null) return;
splash.close();
}
}