Gui: Refactor IptKey; in particular, use SWING and SWT constants where possible; also handle modifers

pull/620/head
gnosygnu 8 years ago
parent 5c3e4287f0
commit c3d4f520de

@ -46,6 +46,7 @@ import java.awt.event.WindowListener;
import gplx.gfui.draws.*; import gplx.gfui.ipts.*; import gplx.gfui.gfxs.*; import gplx.gfui.imgs.*; import gplx.gfui.kits.swts.*;
public class GxwWin_lang extends JFrame implements GxwWin, WindowListener {
public void ShowWin() {this.setVisible(true);}
public void ShowWinModal() {}
public void HideWin() {this.setVisible(false);}
public boolean Minimized() {return this.getState() == Frame.ICONIFIED;} public void Minimized_(boolean v) {this.setState(v ? Frame.ICONIFIED : Frame.NORMAL);}
public boolean Maximized() {return this.getState() == Frame.MAXIMIZED_BOTH;} public void Maximized_(boolean v) {this.setState(v ? Frame.MAXIMIZED_BOTH : Frame.NORMAL);}
@ -162,6 +163,7 @@ class GxwWin_jdialog extends JDialog implements GxwWin, WindowListener {
}
class GxwWin_jwindow extends JWindow implements GxwWin, WindowListener {
public void ShowWin() {this.setVisible(true);}
public void ShowWinModal() {}
public void HideWin() {this.setVisible(false);}
public void CloseWin() {} //this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.dispose();
public boolean Maximized() {return false;} public void Maximized_(boolean v) {}

@ -44,6 +44,11 @@ public class IptKey_ {
List_adp list = List_adp_.New();
for (IptKey key : add)
list.Add(key);
// add keypad numbers
list.Add_many(IptKey_.Numpad_0, IptKey_.Numpad_1, IptKey_.Numpad_2, IptKey_.Numpad_3, IptKey_.Numpad_4);
list.Add_many(IptKey_.Numpad_5, IptKey_.Numpad_6, IptKey_.Numpad_7, IptKey_.Numpad_8, IptKey_.Numpad_9);
IptKeyStrMgr.Instance.XtoIptKeyAry(list);
for (IptKey key : del)
list.Del(key);
@ -51,6 +56,11 @@ public class IptKey_ {
}
public static IptKey[] printableKeys_(IptKey[] add, IptKey[] del) {
List_adp list = List_adp_.New();
// add keypad numbers
list.Add_many(IptKey_.Numpad_0, IptKey_.Numpad_1, IptKey_.Numpad_2, IptKey_.Numpad_3, IptKey_.Numpad_4);
list.Add_many(IptKey_.Numpad_5, IptKey_.Numpad_6, IptKey_.Numpad_7, IptKey_.Numpad_8, IptKey_.Numpad_9);
for (IptKey key : add)
list.Add(key);
IptKeyStrMgr.Instance.XtoIptKeyAry(list);
@ -68,40 +78,110 @@ public class IptKey_ {
return rv;
}
public static final int KeyCode_Shift = 65536, KeyCode_Ctrl = 131072, KeyCode_Alt = 262144;
public static final IptKey
None = new_(0, "none")
, Back = new_(8, "back"), Tab = new_(9, "tab"), Clear = new_(12, "clear"), Enter = new_(KeyEvent.VK_ENTER, "enter")
, ShiftKey = new_(16, "shiftKey"), CtrlKey = new_(17, "ctrlKey"), AltKey = new_(18, "altKey")
, Pause = new_(KeyEvent.VK_PAUSE, "pause")
, CapsLock = new_(20, "capsLock"), Escape = new_(27, "escape"), Space = new_(32, "space")
, PageUp = new_(33, "pageUp"), PageDown = new_(34, "pageDown"), End = new_(35, "end"), Home = new_(36, "home")
, Left = new_(37, "left"), Up = new_(38, "up"), Right = new_(39, "right"), Down = new_(40, "down")
, PrintScreen = new_(44, "printScreen")
, Insert = new_(KeyEvent.VK_INSERT, "insert")
, Delete = new_(KeyEvent.VK_DELETE, "delete")
public static final IptKey
// NOTE: integer values represent .NET keycodes; NOTE: SWT keycodes are converted to SWING keycodes in Swt_core_lnrs
// none
None = new_( 0, "none")
// numbers
, D0 = new_(48, "d0"), D1 = new_(49, "d1"), D2 = new_(50, "d2"), D3 = new_(51, "d3"), D4 = new_(52, "d4")
, D5 = new_(53, "d5"), D6 = new_(54, "d6"), D7 = new_(55, "d7"), D8 = new_(56, "d8"), D9 = new_(57, "d9")
// letters
, A = new_(65, "a"), B = new_(66, "b"), C = new_(67, "c"), D = new_(68, "d"), E = new_(69, "e")
, F = new_(70, "f"), G = new_(71, "g"), H = new_(72, "h"), I = new_(73, "i"), J = new_(74, "j")
, K = new_(75, "k"), L = new_(76, "l"), M = new_(77, "m"), N = new_(78, "n"), O = new_(79, "o")
, P = new_(80, "p"), Q = new_(81, "q"), R = new_(82, "r"), S = new_(83, "s"), T = new_(84, "t")
, U = new_(85, "u"), V = new_(86, "v"), W = new_(87, "w"), X = new_(88, "x"), Y = new_(89, "y"), Z = new_(90, "z")
, F1 = new_(112, "f1"), F2 = new_(113, "f2"), F3 = new_(114, "f3"), F4 = new_(115, "f4"), F5 = new_(116, "f5"), F6 = new_(117, "f6")
, F7 = new_(118, "f7"), F8 = new_(119, "f8"), F9 = new_(120, "f9"), F10 = new_(121, "f10"), F11 = new_(122, "f11"), F12 = new_(123, "f12")
, NumLock = new_(144, "numLock"), ScrollLock = new_(145, "scrollLock")
, Semicolon = new_(KeyEvent.VK_SEMICOLON, "semicolon")
, Equal = new_(KeyEvent.VK_EQUALS, "equal")
, Comma = new_(KeyEvent.VK_COMMA, "comma")
, Minus = new_(KeyEvent.VK_MINUS, "minus")
, Period = new_(KeyEvent.VK_PERIOD, "period")
, Slash = new_(KeyEvent.VK_SLASH, "slash")
, Tick = new_(KeyEvent.VK_BACK_QUOTE, "tick")
, OpenBracket = new_(219, "openBracket")
, Backslash = new_(KeyEvent.VK_BACK_SLASH, "backslash")
, CloseBracket = new_(221, "closeBracket")
, Quote = new_(222, "quote")
, Shift = new_(KeyCode_Shift, "shift"), Ctrl = new_(KeyCode_Ctrl, "ctrl"), Alt = new_(KeyCode_Alt, "alt")
, Keypad_enter = new_(16777296, "keypad_enter")
// numpad numbers
, Numpad_0 = new_(KeyEvent.VK_NUMPAD0, "numpad_0")
, Numpad_1 = new_(KeyEvent.VK_NUMPAD1, "numpad_1")
, Numpad_2 = new_(KeyEvent.VK_NUMPAD2, "numpad_2")
, Numpad_3 = new_(KeyEvent.VK_NUMPAD3, "numpad_3")
, Numpad_4 = new_(KeyEvent.VK_NUMPAD4, "numpad_4")
, Numpad_5 = new_(KeyEvent.VK_NUMPAD5, "numpad_5")
, Numpad_6 = new_(KeyEvent.VK_NUMPAD6, "numpad_6")
, Numpad_7 = new_(KeyEvent.VK_NUMPAD7, "numpad_7")
, Numpad_8 = new_(KeyEvent.VK_NUMPAD8, "numpad_8")
, Numpad_9 = new_(KeyEvent.VK_NUMPAD9, "numpad_9")
// numpad keys
, Numpad_multiply = new_(KeyEvent.VK_MULTIPLY, "numpad_multiply")
, Numpad_add = new_(KeyEvent.VK_ADD, "numpad_add")
, Numpad_subtract = new_(KeyEvent.VK_SUBTRACT, "numpad_subtract")
, Numpad_decimal = new_(KeyEvent.VK_DECIMAL, "numpad_decimal")
, Numpad_divide = new_(KeyEvent.VK_DIVIDE, "numpad_divide")
// NOTE: mapping numpad_enter to enter b/c don't want to define two sets of enters for every binding
, Numpad_enter = new_(KeyEvent.VK_ENTER, "numpad_enter")
// NOTE: using same value as SWT; SWING value is not available
// , Numpad_enter = new_(16777296, "numpad_enter")
// function keys; not supporting f13-f24 b/c only for IBM 3270 keyboards and can't test; also, note that codes differ between .net and swing
, F1 = new_(KeyEvent.VK_F1, "f1")
, F2 = new_(KeyEvent.VK_F2, "f2")
, F3 = new_(KeyEvent.VK_F3, "f3")
, F4 = new_(KeyEvent.VK_F4, "f4")
, F5 = new_(KeyEvent.VK_F5, "f5")
, F6 = new_(KeyEvent.VK_F6, "f6")
, F7 = new_(KeyEvent.VK_F7, "f7")
, F8 = new_(KeyEvent.VK_F8, "f8")
, F9 = new_(KeyEvent.VK_F9, "f9")
, F10 = new_(KeyEvent.VK_F10, "f10")
, F11 = new_(KeyEvent.VK_F11, "f11")
, F12 = new_(KeyEvent.VK_F12, "f12")
// whitespace
, Tab = new_(KeyEvent.VK_TAB, "tab")
, Enter = new_(KeyEvent.VK_ENTER, "enter")
, Space = new_(KeyEvent.VK_SPACE, "space")
// delete
, Back = new_(KeyEvent.VK_BACK_SPACE, "back")
, Clear = new_(KeyEvent.VK_CLEAR, "clear")
, Insert = new_(KeyEvent.VK_INSERT, "insert")
, Delete = new_(KeyEvent.VK_DELETE, "delete")
// meta
, Escape = new_(KeyEvent.VK_ESCAPE, "escape")
, Pause = new_(KeyEvent.VK_PAUSE, "pause")
, PrintScreen = new_(KeyEvent.VK_PRINTSCREEN, "printScreen")
// navigation: page / home
, PageUp = new_(KeyEvent.VK_PAGE_UP, "pageUp")
, PageDown = new_(KeyEvent.VK_PAGE_DOWN, "pageDown")
, End = new_(KeyEvent.VK_END, "end")
, Home = new_(KeyEvent.VK_HOME, "home")
// navigation: lr / ud
, Left = new_(KeyEvent.VK_LEFT, "left")
, Up = new_(KeyEvent.VK_UP, "up")
, Right = new_(KeyEvent.VK_RIGHT, "right")
, Down = new_(KeyEvent.VK_DOWN, "down")
// locks
, CapsLock = new_(KeyEvent.VK_CAPS_LOCK, "capsLock")
, NumLock = new_(KeyEvent.VK_NUM_LOCK, "numLock")
, ScrollLock = new_(KeyEvent.VK_SCROLL_LOCK, "scrollLock")
// symbols
, Semicolon = new_(KeyEvent.VK_SEMICOLON, "semicolon")
, Equal = new_(KeyEvent.VK_EQUALS, "equal")
, Comma = new_(KeyEvent.VK_COMMA, "comma")
, Minus = new_(KeyEvent.VK_MINUS, "minus")
, Period = new_(KeyEvent.VK_PERIOD, "period")
, Slash = new_(KeyEvent.VK_SLASH, "slash")
, Tick = new_(KeyEvent.VK_BACK_QUOTE, "tick")
, OpenBracket = new_(KeyEvent.VK_OPEN_BRACKET, "openBracket")
, Backslash = new_(KeyEvent.VK_BACK_SLASH, "backslash")
, CloseBracket = new_(KeyEvent.VK_CLOSE_BRACKET, "closeBracket")
, Quote = new_(222, "quote")
// modifiers
, Shift = new_(KeyCode_Shift, "shift")
, Ctrl = new_(KeyCode_Ctrl, "ctrl")
, Alt = new_(KeyCode_Alt, "alt")
, ShiftKey = new_(16, "shiftKey") , CtrlKey = new_(17, "ctrlKey") , AltKey = new_(18, "altKey") // NOTE: used for .NET NPI
;
private static Ordered_hash ui_str_hash;
public static Ordered_hash Ui_str_hash() {
@ -125,7 +205,11 @@ public class IptKey_ {
, IptKey_.F7, IptKey_.F8, IptKey_.F9, IptKey_.F10, IptKey_.F11, IptKey_.F12
, IptKey_.NumLock, IptKey_.ScrollLock
, IptKey_.Semicolon, IptKey_.Equal, IptKey_.Comma, IptKey_.Minus, IptKey_.Period, IptKey_.Slash, IptKey_.Tick
, IptKey_.OpenBracket, IptKey_.Back, IptKey_.CloseBracket, IptKey_.Quote
, IptKey_.OpenBracket, IptKey_.Backslash, IptKey_.CloseBracket, IptKey_.Quote
, IptKey_.Numpad_0, IptKey_.Numpad_1, IptKey_.Numpad_2, IptKey_.Numpad_3, IptKey_.Numpad_4
, IptKey_.Numpad_5, IptKey_.Numpad_6, IptKey_.Numpad_7, IptKey_.Numpad_8, IptKey_.Numpad_9
, IptKey_.Numpad_multiply, IptKey_.Numpad_add, IptKey_.Numpad_subtract, IptKey_.Numpad_decimal, IptKey_.Numpad_divide
// , IptKey_.Numpad_enter
);
}
return ui_str_hash;
@ -137,18 +221,21 @@ public class IptKey_ {
hash.Add_if_dupe_use_nth(Int_obj_ref.New(key.Val()), key);
}
}
public static String To_str(int val) {
public static String To_str(int orig_val) {
String mod_str = "", rv = "";
boolean mod_c = Bitmask_.Has_int(val, IptKey_.Ctrl.Val()); if (mod_c) {mod_str += "c"; val = Bitmask_.Flip_int(Bool_.N, val, IptKey_.Ctrl.Val());}
boolean mod_a = Bitmask_.Has_int(val, IptKey_.Alt.Val()); if (mod_a) {mod_str += "a"; val = Bitmask_.Flip_int(Bool_.N, val, IptKey_.Alt.Val());}
boolean mod_s = Bitmask_.Has_int(val, IptKey_.Shift.Val()); if (mod_s) {mod_str += "s"; val = Bitmask_.Flip_int(Bool_.N, val, IptKey_.Shift.Val());}
int temp_val = orig_val;
boolean mod_c = Bitmask_.Has_int(temp_val, IptKey_.Ctrl.Val()); if (mod_c) {mod_str += "c"; temp_val = Bitmask_.Flip_int(Bool_.N, temp_val, IptKey_.Ctrl.Val());}
boolean mod_a = Bitmask_.Has_int(temp_val, IptKey_.Alt.Val()); if (mod_a) {mod_str += "a"; temp_val = Bitmask_.Flip_int(Bool_.N, temp_val, IptKey_.Alt.Val());}
boolean mod_s = Bitmask_.Has_int(temp_val, IptKey_.Shift.Val()); if (mod_s) {mod_str += "s"; temp_val = Bitmask_.Flip_int(Bool_.N, temp_val, IptKey_.Shift.Val());}
if (String_.Len_gt_0(mod_str)) {
rv = "mod." + mod_str;
if (val == 0) return rv; // handle modifiers only, like "mod.cs"; else will be "mod.cs+key.#0"
// handle modifiers only, like "mod.cs"; else will be "mod.cs+key.#0"
if (temp_val == 0) return rv;
rv += "+";
}
IptKey key = (IptKey)IptKey_.Ui_str_hash().Get_by(Int_obj_ref.New(val));
String key_str = key == null ? "key.#" + Int_.To_str(val) : key.Key();
IptKey key = (IptKey)IptKey_.Ui_str_hash().Get_by(Int_obj_ref.New(temp_val));
String key_str = key == null ? "key.#" + Int_.To_str(temp_val) : key.Key();
// Tfds.Write(rv + key_str, orig_val, temp_val, mod_c, mod_a, mod_s);
return rv + key_str;
}
}

@ -25,7 +25,7 @@ public class IptKey__tst {
@Test public void To_str__numeric() {
fxt.Test_to_str(16777296, "key.#16777296");
}
@Test public void parse() {
@Test public void Parse() {
fxt.Test_parse("key.#10", 10);
}
}

@ -65,78 +65,145 @@ class Swt_lnr_traverse implements Listener {
}
}
class Swt_lnr_key implements KeyListener {
public Swt_lnr_key(GxwElem elem) {this.elem = elem;} GxwElem elem;
// static int counter = 0;
public Swt_lnr_key(GxwElem elem) {this.elem = elem;} private GxwElem elem;
@Override public void keyPressed(KeyEvent ev) {
IptEvtDataKey ipt_data = XtoKeyData(ev);
IptEvtDataKey ipt_data = To_gfui(ev, Bool_.Y);
// cancel if handled; note order MUST be "delegate || ipt_data.Handled", not vice-versa
if (!elem.Host().KeyDownCbk(ipt_data) || ipt_data.Handled())
ev.doit = false;
}
@Override public void keyReleased(KeyEvent ev) {
IptEvtDataKey ipt_data = XtoKeyData(ev);
IptEvtDataKey ipt_data = To_gfui(ev, Bool_.N);
// cancel if handled; note order MUST be "delegate || ipt_data.Handled", not vice-versa
if (!elem.Host().KeyUpCbk(ipt_data) || ipt_data.Handled())
ev.doit = false;
}
IptEvtDataKey XtoKeyData(KeyEvent ev) {
private IptEvtDataKey To_gfui(KeyEvent ev, boolean is_keydown) {
// convert codes from SWT keycodes to SWING / .NET style; note that SWT uses keycode values similar to ASCII values
int val = ev.keyCode;
switch (val) {
case Byte_ascii.Cr: val = 10; break; // enter key is 13 whereas .net/swing is 10
// letters; lowercase keys are transmitted as ascii value, instead of key value; EX: "a": SWT=97; SWING=65
case Byte_ascii.Ltr_a: case Byte_ascii.Ltr_b: case Byte_ascii.Ltr_c: case Byte_ascii.Ltr_d: case Byte_ascii.Ltr_e:
case Byte_ascii.Ltr_f: case Byte_ascii.Ltr_g: case Byte_ascii.Ltr_h: case Byte_ascii.Ltr_i: case Byte_ascii.Ltr_j:
case Byte_ascii.Ltr_k: case Byte_ascii.Ltr_l: case Byte_ascii.Ltr_m: case Byte_ascii.Ltr_n: case Byte_ascii.Ltr_o:
case Byte_ascii.Ltr_p: case Byte_ascii.Ltr_q: case Byte_ascii.Ltr_r: case Byte_ascii.Ltr_s: case Byte_ascii.Ltr_t:
case Byte_ascii.Ltr_u: case Byte_ascii.Ltr_v: case Byte_ascii.Ltr_w: case Byte_ascii.Ltr_x: case Byte_ascii.Ltr_y: case Byte_ascii.Ltr_z:
val -= 32; // lowercase keys are transmitted as ascii value, instead of key value; EX: "a" is 97 instead of 65
val -= 32;
break;
case 39: val = IptKey_.Quote.Val(); break;
case 44: val = IptKey_.Comma.Val(); break;
case 45: val = IptKey_.Minus.Val(); break;
case 46: val = IptKey_.Period.Val(); break;
case 47: val = IptKey_.Slash.Val(); break;
case 59: val = IptKey_.Semicolon.Val(); break;
case 61: val = IptKey_.Equal.Val(); break;
case 91: val = IptKey_.OpenBracket.Val(); break;
case 93: val = IptKey_.CloseBracket.Val(); break;
case 96: val = IptKey_.Tick.Val(); break;
case 127: val = IptKey_.Delete.Val(); break;
case 16777217: val = IptKey_.Up.Val(); break;
case 16777218: val = IptKey_.Down.Val(); break;
case 16777219: val = IptKey_.Left.Val(); break;
case 16777220: val = IptKey_.Right.Val(); break;
case 16777221: val = IptKey_.PageUp.Val(); break;
case 16777222: val = IptKey_.PageDown.Val(); break;
case 16777223: val = IptKey_.Home.Val(); break;
case 16777224: val = IptKey_.End.Val(); break;
case 16777225: val = IptKey_.Insert.Val(); break;
case 16777226: val = IptKey_.F1.Val(); break;
case 16777227: val = IptKey_.F2.Val(); break;
case 16777228: val = IptKey_.F3.Val(); break;
case 16777229: val = IptKey_.F4.Val(); break;
case 16777230: val = IptKey_.F5.Val(); break;
case 16777231: val = IptKey_.F6.Val(); break;
case 16777232: val = IptKey_.F7.Val(); break;
case 16777233: val = IptKey_.F8.Val(); break;
case 16777234: val = IptKey_.F9.Val(); break;
case 16777235: val = IptKey_.F10.Val(); break;
case 16777236: val = IptKey_.F11.Val(); break;
case 16777237: val = IptKey_.F12.Val(); break;
case 16777259: val = IptKey_.Equal.Val(); break;
case 16777261: val = IptKey_.Minus.Val(); break;
case 16777298: val = IptKey_.CapsLock.Val(); break;
case 16777299: val = IptKey_.NumLock.Val(); break;
case 16777300: val = IptKey_.ScrollLock.Val(); break;
case 16777301: val = IptKey_.Pause.Val(); break;
case 16777303: val = IptKey_.PrintScreen.Val(); break;
case 327680: val = IptKey_.Insert.Val(); break;
// numpad numbers
case SWT.KEYPAD_0: val = IptKey_.Numpad_0.Val(); break;
case SWT.KEYPAD_1: val = IptKey_.Numpad_1.Val(); break;
case SWT.KEYPAD_2: val = IptKey_.Numpad_2.Val(); break;
case SWT.KEYPAD_3: val = IptKey_.Numpad_3.Val(); break;
case SWT.KEYPAD_4: val = IptKey_.Numpad_4.Val(); break;
case SWT.KEYPAD_5: val = IptKey_.Numpad_5.Val(); break;
case SWT.KEYPAD_6: val = IptKey_.Numpad_6.Val(); break;
case SWT.KEYPAD_7: val = IptKey_.Numpad_7.Val(); break;
case SWT.KEYPAD_8: val = IptKey_.Numpad_8.Val(); break;
case SWT.KEYPAD_9: val = IptKey_.Numpad_9.Val(); break;
// symbols; extended
case SWT.KEYPAD_MULTIPLY: val = IptKey_.Numpad_multiply.Val(); break;
case SWT.KEYPAD_ADD: val = IptKey_.Numpad_add.Val(); break;
case SWT.KEYPAD_SUBTRACT: val = IptKey_.Numpad_subtract.Val(); break;
case SWT.KEYPAD_DECIMAL: val = IptKey_.Numpad_decimal.Val(); break;
case SWT.KEYPAD_DIVIDE: val = IptKey_.Numpad_divide.Val(); break;
case SWT.KEYPAD_CR: val = IptKey_.Enter.Val(); break;
// function keys
case SWT.F1: val = IptKey_.F1.Val(); break;
case SWT.F2: val = IptKey_.F2.Val(); break;
case SWT.F3: val = IptKey_.F3.Val(); break;
case SWT.F4: val = IptKey_.F4.Val(); break;
case SWT.F5: val = IptKey_.F5.Val(); break;
case SWT.F6: val = IptKey_.F6.Val(); break;
case SWT.F7: val = IptKey_.F7.Val(); break;
case SWT.F8: val = IptKey_.F8.Val(); break;
case SWT.F9: val = IptKey_.F9.Val(); break;
case SWT.F10: val = IptKey_.F10.Val(); break;
case SWT.F11: val = IptKey_.F11.Val(); break;
case SWT.F12: val = IptKey_.F12.Val(); break;
// SWT=13; SWING=10; note that Cr maps to "enter key"
case Byte_ascii.Cr: val = IptKey_.Enter.Val(); break;
case SWT.INSERT: val = IptKey_.Insert.Val(); break;
case 127: val = IptKey_.Delete.Val(); break;
// meta
case SWT.PAUSE: val = IptKey_.Pause.Val(); break;
case SWT.PRINT_SCREEN: val = IptKey_.PrintScreen.Val(); break;
// nav keys
case SWT.ARROW_UP: val = IptKey_.Up.Val(); break;
case SWT.ARROW_DOWN: val = IptKey_.Down.Val(); break;
case SWT.ARROW_LEFT: val = IptKey_.Left.Val(); break;
case SWT.ARROW_RIGHT: val = IptKey_.Right.Val(); break;
case SWT.PAGE_UP: val = IptKey_.PageUp.Val(); break;
case SWT.PAGE_DOWN: val = IptKey_.PageDown.Val(); break;
case SWT.HOME: val = IptKey_.Home.Val(); break;
case SWT.END: val = IptKey_.End.Val(); break;
// locks
case SWT.CAPS_LOCK: val = IptKey_.CapsLock.Val(); break;
case SWT.NUM_LOCK: val = IptKey_.NumLock.Val(); break;
case SWT.SCROLL_LOCK: val = IptKey_.ScrollLock.Val(); break;
// symbols; ASCII; no SWT const
case 39: val = IptKey_.Quote.Val(); break;
case 44: val = IptKey_.Comma.Val(); break;
case 45: val = IptKey_.Minus.Val(); break;
case 46: val = IptKey_.Period.Val(); break;
case 47: val = IptKey_.Slash.Val(); break;
case 59: val = IptKey_.Semicolon.Val(); break;
case 61: val = IptKey_.Equal.Val(); break;
case 91: val = IptKey_.OpenBracket.Val(); break;
case 93: val = IptKey_.CloseBracket.Val(); break;
case 96: val = IptKey_.Tick.Val(); break;
// modifiers
case SWT.CTRL: val = IptKey_.Ctrl.Val(); break;
case SWT.ALT: val = IptKey_.Alt.Val(); break;
case SWT.SHIFT: val = IptKey_.Shift.Val(); break;
}
if (Has_ctrl(ev.stateMask)) val |= IptKey_.KeyCode_Ctrl;
if (Bitmask_.Has_int(ev.stateMask, IptKey_.KeyCode_Shift)) val |= IptKey_.KeyCode_Alt;
if (Bitmask_.Has_int(ev.stateMask, IptKey_.KeyCode_Ctrl)) val |= IptKey_.KeyCode_Shift;
// Tfds.Write(String_.Format("val={4} keyCode={0} stateMask={1} keyLocation={2} character={3}", ev.keyCode, ev.stateMask, ev.keyLocation, ev.character, val));
// handle mod keys
val = Handle_modifier(ev, is_keydown, val, SWT.CTRL , IptKey_.Ctrl.Val());
val = Handle_modifier(ev, is_keydown, val, SWT.ALT , IptKey_.Alt.Val());
val = Handle_modifier(ev, is_keydown, val, SWT.SHIFT , IptKey_.Shift.Val());
// Tfds.Write(String_.Format("val={0} keydown={1} keyCode={2} stateMask={3} keyLocation={4} character={5}", val, is_keydown, ev.keyCode, ev.stateMask, ev.keyLocation, ev.character));
return IptEvtDataKey.int_(val);
}
public static boolean Has_ctrl(int val) {return Bitmask_.Has_int(val, IptKey_.KeyCode_Alt);} // NOTE:SWT's ctrl constant is different from SWING's
private static int Handle_modifier(KeyEvent ev, boolean is_keydown, int val, int swt, int swing) {
// Conversion table for debugging
//
// -------------------------
// | code | SWT | SWING |
// |-------|-------|-------|
// | 65536 | ALT | SHIFT |
// |131072 | SHIFT | CTRL |
// |262144 | CTRL | ALT |
// -------------------------
// Also, when debugging, note that ev.stateMask is always the value at the start of the event
//
// For example, if ctrl is pressed and nothing is held
// * if is_keydown = y, then ev.stateMask is 0 (none)
// * if is_keydown = n, then ev.stateMask is 262144 (ctrl)
// Note that ev.keyCode is 262144 (ctrl) in both examples
//
// However, if ctrl is pressed and shift is already held:
// * if is_keydown = y, then ev.stateMask is 65536 (shift)
// * if is_keydown = n, then ev.stateMask is 327680 (shift + ctrl)
// Note that ev.keyCode is 262144 (ctrl) in both examples as well.
// if SWT modifier is present, return val with SWING modifier; else, just return val
return Bitmask_.Has_int(ev.stateMask, swt) ? val | swing : val;
}
public static boolean Has_ctrl(int val) {return Bitmask_.Has_int(val, SWT.CTRL);}
}
class Swt_lnr_mouse implements MouseListener {
public Swt_lnr_mouse(GxwElem elem) {this.elem = elem;} GxwElem elem;

@ -241,6 +241,22 @@ public class Gfui_bnd_parser {
Init_itm("mouse.middle", "Middle Click");
Init_itm("mouse.left", "Left Click");
Init_itm("mouse.right", "Right Click");
Init_itm("key.numpad_0", "Numpad 0");
Init_itm("key.numpad_1", "Numpad 1");
Init_itm("key.numpad_2", "Numpad 2");
Init_itm("key.numpad_3", "Numpad 3");
Init_itm("key.numpad_4", "Numpad 4");
Init_itm("key.numpad_5", "Numpad 5");
Init_itm("key.numpad_6", "Numpad 6");
Init_itm("key.numpad_7", "Numpad 7");
Init_itm("key.numpad_8", "Numpad 8");
Init_itm("key.numpad_9", "Numpad 9");
Init_itm("key.numpad_multiply", "Numpad Multiply");
Init_itm("key.numpad_add", "Numpad Add");
Init_itm("key.numpad_subtract", "Numpad Subtract");
Init_itm("key.numpad_decimal", "Numpad Decimal");
Init_itm("key.numpad_divide", "Numpad Divide");
// Init_itm("key.numpad_enter", "Numpad Enter");
return this;
}
private void Init_itm(String gfui, String norm) {Init_itm(Gfui_bnd_tkn.Tid_key, gfui, norm);}

@ -35,6 +35,7 @@ public class Xog_bnd_mgr implements Gfo_invk {
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"
@ -369,11 +370,18 @@ public class Xog_bnd_mgr implements Gfo_invk {
this.Bind(Xog_bnd_box_.Tid_browser_info , win.Info_box());
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
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]));
if (String_.Eq(k, Run__show_remap_win)) {
Xog_bnd_win win = new Xog_bnd_win();
win.Show(app, app.Gui_mgr().Kit(), app.Gui_mgr().Browser_win().Win_box(), this.Bnd_parser(), "", "");
}
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";
}

@ -17,14 +17,18 @@ 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 ok_btn, cxl_btn;
private Gfui_bnd_parser bnd_parser;
public void Show(Gfui_kit kit, GfuiWin owner_win, Gfui_bnd_parser bnd_parser, String shortcut_text, String binding_text) {
private Xoa_app app;
public void Show(Xoa_app app, Gfui_kit kit, GfuiWin owner_win, Gfui_bnd_parser bnd_parser, String shortcut_text, String binding_text) {
this.app = app;
// create controls
this.win = kit.New_win_utl("shortcut_win", owner_win); win.BackColor_(ColorAdp_.White).Size_(200, 120);
this.win = kit.New_win_utl("shortcut_win", owner_win); win.BackColor_(ColorAdp_.White).Size_(240, 140);
this.bnd_parser = bnd_parser;
GfuiLbl shortcut_lbl = Make_lbl(kit, win, "shortcut_lbl" , "Shortcut:");
GfuiLbl binding_lbl = Make_lbl(kit, win, "binding_lbl" , "Binding:");
@ -75,11 +79,16 @@ public class Xog_bnd_win implements Gfo_invk {
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_ok)) {win.Close();}
else if (ctx.Match(k, Invk_when_ok)) {
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.gui_binding__remap_recv", gplx.core.gfobjs.Gfobj_nde.New().Add_str("bnd", binding_txt.Text()));
win.Close();
}
else if (ctx.Match(k, Invk_when_cxl)) {win.Close();}
else return Gfo_invk_.Rv_unhandled;
return this;

Loading…
Cancel
Save