1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package juloo.keyboard2;
import android.util.SparseArray;
import android.view.KeyCharacterMap;
import java.util.HashMap;
class KeyModifier
{
/* Cache key is KeyValue's name */
private static HashMap<String, SparseArray<KeyValue>> _cache =
new HashMap<String, SparseArray<KeyValue>>();
/* Modify a key according to modifiers. */
public static KeyValue handleFlags(KeyValue k, int flags)
{
if (flags == 0) // No modifier
return k;
SparseArray<KeyValue> ks = cacheEntry(k);
KeyValue r = ks.get(flags);
if (r != null) // Found in cache
return r;
char c = handleChar(k.char_, flags);
if (c == k.char_) // Don't override the symbol if the char didn't change
r = k;
else
r = k.withCharAndSymbol(String.valueOf(c), c);
ks.put(flags, r);
return r;
}
private static char handleChar(char c, int flags)
{
if (c == KeyValue.CHAR_NONE)
return c;
if ((flags & KeyValue.FLAG_SHIFT) != 0) // Shift
c = Character.toUpperCase(c);
if ((flags & KeyValue.FLAGS_ACCENTS) != 0) // Accents, after shift is applied
c = handleAccentChar(c, flags);
return c;
}
private static char handleAccentChar(char c, int flags)
{
char accent;
switch ((flags & KeyValue.FLAGS_ACCENTS))
{
case KeyValue.FLAG_ACCENT1: accent = '\u02CB'; break;
case KeyValue.FLAG_ACCENT2: accent = '\u00B4'; break;
case KeyValue.FLAG_ACCENT3: accent = '\u02C6'; break;
case KeyValue.FLAG_ACCENT4: accent = '\u02DC'; break;
case KeyValue.FLAG_ACCENT5: accent = '\u00B8'; break;
case KeyValue.FLAG_ACCENT6: accent = '\u00A8'; break;
default: return c; // Can't happen
}
char r = (char)KeyCharacterMap.getDeadChar(accent, (int)c);
return (r == 0) ? c : r;
}
/* Lookup the cache entry for a key. Create it needed. */
private static SparseArray<KeyValue> cacheEntry(KeyValue k)
{
SparseArray<KeyValue> ks = _cache.get(k.name);
if (ks == null)
{
ks = new SparseArray<KeyValue>();
_cache.put(k.name, ks);
}
return ks;
}
}
|