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.java67
1 files changed, 49 insertions, 18 deletions
diff --git a/srcs/juloo.keyboard2/ExtraKeys.java b/srcs/juloo.keyboard2/ExtraKeys.java
index 36acaf1..fb1f3e2 100644
--- a/srcs/juloo.keyboard2/ExtraKeys.java
+++ b/srcs/juloo.keyboard2/ExtraKeys.java
@@ -2,6 +2,8 @@ package juloo.keyboard2;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -9,35 +11,45 @@ import java.util.Set;
class ExtraKeys
{
- List<ExtraKey> _ks;
+ public static final ExtraKeys EMPTY = new ExtraKeys(Collections.EMPTY_LIST);
- public ExtraKeys()
- {
- _ks = new ArrayList<ExtraKey>();
- }
+ Collection<ExtraKey> _ks;
- public void parse_and_add_keys_for_script(String script, String extra_keys_str)
+ public ExtraKeys(Collection<ExtraKey> ks)
{
- _ks.addAll(parse_extra_keys(script, extra_keys_str));
+ _ks = ks;
}
/** Add the keys that should be added to the keyboard into [dst]. */
public void compute(Set<KeyValue> dst, Query q)
{
for (ExtraKey k : _ks)
- {
- if (k.should_add(q))
- dst.add(k.kv);
- }
+ k.compute(dst, q);
}
- public static List<ExtraKey> parse_extra_keys(String script, String str)
+ public static ExtraKeys parse(String script, String str)
{
- List<ExtraKey> dst = new ArrayList<ExtraKey>();
+ Collection<ExtraKey> dst = new ArrayList<ExtraKey>();
String[] ks = str.split("\\|");
for (int i = 0; i < ks.length; i++)
dst.add(ExtraKey.parse(ks[i], script));
- return dst;
+ return new ExtraKeys(dst);
+ }
+
+ /** Merge identical keys. This is required to decide whether to add
+ alternatives. Script is generalized (set to null) on any conflict. */
+ public static ExtraKeys merge(List<ExtraKeys> kss)
+ {
+ Map<KeyValue, ExtraKey> merged_keys = new HashMap<KeyValue, ExtraKey>();
+ for (ExtraKeys ks : kss)
+ for (ExtraKey k : ks._ks)
+ {
+ ExtraKey k2 = merged_keys.get(k.kv);
+ if (k2 != null)
+ k = k.merge_with(k2);
+ merged_keys.put(k.kv, k);
+ }
+ return new ExtraKeys(merged_keys.values());
}
final static class ExtraKey
@@ -59,11 +71,30 @@ class ExtraKeys
}
/** Whether the key should be added to the keyboard. */
- public boolean should_add(Query q)
+ public void compute(Set<KeyValue> dst, Query q)
+ {
+ // Add the alternative if it's the only one. The list of alternatives is
+ // enforced to be complete by the merging step. The same [kv] will not
+ // appear again in the list of extra keys with a different list of
+ // alternatives.
+ KeyValue k = (alternatives.size() == 1) ? alternatives.get(0) : kv;
+ if
+ ((q.script == null || script == null || q.script.equals(script))
+ && (alternatives.size() == 0 || !q.present.containsAll(alternatives)))
+ dst.add(k);
+ }
+
+ /** Return a new key from two. [kv] are expected to be equal. [script] is
+ generalized to [null] on any conflict. [alternatives] are concatenated.
+ */
+ public ExtraKey merge_with(ExtraKey k2)
{
- return
- (q.script == null || script == null || q.script.equals(script))
- && (alternatives.size() == 0 || !q.present.containsAll(alternatives));
+ String script_ =
+ (script != null && k2.script != null && script.equals(k2.script))
+ ? script : null;
+ List<KeyValue> alts = new ArrayList<KeyValue>(alternatives);
+ alts.addAll(k2.alternatives);
+ return new ExtraKey(kv, script_, alts);
}
/** Extra keys are of the form "key name" or "key name:alt 1:alt 2". */