001package org.vishia.gral.swt; 002 003import org.eclipse.swt.SWT; 004import org.vishia.util.KeyCode; 005 006/**Adaption from SWT-KeyCodes to universal vishia key codes. 007 * @author Hartmut Schorrig 008 * 009 */ 010public class SwtGralKey extends KeyCode 011{ 012 013 /**Version, history and license 014 * <ul> 015 * <li>2015-08-29 Hartmut chg: Mouse handling: mouse buttons: The usual right mouse button is the Button2. The middle button is number 3. 016 * <li>2015-08-29 Hartmut chg: {@link #convertFromSwt(int, int, char)} now uses the character key information of the event too. 017 * Elsewhere it is not possible to use the keyboard layout from the operation system to detect keys with sh. 018 * All keys with shift, which are character keys, are returned without {@link KeyCode#shift} designation now. 019 * <li>2013-11-16 Hartmut new {@link #convertMouseKey(int, MouseAction, int)} 020 * <li>2011-10-02 Hartmut created for Key handling in the GRAL. 021 * </ul> 022 * 023 * <b>Copyright/Copyleft</b>: 024 * For this source the LGPL Lesser General Public License, 025 * published by the Free Software Foundation is valid. 026 * It means: 027 * <ol> 028 * <li> You can use this source without any restriction for any desired purpose. 029 * <li> You can redistribute copies of this source to everybody. 030 * <li> Every user of this source, also the user of redistribute copies 031 * with or without payment, must accept this license for further using. 032 * <li> But the LPGL is not appropriate for a whole software product, 033 * if this source is only a part of them. It means, the user 034 * must publish this part of source, 035 * but don't need to publish the whole source of the own product. 036 * <li> You can study and modify (improve) this source 037 * for own using or for redistribution, but you have to license the 038 * modified sources likewise under this LGPL Lesser General Public License. 039 * You mustn't delete this Copyright/Copyleft inscription in this source file. 040 * </ol> 041 * If you are intent to use this sources without publishing its usage, you can get 042 * a second license subscribing a special contract with the author. 043 * 044 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 045 * 046 */ 047 @SuppressWarnings("hiding") 048 public final static int version = 20131116; 049 050 /**This class isn't instantiated. Only the static method and the static definitions of KeyCode 051 * are used. */ 052 private SwtGralKey() 053 { super(0); 054 } 055 056 public static int convertFromSwt(int keyCode, int stateMask, char characterKey) 057 { 058 final int stateKeys, key; 059 if((stateMask & (SWT.CONTROL + SWT.ALT + SWT.SHIFT)) == SWT.CONTROL + SWT.ALT + SWT.SHIFT){ 060 stateKeys = ctrl + alt + shift; 061 } else if((stateMask & (SWT.CONTROL + SWT.ALT + SWT.SHIFT)) == SWT.ALT + SWT.CONTROL){ 062 stateKeys = ctrl + alt; 063 } else if((stateMask & (SWT.CONTROL + SWT.ALT + SWT.SHIFT)) == SWT.CONTROL + SWT.SHIFT){ 064 stateKeys = ctrl + shift; 065 } else if((stateMask & (SWT.CONTROL + SWT.ALT + SWT.SHIFT)) == SWT.ALT + SWT.SHIFT){ 066 stateKeys = alt + shift; 067 } else if((stateMask & (SWT.CONTROL + SWT.ALT + SWT.SHIFT)) == SWT.CONTROL){ 068 stateKeys = ctrl; 069 } else if((stateMask & (SWT.CONTROL + SWT.ALT + SWT.SHIFT)) == SWT.ALT){ 070 stateKeys = alt; 071 } else if((stateMask & (SWT.CONTROL + SWT.ALT + SWT.SHIFT)) == SWT.SHIFT){ 072 stateKeys = shift; 073 } else{ 074 stateKeys = 0; 075 } 076 switch(keyCode){ 077 case SWT.ARROW_LEFT: key = left; break; 078 case SWT.ARROW_RIGHT: key = right; break; 079 case SWT.ARROW_UP: key = up; break; 080 case SWT.ARROW_DOWN: key = dn; break; 081 case SWT.PAGE_UP: key = pgup; break; 082 case SWT.PAGE_DOWN: key = pgdn; break; 083 case SWT.F1: key = F1; break; 084 case SWT.F2: key = F2; break; 085 case SWT.F3: key = F3; break; 086 case SWT.F4: key = F4; break; 087 case SWT.F5: key = F5; break; 088 case SWT.F6: key = F6; break; 089 case SWT.F7: key = F7; break; 090 case SWT.F8: key = F8; break; 091 case SWT.F9: key = F9; break; 092 case SWT.F10: key = F10; break; 093 case SWT.F11: key = F11; break; 094 case SWT.F12: key = F12; break; 095 case SWT.HOME: key = home; break; 096 case SWT.END: key = end; break; 097 case SWT.INSERT: key = ins; break; 098 case SWT.DEL: key = del; break; 099 case SWT.TAB: key = tab; break; 100 case 0x0d: key = enter; break; 101 case 0x08: key = back; break; 102 case 0x1b: key = esc; break; 103 default: key = keyCode; 104 } 105 if(stateKeys == shift && characterKey >= ' ') { 106 return characterKey; 107 } else { 108 return stateKeys + key; 109 } 110 } 111 112 113 114 public enum MouseAction{ 115 down, up, upMovedOutside, doubleClick 116 }; 117 118 119 public static int convertMouseKey(int button, MouseAction action, int stateMask){ 120 final int keyMouse; 121 switch(action){ 122 case down:{ 123 switch(button){ 124 case 1: keyMouse = KeyCode.mouse1Down; break; 125 case 3: keyMouse = KeyCode.mouse2Down; break; 126 case 2: keyMouse = KeyCode.mouse3Down; break; 127 default: keyMouse = KeyCode.mouse3Down; break; //other key 128 } 129 130 } break; 131 case up:{ 132 switch(button){ 133 case 1: keyMouse = KeyCode.mouse1Up; break; 134 case 3: keyMouse = KeyCode.mouse2Up; break; 135 case 2: keyMouse = KeyCode.mouse3Up; break; 136 default: keyMouse = KeyCode.mouse3Up; break; //other key 137 } 138 139 } break; 140 case upMovedOutside:{ 141 switch(button){ 142 case 1: keyMouse = KeyCode.mouse1UpMoved; break; 143 case 3: keyMouse = KeyCode.mouse2UpMoved; break; 144 case 2: keyMouse = KeyCode.mouse3Up; break; 145 default: keyMouse = KeyCode.mouse3Up; break; //other key 146 } 147 148 } break; 149 case doubleClick:{ 150 switch(button){ 151 case 1: keyMouse = KeyCode.mouse1Double; break; 152 case 3: keyMouse = KeyCode.mouse2Double; break; 153 case 2: keyMouse = KeyCode.mouse3Down; break; 154 default: keyMouse = KeyCode.mouse3Down; break; //other key 155 } 156 157 } break; 158 default: keyMouse = 0; //unused, only because compiling error 159 } 160 final int keyCode = SwtGralKey.convertFromSwt(keyMouse, stateMask, '\0'); 161 return keyCode; 162 } 163 164 165}