diff --git a/150_gfui/src/gplx/gfui/controls/gxws/GxwWin_lang.java b/150_gfui/src/gplx/gfui/controls/gxws/GxwWin_lang.java index 02df0153b..b8b5bd9be 100644 --- a/150_gfui/src/gplx/gfui/controls/gxws/GxwWin_lang.java +++ b/150_gfui/src/gplx/gfui/controls/gxws/GxwWin_lang.java @@ -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) {} diff --git a/150_gfui/src/gplx/gfui/ipts/IptKey_.java b/150_gfui/src/gplx/gfui/ipts/IptKey_.java index 8644357dc..41a35ece8 100644 --- a/150_gfui/src/gplx/gfui/ipts/IptKey_.java +++ b/150_gfui/src/gplx/gfui/ipts/IptKey_.java @@ -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; } } diff --git a/150_gfui/src/gplx/gfui/ipts/IptKey__tst.java b/150_gfui/src/gplx/gfui/ipts/IptKey__tst.java index 56963c79a..3716f8616 100644 --- a/150_gfui/src/gplx/gfui/ipts/IptKey__tst.java +++ b/150_gfui/src/gplx/gfui/ipts/IptKey__tst.java @@ -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); } } diff --git a/150_gfui/src/gplx/gfui/kits/swts/Swt_core_lnrs.java b/150_gfui/src/gplx/gfui/kits/swts/Swt_core_lnrs.java index 66abfa2a0..37e908833 100644 --- a/150_gfui/src/gplx/gfui/kits/swts/Swt_core_lnrs.java +++ b/150_gfui/src/gplx/gfui/kits/swts/Swt_core_lnrs.java @@ -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; diff --git a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java index c5e2abfd0..1c14fb2f2 100644 --- a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java +++ b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java @@ -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);} diff --git a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr.java b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr.java index 3a82e6936..ee294df17 100644 --- a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr.java @@ -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"; } diff --git a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_win.java b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_win.java index e376e2c91..4ca67b1f1 100644 --- a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_win.java +++ b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_win.java @@ -17,14 +17,18 @@ along with this program. If not, see . */ 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;