mirror of https://github.com/gnosygnu/xowa
parent
2f3a3a7a16
commit
bfc5c5b68e
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
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_win_itm_startup_ {
|
||||||
|
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()));
|
||||||
|
}
|
||||||
|
gplx.xowa.apps.cfgs.Xoa_cfg_mgr cfg_mgr2 = app.Cfg_mgr();
|
||||||
|
gplx.xowa.apps.apis.xowa.startups.tabs.Xoapi_startup_tabs startup_tabs = app.Api_root().App().Startup().Tabs();
|
||||||
|
if (startup_tabs.Type() == gplx.xowa.apps.apis.xowa.startups.tabs.Xoapi_startup_tabs_tid_.Tid_previous) {
|
||||||
|
cfg_mgr2.Set_by_app("xowa.api.app.startup.tabs.previous" , Calc_previous_tabs(app.Gui_mgr().Browser_win().Tab_mgr()));
|
||||||
|
}
|
||||||
|
cfg_mgr2.Set_by_app("xowa.api.app.env.version_previous" , Xoa_app_.Version);
|
||||||
|
app.Api_root().Html().Page().Toggle_mgr().Save(cfg_mgr2);
|
||||||
|
cfg_mgr2.Db_save_txt();
|
||||||
|
}
|
||||||
|
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 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"
|
||||||
|
;
|
||||||
|
}
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
XOWA: the XOWA Offline Wiki Application
|
|
||||||
Copyright (C) 2012 gnosygnu@gmail.com
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as
|
|
||||||
published by the Free Software Foundation, either version 3 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package gplx.xowa.users; import gplx.*; import gplx.xowa.*;
|
|
||||||
public class Xou_session implements Gfo_invk {
|
|
||||||
public Xou_session(Xoue_user user) {this.user = user; window_mgr = new Xous_window_mgr(user);}
|
|
||||||
public Xoue_user User() {return user;} private Xoue_user user;
|
|
||||||
public Xous_window_mgr Window_mgr() {return window_mgr;} private Xous_window_mgr window_mgr;
|
|
||||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
|
||||||
if (ctx.Match(k, Invk_window)) return window_mgr;
|
|
||||||
return this;
|
|
||||||
} public static final String Invk_window = "window";
|
|
||||||
}
|
|
@ -1,105 +0,0 @@
|
|||||||
/*
|
|
||||||
XOWA: the XOWA Offline Wiki Application
|
|
||||||
Copyright (C) 2012 gnosygnu@gmail.com
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as
|
|
||||||
published by the Free Software Foundation, either version 3 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package gplx.xowa.users; import gplx.*; import gplx.xowa.*;
|
|
||||||
import gplx.core.envs.*;
|
|
||||||
import gplx.gfui.*; import gplx.gfui.envs.*; import gplx.gfui.controls.windows.*;
|
|
||||||
import gplx.xowa.guis.views.*;
|
|
||||||
public class Xouc_window_mgr implements Gfo_invk {
|
|
||||||
public Xouc_window_mgr(Xoue_user user) {this.user = user;} private Xoue_user user;
|
|
||||||
public byte Mode_tid() {return mode_tid;} private byte mode_tid = Mode_tid_previous;
|
|
||||||
public String Mode_str() {return mode_str;} private String mode_str = "previous";
|
|
||||||
public Rect_ref Rect() {return rect;} Rect_ref rect = new Rect_ref(0, 0, 800, 640);
|
|
||||||
public boolean Safe_mode() {return safe_mode;} private boolean safe_mode = true;
|
|
||||||
public Rect_ref Previous_adj() {return previous_adj;} Rect_ref previous_adj = new Rect_ref(0, 0, 0, 0);
|
|
||||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
|
||||||
if (ctx.Match(k, Invk_mode)) return mode_str;
|
|
||||||
else if (ctx.Match(k, Invk_mode_)) {mode_str = m.ReadStr("v"); mode_tid = Xto_mode_tid(mode_str);}
|
|
||||||
else if (ctx.Match(k, Invk_mode_list)) return Options_mode_list;
|
|
||||||
else if (ctx.Match(k, Invk_rect)) return rect;
|
|
||||||
else if (ctx.Match(k, Invk_rect_)) rect = Rect_ref.parse(m.ReadStr("v"));
|
|
||||||
else if (ctx.Match(k, Invk_safe_mode)) return Yn.To_str(safe_mode);
|
|
||||||
else if (ctx.Match(k, Invk_safe_mode_)) safe_mode = m.ReadYn("v");
|
|
||||||
else if (ctx.Match(k, Invk_previous_adj)) return previous_adj;
|
|
||||||
else if (ctx.Match(k, Invk_previous_adj_)) previous_adj = Rect_ref.parse(m.ReadStr("v"));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
public static final String Invk_mode = "mode", Invk_mode_ = "mode_", Invk_mode_list = "mode_list"
|
|
||||||
, Invk_rect = "rect", Invk_rect_ = "rect_", Invk_safe_mode = "safe_mode", Invk_safe_mode_ = "safe_mode_", Invk_previous_adj = "previous_adj", Invk_previous_adj_ = "previous_adj_";
|
|
||||||
private static Keyval[] Options_mode_list = Keyval_.Ary(Keyval_.new_("previous"), Keyval_.new_("maximized"), Keyval_.new_("absolute"), Keyval_.new_("relative"), Keyval_.new_("default"));
|
|
||||||
public void Init_window(GfuiWin win) {
|
|
||||||
boolean init_is_maximized = false;
|
|
||||||
switch (mode_tid) {
|
|
||||||
case Mode_tid_previous:
|
|
||||||
Xous_window_mgr session_window = user.Session_mgr().Window_mgr();
|
|
||||||
if (session_window.Maximized()) {
|
|
||||||
win.Maximized_(true);
|
|
||||||
init_is_maximized = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
win.Rect_set(session_window.Rect().XtoRectAdp_add(previous_adj));
|
|
||||||
break;
|
|
||||||
case Mode_tid_absolute: win.Rect_set(rect.XtoRectAdp()); break;
|
|
||||||
case Mode_tid_maximized: win.Maximized_(true); init_is_maximized = true; break;
|
|
||||||
case Mode_tid_default: break; // noop
|
|
||||||
case Mode_tid_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(rect));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
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();
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
} private static final int Safe_mode_buffer = 20; // allow minor negative positioning (x=-5), off-screen positioning (w=1605)
|
|
||||||
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 byte Xto_mode_tid(String s) {
|
|
||||||
if (String_.Eq(s, "previous")) return Mode_tid_previous;
|
|
||||||
else if (String_.Eq(s, "maximized")) return Mode_tid_maximized;
|
|
||||||
else if (String_.Eq(s, "absolute")) return Mode_tid_absolute;
|
|
||||||
else if (String_.Eq(s, "relative")) return Mode_tid_relative;
|
|
||||||
else if (String_.Eq(s, "default")) return Mode_tid_default;
|
|
||||||
else return Mode_tid_previous;
|
|
||||||
}
|
|
||||||
public static final byte Mode_tid_previous = 0, Mode_tid_maximized = 1, Mode_tid_absolute = 2, Mode_tid_relative = 3, Mode_tid_default = 4;
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
XOWA: the XOWA Offline Wiki Application
|
|
||||||
Copyright (C) 2012 gnosygnu@gmail.com
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as
|
|
||||||
published by the Free Software Foundation, either version 3 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package gplx.xowa.users; import gplx.*; import gplx.xowa.*;
|
|
||||||
import gplx.gfui.controls.windows.*;
|
|
||||||
import gplx.xowa.guis.views.*;
|
|
||||||
import gplx.xowa.apps.apis.xowa.startups.tabs.*;
|
|
||||||
public class Xous_window_mgr implements Gfo_invk {
|
|
||||||
public Xous_window_mgr(Xoue_user user) {
|
|
||||||
this.user = user;
|
|
||||||
}
|
|
||||||
public Xoue_user User() {return user;} private Xoue_user user;
|
|
||||||
public Rect_ref Rect() {if (rect == null) rect = Rect_new(); return rect;} Rect_ref rect;
|
|
||||||
public boolean Maximized() {return maximized;} private boolean maximized = false;
|
|
||||||
public void Save_window(GfuiWin win) {
|
|
||||||
Xoae_app app = user.Appe();
|
|
||||||
gplx.xowa.apps.cfgs.Xoa_cfg_mgr cfg_mgr = app.Cfg_mgr();
|
|
||||||
if (user.Cfg_mgr().Startup_mgr().Window_mgr().Mode_tid() == Xouc_window_mgr.Mode_tid_previous) {
|
|
||||||
cfg_mgr.Set_by_app("app.user.session.window.maximized" , Yn.To_str(win.Maximized()));
|
|
||||||
cfg_mgr.Set_by_app("app.user.session.window.rect" , win.Rect().Xto_str());
|
|
||||||
}
|
|
||||||
Xoapi_startup_tabs startup_tabs = app.Api_root().App().Startup().Tabs();
|
|
||||||
if (startup_tabs.Type() == Xoapi_startup_tabs_tid_.Tid_previous) {
|
|
||||||
cfg_mgr.Set_by_app("xowa.api.app.startup.tabs.previous" , Calc_previous_tabs(app.Gui_mgr().Browser_win().Tab_mgr()));
|
|
||||||
}
|
|
||||||
cfg_mgr.Set_by_app("xowa.api.app.env.version_previous" , Xoa_app_.Version);
|
|
||||||
app.Api_root().Html().Page().Toggle_mgr().Save(cfg_mgr);
|
|
||||||
cfg_mgr.Db_save_txt();
|
|
||||||
}
|
|
||||||
private String Calc_previous_tabs(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();
|
|
||||||
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 Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
|
||||||
if (ctx.Match(k, Invk_rect)) return rect;
|
|
||||||
else if (ctx.Match(k, Invk_rect_)) rect = Rect_ref.parse(m.ReadStr("v"));
|
|
||||||
else if (ctx.Match(k, Invk_maximized)) return Yn.To_str(maximized);
|
|
||||||
else if (ctx.Match(k, Invk_maximized_)) maximized = m.ReadYn("v");
|
|
||||||
return this;
|
|
||||||
} public static final String Invk_rect = "rect", Invk_rect_ = "rect_", Invk_maximized = "maximized", Invk_maximized_ = "maximized_";
|
|
||||||
private static Rect_ref Rect_new() { // NOTE: lazy initialization, else will fail for non-X11 environments; DATE:2014-03-02
|
|
||||||
gplx.gfui.SizeAdp size = Xouc_window_mgr.Screen_maximized_calc();
|
|
||||||
return new Rect_ref(0, 0, size.Width(), size.Height());
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in new issue