mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v2.10.3.1
This commit is contained in:
@@ -35,5 +35,5 @@ public class GfoFactory_gfui {
|
||||
public static void Btn_QuitWin2(GfuiElem owner, GfoMsg quitMsg) {
|
||||
GfuiBtn_.msg_("quitWin", owner, quitMsg).Text_("X").TipText_("quit win").Width_(20);
|
||||
}
|
||||
public static final GfoFactory_gfui _ = new GfoFactory_gfui(); GfoFactory_gfui() {}
|
||||
public static final GfoFactory_gfui Instance = new GfoFactory_gfui(); GfoFactory_gfui() {}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.gfui; import gplx.*;
|
||||
public class GfsLibIni_gfui implements GfsLibIni {
|
||||
public void Ini(GfsCore core) {
|
||||
core.AddCmd(IptCfgRegy._, "IptBndMgr_");
|
||||
core.AddCmd(IptCfgRegy.Instance, "IptBndMgr_");
|
||||
}
|
||||
public static final GfsLibIni_gfui _ = new GfsLibIni_gfui(); GfsLibIni_gfui() {}
|
||||
public static final GfsLibIni_gfui Instance = new GfsLibIni_gfui(); GfsLibIni_gfui() {}
|
||||
}
|
||||
|
||||
@@ -55,27 +55,27 @@ public class GfuiEnv_ {
|
||||
|
||||
// reg interruptLnr
|
||||
if (swingHack) { // TODO: move to kit dependent functionality; WHEN: swing kit
|
||||
UsrDlg_._.Reg(UsrMsgWkr_.Type_Warn, GfoConsoleWin._);
|
||||
UsrDlg_._.Reg(UsrMsgWkr_.Type_Stop, GfuiInterruptLnr.new_());
|
||||
UsrDlg_.Instance.Reg(UsrMsgWkr_.Type_Warn, GfoConsoleWin.Instance);
|
||||
UsrDlg_.Instance.Reg(UsrMsgWkr_.Type_Stop, GfuiInterruptLnr.new_());
|
||||
}
|
||||
IptBndMgr_win = IptCfg_.new_("gplx.gfui.GfuiWin");
|
||||
|
||||
// alias default dirs
|
||||
Io_mgr.I.AliasDir_sysEngine("app:\\", Env_.AppUrl().OwnerDir().Raw());
|
||||
Io_mgr.Instance.AliasDir_sysEngine("app:\\", Env_.AppUrl().OwnerDir().Raw());
|
||||
|
||||
GfsCore._.MsgParser_(GfoMsgParser_gfml._);
|
||||
GfsCore._.AddLib(GfsLibIni_core._);
|
||||
GfsCore._.AddLib(GfsLibIni_gfui._);
|
||||
GfsCore.Instance.MsgParser_(GfoMsgParser_gfml.Instance);
|
||||
GfsCore.Instance.AddLib(GfsLibIni_core.Instance);
|
||||
GfsCore.Instance.AddLib(GfsLibIni_gfui.Instance);
|
||||
Io_url iniFile = Env_.AppUrl().GenSubFil(".gfs");
|
||||
if (Io_mgr.I.ExistsFil(iniFile))
|
||||
GfsCore._.ExecFile(iniFile);
|
||||
if (Io_mgr.Instance.ExistsFil(iniFile))
|
||||
GfsCore.Instance.ExecFile(iniFile);
|
||||
}
|
||||
public static void Init_swt(String[] args, Class<?> type) {
|
||||
Env_.Init_swt(args, type);
|
||||
if (!Op_sys.Cur().Tid_is_drd()) GxwElemFactory_.winForms_();
|
||||
GfsCore._.MsgParser_(GfoMsgParser_gfml._);
|
||||
GfsCore.Instance.MsgParser_(GfoMsgParser_gfml.Instance);
|
||||
}
|
||||
public static void Gfs_init() {GfsCore._.MsgParser_(GfoMsgParser_gfml._);}
|
||||
public static void Gfs_init() {GfsCore.Instance.MsgParser_(GfoMsgParser_gfml.Instance);}
|
||||
public static IptCfg IptBndMgr_win;
|
||||
public static void DoEvents() {;}
|
||||
public static void ShowMsg(String message) {javax.swing.JOptionPane.showMessageDialog(null, message, "", javax.swing.JOptionPane.INFORMATION_MESSAGE, null);}
|
||||
|
||||
@@ -23,5 +23,4 @@ class Gfui_clipboard_null implements Gfui_clipboard {
|
||||
public void Copy(String s) {}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return this;}
|
||||
public void Rls() {}
|
||||
public static final Gfui_clipboard_null Null = new Gfui_clipboard_null(); Gfui_clipboard_null() {}
|
||||
}
|
||||
|
||||
@@ -17,5 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.gfui; import gplx.*;
|
||||
public class Gfui_clipboard_ {
|
||||
public static final Gfui_clipboard Null = new Gfui_clipboard_null();
|
||||
public static final String Invk_copy = "copy", Invk_select_all = "select_all";
|
||||
}
|
||||
|
||||
@@ -23,11 +23,3 @@ public interface Gfui_dlg_file {
|
||||
Gfui_dlg_file Init_exts_(String... v);
|
||||
String Ask();
|
||||
}
|
||||
class Gfui_dlg_file_null implements Gfui_dlg_file {
|
||||
public Gfui_dlg_file Init_msg_(String v) {return this;}
|
||||
public Gfui_dlg_file Init_file_(String v) {return this;}
|
||||
public Gfui_dlg_file Init_dir_(Io_url v) {return this;}
|
||||
public Gfui_dlg_file Init_exts_(String... v) {return this;}
|
||||
public String Ask() {return "";}
|
||||
public static final Gfui_dlg_file_null _ = new Gfui_dlg_file_null(); Gfui_dlg_file_null() {}
|
||||
}
|
||||
|
||||
28
150_gfui/src_700_env/gplx/gfui/Gfui_dlg_file_.java
Normal file
28
150_gfui/src_700_env/gplx/gfui/Gfui_dlg_file_.java
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.gfui; import gplx.*;
|
||||
public class Gfui_dlg_file_ {
|
||||
public static final Gfui_dlg_file Noop = new Gfui_dlg_file_noop();
|
||||
}
|
||||
class Gfui_dlg_file_noop implements Gfui_dlg_file {
|
||||
public Gfui_dlg_file Init_msg_(String v) {return this;}
|
||||
public Gfui_dlg_file Init_file_(String v) {return this;}
|
||||
public Gfui_dlg_file Init_dir_(Io_url v) {return this;}
|
||||
public Gfui_dlg_file Init_exts_(String... v) {return this;}
|
||||
public String Ask() {return "";}
|
||||
}
|
||||
@@ -23,11 +23,3 @@ public interface Gfui_dlg_msg {
|
||||
int Ask();
|
||||
boolean Ask(int expd);
|
||||
}
|
||||
class Gfui_dlg_msg_null implements Gfui_dlg_msg {
|
||||
public Gfui_dlg_msg Init_msg_(String v) {return this;}
|
||||
public Gfui_dlg_msg Init_ico_(int v) {return this;}
|
||||
public Gfui_dlg_msg Init_btns_(int... ary) {return this;}
|
||||
public boolean Ask(int expd) {return false;}
|
||||
public int Ask() {return Int_.Min_value;}
|
||||
public static final Gfui_dlg_msg_null _ = new Gfui_dlg_msg_null(); Gfui_dlg_msg_null() {}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.gfui; import gplx.*;
|
||||
public class Gfui_dlg_msg_ {
|
||||
public static final Gfui_dlg_msg Noop = new Gfui_dlg_msg_noop();
|
||||
public static final int Ico_error = 0, Ico_information = 1, Ico_question = 2, Ico_warning = 3, Ico_working = 4;
|
||||
public static final int Btn_ok = 0, Btn_cancel = 1, Btn_yes = 2, Btn_no = 3, Retry = 4, Btn_abort = 5, Btn_ignore = 6;
|
||||
}
|
||||
class Gfui_dlg_msg_noop implements Gfui_dlg_msg {
|
||||
public Gfui_dlg_msg Init_msg_(String v) {return this;}
|
||||
public Gfui_dlg_msg Init_ico_(int v) {return this;}
|
||||
public Gfui_dlg_msg Init_btns_(int... ary) {return this;}
|
||||
public boolean Ask(int expd) {return false;}
|
||||
public int Ask() {return Int_.Min_value;}
|
||||
}
|
||||
|
||||
@@ -18,9 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.gfui; import gplx.*;
|
||||
public class Gfui_kit_ {
|
||||
public static final byte Mem_tid = 0, Swing_tid = 1, Swt_tid = 2, Android_tid = 3;
|
||||
public static Gfui_kit Mem() {return mem_kit;} private static final Gfui_kit mem_kit = Mem_kit._;
|
||||
public static Gfui_kit Swt() {if (swt_kit == null) swt_kit = Swt_kit._; return swt_kit;} private static Gfui_kit swt_kit; // NOTE: late-binding else swing apps will fail (since swt jar is not deployed)
|
||||
public static Gfui_kit Swing() {if (swing_kit == null) swing_kit = Swing_kit._; return swing_kit;} private static Gfui_kit swing_kit;
|
||||
public static Gfui_kit Mem() {return mem_kit;} private static final Gfui_kit mem_kit = Mem_kit.Instance;
|
||||
public static Gfui_kit Swt() {if (swt_kit == null) swt_kit = Swt_kit.Instance; return swt_kit;} private static Gfui_kit swt_kit; // NOTE: late-binding else swing apps will fail (since swt jar is not deployed)
|
||||
public static Gfui_kit Swing() {if (swing_kit == null) swing_kit = Swing_kit.Instance; return swing_kit;} private static Gfui_kit swing_kit;
|
||||
public static Gfui_kit Get_by_key(String key) {
|
||||
if (String_.Eq(key, Mem().Key())) return Mem();
|
||||
else if (String_.Eq(key, Swt().Key())) return Swt();
|
||||
|
||||
@@ -22,7 +22,7 @@ public abstract class Gfui_kit_base implements Gfui_kit {
|
||||
public abstract String Key();
|
||||
public abstract GxwElemFactory_base Factory();
|
||||
public GfuiWin Main_win() {return main_win;} public Gfui_kit Main_win_(GfuiWin v) {main_win = v; return this;} private GfuiWin main_win;
|
||||
public Gfui_clipboard Clipboard() {return Gfui_clipboard_null.Null;}
|
||||
public Gfui_clipboard Clipboard() {return Gfui_clipboard_.Null;}
|
||||
public GfoInvkAbleCmd Kit_term_cbk() {return kit_term_cbk;} public void Kit_term_cbk_(GfoInvkAbleCmd v) {kit_term_cbk = v;} private GfoInvkAbleCmd kit_term_cbk;
|
||||
public void Cfg_set(String type, String key, Object val) {}
|
||||
public boolean Kit_mode__ready() {return true;}
|
||||
@@ -82,10 +82,10 @@ public abstract class Gfui_kit_base implements Gfui_kit {
|
||||
protected abstract Gxw_tab_mgr New_tab_mgr_impl();
|
||||
protected abstract Gxw_tab_itm New_tab_itm_impl();
|
||||
protected abstract GxwElem New_btn_impl();
|
||||
@gplx.Virtual public Gfui_dlg_file New_dlg_file(byte type, String msg) {return Gfui_dlg_file_null._;}
|
||||
@gplx.Virtual public Gfui_dlg_msg New_dlg_msg(String msg) {return Gfui_dlg_msg_null._;}
|
||||
@gplx.Virtual public Gfui_mnu_grp New_mnu_popup(String key, GfuiElem owner) {return Gfui_mnu_grp_null.Null;}
|
||||
@gplx.Virtual public Gfui_mnu_grp New_mnu_bar(String key, GfuiWin owner) {return Gfui_mnu_grp_null.Null;}
|
||||
@gplx.Virtual public Gfui_dlg_file New_dlg_file(byte type, String msg) {return Gfui_dlg_file_.Noop;}
|
||||
@gplx.Virtual public Gfui_dlg_msg New_dlg_msg(String msg) {return Gfui_dlg_msg_.Noop;}
|
||||
@gplx.Virtual public Gfui_mnu_grp New_mnu_popup(String key, GfuiElem owner) {return Gfui_mnu_grp_.Noop;}
|
||||
@gplx.Virtual public Gfui_mnu_grp New_mnu_bar(String key, GfuiWin owner) {return Gfui_mnu_grp_.Noop;}
|
||||
public abstract ImageAdp New_img_load(Io_url url);
|
||||
public Object New_color(int a, int r, int g, int b) {return null;}
|
||||
public float Calc_font_height(GfuiElem elem, String s) {return 13;}
|
||||
|
||||
@@ -27,22 +27,3 @@ public interface Gfui_mnu_grp extends Gfui_mnu_itm {
|
||||
Gfui_mnu_grp Itms_add_grp (String txt, ImageAdp img);
|
||||
Gfui_mnu_itm Itms_add_separator();
|
||||
}
|
||||
class Gfui_mnu_grp_null implements Gfui_mnu_grp {
|
||||
public String Uid() {return "";}
|
||||
public int Tid() {return Gfui_mnu_itm_.Tid_grp;}
|
||||
public boolean Enabled() {return true;} public void Enabled_(boolean v) {}
|
||||
public boolean Disposed() {return false;}
|
||||
public String Text() {return null;} public void Text_(String v) {}
|
||||
public ImageAdp Img() {return null;} public void Img_(ImageAdp v) {}
|
||||
public boolean Selected() {return true;} public void Selected_(boolean v) {}
|
||||
public String Root_key() {return "null";}
|
||||
public Object Under() {return null;}
|
||||
public void Itms_clear() {}
|
||||
public Gfui_mnu_itm Itms_add_btn_cmd (String txt, ImageAdp img, GfoInvkAble invk, String invk_cmd) {return Gfui_mnu_itm_null.Null;}
|
||||
public Gfui_mnu_itm Itms_add_btn_msg (String txt, ImageAdp img, GfoInvkAble invk, GfoInvkRootWkr root_wkr, GfoMsg invk_msg) {return Gfui_mnu_itm_null.Null;}
|
||||
public Gfui_mnu_itm Itms_add_chk_msg (String txt, ImageAdp img, GfoInvkAble invk, GfoInvkRootWkr root_wkr, GfoMsg msg_n, GfoMsg msg_y) {return Gfui_mnu_itm_null.Null;}
|
||||
public Gfui_mnu_itm Itms_add_rdo_msg (String txt, ImageAdp img, GfoInvkAble invk, GfoInvkRootWkr root_wkr, GfoMsg msg) {return Gfui_mnu_itm_null.Null;}
|
||||
public Gfui_mnu_grp Itms_add_grp(String txt, ImageAdp img) {return Gfui_mnu_grp_null.Null;}
|
||||
public Gfui_mnu_itm Itms_add_separator() {return Gfui_mnu_itm_null.Null;}
|
||||
public static final Gfui_mnu_grp_null Null = new Gfui_mnu_grp_null(); Gfui_mnu_grp_null() {}
|
||||
}
|
||||
|
||||
39
150_gfui/src_700_env/gplx/gfui/Gfui_mnu_grp_.java
Normal file
39
150_gfui/src_700_env/gplx/gfui/Gfui_mnu_grp_.java
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
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.gfui; import gplx.*;
|
||||
public class Gfui_mnu_grp_ {
|
||||
public static final Gfui_mnu_grp Noop = new Gfui_mnu_grp_noop();
|
||||
}
|
||||
class Gfui_mnu_grp_noop implements Gfui_mnu_grp {
|
||||
public String Uid() {return "";}
|
||||
public int Tid() {return Gfui_mnu_itm_.Tid_grp;}
|
||||
public boolean Enabled() {return true;} public void Enabled_(boolean v) {}
|
||||
public boolean Disposed() {return false;}
|
||||
public String Text() {return null;} public void Text_(String v) {}
|
||||
public ImageAdp Img() {return null;} public void Img_(ImageAdp v) {}
|
||||
public boolean Selected() {return true;} public void Selected_(boolean v) {}
|
||||
public String Root_key() {return "null";}
|
||||
public Object Under() {return null;}
|
||||
public void Itms_clear() {}
|
||||
public Gfui_mnu_itm Itms_add_btn_cmd (String txt, ImageAdp img, GfoInvkAble invk, String invk_cmd) {return Gfui_mnu_itm_null.Null;}
|
||||
public Gfui_mnu_itm Itms_add_btn_msg (String txt, ImageAdp img, GfoInvkAble invk, GfoInvkRootWkr root_wkr, GfoMsg invk_msg) {return Gfui_mnu_itm_null.Null;}
|
||||
public Gfui_mnu_itm Itms_add_chk_msg (String txt, ImageAdp img, GfoInvkAble invk, GfoInvkRootWkr root_wkr, GfoMsg msg_n, GfoMsg msg_y) {return Gfui_mnu_itm_null.Null;}
|
||||
public Gfui_mnu_itm Itms_add_rdo_msg (String txt, ImageAdp img, GfoInvkAble invk, GfoInvkRootWkr root_wkr, GfoMsg msg) {return Gfui_mnu_itm_null.Null;}
|
||||
public Gfui_mnu_grp Itms_add_grp(String txt, ImageAdp img) {return Gfui_mnu_grp_.Noop;}
|
||||
public Gfui_mnu_itm Itms_add_separator() {return Gfui_mnu_itm_null.Null;}
|
||||
}
|
||||
@@ -17,6 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.gfui; import gplx.*;
|
||||
public class Gfui_mnu_itm_ {
|
||||
public static String Gen_uid() {return "mnu_" + Int_.Xto_str(++uid_next);} private static int uid_next = 0;
|
||||
public static String Gen_uid() {return "mnu_" + Int_.To_str(++uid_next);} private static int uid_next = 0;
|
||||
public static final int Tid_nil = 0, Tid_grp = 1, Tid_spr = 2, Tid_btn = 3, Tid_chk = 4, Tid_rdo = 5;
|
||||
}
|
||||
|
||||
@@ -33,6 +33,6 @@ public class Mem_kit extends Gfui_kit_base {
|
||||
@Override protected Gxw_tab_mgr New_tab_mgr_impl() {return new Mem_tab_mgr();}
|
||||
@Override protected Gxw_tab_itm New_tab_itm_impl() {return new Mem_tab_itm();}
|
||||
@Override protected GxwElem New_btn_impl() {return factory.control_();}
|
||||
@Override public ImageAdp New_img_load(Io_url url) {return ImageAdp_null._;}
|
||||
public static final Mem_kit _ = new Mem_kit(); Mem_kit() {}
|
||||
@Override public ImageAdp New_img_load(Io_url url) {return ImageAdp_null.Instance;}
|
||||
public static final Mem_kit Instance = new Mem_kit(); Mem_kit() {}
|
||||
}
|
||||
|
||||
@@ -29,5 +29,5 @@ public class Swing_kit extends Gfui_kit_base {
|
||||
@Override protected Gxw_tab_mgr New_tab_mgr_impl() {return new Mem_tab_mgr();}
|
||||
@Override protected Gxw_tab_itm New_tab_itm_impl() {return new Mem_tab_itm();}
|
||||
@Override protected GxwElem New_btn_impl() {return factory.control_();}
|
||||
public static final Swing_kit _ = new Swing_kit(); Swing_kit() {}
|
||||
public static final Swing_kit Instance = new Swing_kit(); Swing_kit() {}
|
||||
}
|
||||
|
||||
@@ -68,8 +68,8 @@ public class Swt_kit implements Gfui_kit {
|
||||
this.msg_wkr_stop = new Swt_msg_wkr_stop(this, gui_wtr);
|
||||
this.display = new Display();
|
||||
this.clipboard = new Swt_clipboard(display);
|
||||
UsrDlg_._.Reg(UsrMsgWkr_.Type_Warn, GfoConsoleWin._);
|
||||
UsrDlg_._.Reg(UsrMsgWkr_.Type_Stop, msg_wkr_stop);
|
||||
UsrDlg_.Instance.Reg(UsrMsgWkr_.Type_Warn, GfoConsoleWin.Instance);
|
||||
UsrDlg_.Instance.Reg(UsrMsgWkr_.Type_Stop, msg_wkr_stop);
|
||||
if (xul_runner_path != null) System.setProperty("org.eclipse.swt.browser.XULRunnerPath", xul_runner_path);
|
||||
this.Kit_mode_(Swt_kit_mode.Tid_ready);
|
||||
gui_wtr.Log_many("", "", "swt.kit.init.done");
|
||||
@@ -207,7 +207,7 @@ public class Swt_kit implements Gfui_kit {
|
||||
return rv;
|
||||
}
|
||||
catch (Exception e) {
|
||||
Gfo_usr_dlg_.I.Warn_many("", "", "error while calculating font height; err=~{0}", Err_.Message_gplx_full(e));
|
||||
Gfo_usr_dlg_.Instance.Warn_many("", "", "error while calculating font height; err=~{0}", Err_.Message_gplx_full(e));
|
||||
return 8;
|
||||
}
|
||||
}
|
||||
@@ -235,7 +235,7 @@ public class Swt_kit implements Gfui_kit {
|
||||
}
|
||||
public static final String Invk_Cfg_add = "Cfg_add", Invk_ask_file = "ask_file"; // private or public?
|
||||
public static final String Invk_shell_close = "shell_close"; // public
|
||||
public static final Swt_kit _ = new Swt_kit(); private Swt_kit() {} // singleton b/c of following line "In particular, some platforms which SWT supports will not allow more than one active display" (http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html)
|
||||
public static final Swt_kit Instance = new Swt_kit(); private Swt_kit() {} // singleton b/c of following line "In particular, some platforms which SWT supports will not allow more than one active display" (http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html)
|
||||
public static final String Cfg_Html_BrowserType = "BrowserType";
|
||||
public static int Cfg_Html_BrowserType_parse(String v) {
|
||||
if (String_.Eq(v, "mozilla")) return Swt_html.Browser_tid_mozilla;
|
||||
|
||||
Reference in New Issue
Block a user