abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.keyboard2/ExtraKeys.java
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/juloo.keyboard2/ExtraKeys.java')
-rw-r--r--srcs/juloo.keyboard2/ExtraKeys.java93
1 files changed, 65 insertions, 28 deletions
diff --git a/srcs/juloo.keyboard2/ExtraKeys.java b/srcs/juloo.keyboard2/ExtraKeys.java
index 22187c1..36acaf1 100644
--- a/srcs/juloo.keyboard2/ExtraKeys.java
+++ b/srcs/juloo.keyboard2/ExtraKeys.java
@@ -1,6 +1,7 @@
package juloo.keyboard2;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -8,50 +9,86 @@ import java.util.Set;
class ExtraKeys
{
- Map<String, List<KeyValue>> _keys_per_script;
+ List<ExtraKey> _ks;
public ExtraKeys()
{
- _keys_per_script = new HashMap<String, List<KeyValue>>();
+ _ks = new ArrayList<ExtraKey>();
}
- public void add_keys_for_script(String script, List<KeyValue> kvs)
+ public void parse_and_add_keys_for_script(String script, String extra_keys_str)
{
- List<KeyValue> ks = _keys_per_script.get(script);
- if (ks == null) ks = new ArrayList<KeyValue>();
- ks.addAll(kvs);
- _keys_per_script.put(script, ks);
+ _ks.addAll(parse_extra_keys(script, extra_keys_str));
}
- /** Add the keys that should be added to the keyboard into [dst]. [null] is
- a valid script. */
- public void compute(Set<KeyValue> dst, String script)
+ /** Add the keys that should be added to the keyboard into [dst]. */
+ public void compute(Set<KeyValue> dst, Query q)
{
- if (script == null)
+ for (ExtraKey k : _ks)
{
- for (String sc : _keys_per_script.keySet())
- get_keys_of_script(dst, sc);
+ if (k.should_add(q))
+ dst.add(k.kv);
}
- else
- {
- get_keys_of_script(dst, null);
- get_keys_of_script(dst, script);
- }
- }
-
- void get_keys_of_script(Set<KeyValue> dst, String script)
- {
- List<KeyValue> ks = _keys_per_script.get(script);
- if (ks != null)
- dst.addAll(ks);
}
- public static List<KeyValue> parse_extra_keys(String str)
+ public static List<ExtraKey> parse_extra_keys(String script, String str)
{
- List<KeyValue> dst = new ArrayList<KeyValue>();
+ List<ExtraKey> dst = new ArrayList<ExtraKey>();
String[] ks = str.split("\\|");
for (int i = 0; i < ks.length; i++)
- dst.add(KeyValue.getKeyByName(ks[i]));
+ dst.add(ExtraKey.parse(ks[i], script));
return dst;
}
+
+ final static class ExtraKey
+ {
+ /** The key to add. */
+ final KeyValue kv;
+ /** The key will be added to layouts of the same script. If null, might be
+ added to layouts of any script. */
+ final String script;
+ /** The key will not be added to layout that already contain all the
+ alternatives. */
+ final List<KeyValue> alternatives;
+
+ ExtraKey(KeyValue kv_, String script_, List<KeyValue> alts_)
+ {
+ kv = kv_;
+ script = script_;
+ alternatives = alts_;
+ }
+
+ /** Whether the key should be added to the keyboard. */
+ public boolean should_add(Query q)
+ {
+ return
+ (q.script == null || script == null || q.script.equals(script))
+ && (alternatives.size() == 0 || !q.present.containsAll(alternatives));
+ }
+
+ /** Extra keys are of the form "key name" or "key name:alt 1:alt 2". */
+ public static ExtraKey parse(String str, String script)
+ {
+ String[] strs = str.split(":");
+ KeyValue kv = KeyValue.getKeyByName(strs[0]);
+ KeyValue[] alts = new KeyValue[strs.length-1];
+ for (int i = 1; i < strs.length; i++)
+ alts[i-1] = KeyValue.getKeyByName(strs[i]);
+ return new ExtraKey(kv, script, Arrays.asList(alts));
+ }
+ }
+
+ public final static class Query
+ {
+ /** Script of the current layout. Might be null. */
+ final String script;
+ /** Keys present on the layout. */
+ final Set<KeyValue> present;
+
+ public Query(String script_, Set<KeyValue> present_)
+ {
+ script = script_;
+ present = present_;
+ }
+ }
}