/* XOWA: the XOWA Offline Wiki Application Copyright (C) 2012-2017 gnosygnu@gmail.com XOWA is licensed under the terms of the General Public License (GPL) Version 3, or alternatively under the terms of the Apache License Version 2.0. You may use XOWA according to either of these licenses as is most appropriate for your project on a case-by-case basis. The terms of each license can be found in the source code repository: GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt */ 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" ; }