1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2025-06-13 12:54:14 +00:00
gnosygnu_xowa/150_gfui/src/gplx/gfui/ipts/IptArg_.java

117 lines
5.3 KiB
Java
Raw Normal View History

2017-02-07 03:14:55 +00:00
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
2017-02-07 03:14:55 +00:00
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.
2017-02-07 03:14:55 +00:00
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
2017-02-07 03:14:55 +00:00
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
2017-02-07 03:14:55 +00:00
*/
package gplx.gfui.ipts; import gplx.*; import gplx.gfui.*;
public class IptArg_ {
public static final IptArg[] Ary_empty = new IptArg[0];
public static final IptArg Null = null;
public static final String Wildcard_key = "wildcard";
public static IptArg Wildcard = new IptKey(Int_.Max_value, Wildcard_key);
public static boolean Is_null_or_none(IptArg arg) {return arg == Null || arg == IptKey_.None;}
public static IptArg[] Ary(IptArg... v) {return v;}
public static IptArg[] parse_ary_or_empty(String v) {
IptArg[] rv = IptArg_.parse_ary_(v);
int len = rv.length;
for (int i = 0; i < len; i++)
if (rv[i] == null) return Ary_empty;// indicates failed parse
return rv;
}
public static IptArg[] parse_ary_(String raw) {
String[] args = String_.Split(raw, "|");
int args_len = args.length; if (args_len == 0) return Ary_empty;
IptArg[] rv = new IptArg[args_len];
for (int i = 0; i < args_len; i++)
rv[i] = parse(String_.Trim(args[i]));
return rv;
}
public static IptArg parse_chain_(String raw) {return IptKeyChain.parse(raw);}
public static IptArg parse_or_none_(String raw) {
try {
return String_.Eq(raw, String_.Empty)
? IptKey_.None
: parse(raw);
}
catch (Exception exc) { // as an "or" proc, handle errors; note that it may accept raw values from cfg files, so invalid input is possible; DATE:2014-06-04
Err_.Noop(exc);
return IptKey_.None;
}
}
public static IptArg parse(String raw) {
if (String_.Has(raw, ",")) return IptKeyChain.parse(raw);
String bgn = String_.GetStrBefore(raw, ".");
if (String_.Eq(bgn, "wheel")) return IptMouseWheel_.parse(raw);
else if (String_.Eq(bgn, "mouse")) return IptMouseBtn_.parse(raw);
else if (String_.Eq(bgn, "key")) return IptKey_.parse(raw);
else return IptMacro.Instance.parse(raw);
}
// NOTE: the following two methods should theoretically be interface methods, but since they are only used by two procs, they will be handled with if/else
@gplx.Internal protected static IptEventType EventType_default(IptArg arg) {
Class<?> type = arg.getClass();
if ( type == IptKey.class
|| type == IptKeyChain.class) return IptEventType_.KeyDown;
else if (type == IptMouseBtn.class) return IptEventType_.MouseUp; // changed from MouseDown; confirmed against Firefox, Eclipse; DATE:2014-05-16
else if (type == IptMouseWheel.class) return IptEventType_.MouseWheel;
else if (type == IptMouseMove.class) return IptEventType_.MouseMove;
else throw Err_.new_unhandled(type);
}
@gplx.Internal protected static boolean EventType_match(IptArg arg, IptEventType match) {
Class<?> type = arg.getClass();
if ( type == IptKey.class
|| type == IptKeyChain.class) return match == IptEventType_.KeyDown || match == IptEventType_.KeyUp || match == IptEventType_.KeyDown;
else if (type == IptMouseBtn.class) return match == IptEventType_.MouseDown || match == IptEventType_.MouseUp || match == IptEventType_.MousePress;
else if (type == IptMouseWheel.class) return match == IptEventType_.MouseWheel;
else if (type == IptMouseMove.class) return match == IptEventType_.MouseMove;
else throw Err_.new_unhandled(type);
}
}
class IptMacro {
public void Reg(String prefix, String alias, IptArg arg) {
if (regy == null) Init();
Ordered_hash list = (Ordered_hash)regy.Get_by(prefix);
if (list == null) {
list = Ordered_hash_.New();
regy.Add(prefix, list);
}
list.Add_if_dupe_use_nth(alias, arg);
}
void Init() {
regy = Ordered_hash_.New();
Reg("mod", "c", IptKey_.add_(IptKey_.Ctrl));
Reg("mod", "a", IptKey_.add_(IptKey_.Alt));
Reg("mod", "s", IptKey_.add_(IptKey_.Shift));
Reg("mod", "ca", IptKey_.add_(IptKey_.Ctrl, IptKey_.Alt));
Reg("mod", "cs", IptKey_.add_(IptKey_.Ctrl, IptKey_.Shift));
Reg("mod", "as", IptKey_.add_(IptKey_.Alt, IptKey_.Shift));
Reg("mod", "cas", IptKey_.add_(IptKey_.Ctrl, IptKey_.Alt, IptKey_.Shift));
}
public IptArg parse(String raw) {
if (regy == null) Init();
String[] plusAry = String_.Split(raw, "+");
String[] dotAry = String_.Split(plusAry[0], ".");
String bgn = dotAry[0], end = dotAry[1];
Ordered_hash list = (Ordered_hash)regy.Get_by(bgn);
if (list == null) throw parse_err(raw, "list not found").Args_add("list", bgn);
IptKey rv = (IptKey)list.Get_by(end);
if (rv == null) throw parse_err(raw, "arg not found").Args_add("arg", end);
for (int i = 1; i < plusAry.length; i++) {
rv = rv.Add((IptKey)IptKey_.parse(plusAry[i]));
}
return rv;
}
Ordered_hash regy;
static Err parse_err(String raw, String loc) {return Err_.new_("gfui", "could not parse IptArg", "raw", raw, "loc", loc).Trace_ignore_add_1_();}
public static final IptMacro Instance = new IptMacro(); IptMacro() {}
}