1 package org.unicode.cldr.draft.keyboard;
2 
3 import static com.google.common.base.Preconditions.checkNotNull;
4 
5 import com.google.common.base.MoreObjects;
6 import com.google.common.base.Objects;
7 import com.google.common.collect.ImmutableSet;
8 import com.google.common.collect.ImmutableSortedMap;
9 import com.google.common.collect.Maps;
10 
11 /**
12  * Object that represents a full keyboard mapping for a given modifier key combination set.
13  *
14  * <p>
15  * For example, the English-US keyboard with the Shift modifier activated outputs:
16  * <ul>
17  * <li>{@code ISO=E01 US-101 keyboard=[1] = '!'}
18  * <li>{@code E02 [2] = '@'}
19  * <li>{@code E03 [3] = '#'}
20  * <li>{@code E04 [4] = '$'}
21  * <li>{@code D01 [Q] = 'Q'}
22  * <li>And so on...
23  * </ul>
24  */
25 public final class KeyMap implements Comparable<KeyMap> {
26     private final ModifierKeyCombinationSet modifierKeyCombinationSet;
27     private final ImmutableSortedMap<IsoLayoutPosition, CharacterMap> isoLayoutToCharacterMap;
28 
KeyMap(ModifierKeyCombinationSet modifierKeyCombinationSet, ImmutableSortedMap<IsoLayoutPosition, CharacterMap> isoLayoutToCharacterMap)29     private KeyMap(ModifierKeyCombinationSet modifierKeyCombinationSet,
30         ImmutableSortedMap<IsoLayoutPosition, CharacterMap> isoLayoutToCharacterMap) {
31         this.modifierKeyCombinationSet = checkNotNull(modifierKeyCombinationSet);
32         this.isoLayoutToCharacterMap = checkNotNull(isoLayoutToCharacterMap);
33     }
34 
35     /** Creates a key map from the given modifier key combination set and characer maps. */
of(ModifierKeyCombinationSet modifierKeyCombinationSet, ImmutableSet<CharacterMap> characterMaps)36     public static KeyMap of(ModifierKeyCombinationSet modifierKeyCombinationSet,
37         ImmutableSet<CharacterMap> characterMaps) {
38         return new KeyMap(modifierKeyCombinationSet, ImmutableSortedMap.copyOf(Maps.uniqueIndex(
39             characterMaps, CharacterMap.isoLayoutPositionFunction())));
40     }
41 
modifierKeyCombinationSet()42     public ModifierKeyCombinationSet modifierKeyCombinationSet() {
43         return modifierKeyCombinationSet;
44     }
45 
isoLayoutToCharacterMap()46     public ImmutableSortedMap<IsoLayoutPosition, CharacterMap> isoLayoutToCharacterMap() {
47         return isoLayoutToCharacterMap;
48     }
49 
50     @Override
toString()51     public String toString() {
52         return MoreObjects.toStringHelper(this)
53             .add("modifierKeyCombinationSet", modifierKeyCombinationSet)
54             .add("isoLayoutToCharacterMap", isoLayoutToCharacterMap)
55             .toString();
56     }
57 
58     @Override
equals(Object o)59     public boolean equals(Object o) {
60         if (this == o) {
61             return true;
62         }
63         if (o instanceof KeyMap) {
64             KeyMap other = (KeyMap) o;
65             return modifierKeyCombinationSet.equals(other.modifierKeyCombinationSet)
66                 && isoLayoutToCharacterMap.equals(other.isoLayoutToCharacterMap);
67         }
68         return false;
69     }
70 
71     @Override
hashCode()72     public int hashCode() {
73         return Objects.hashCode(modifierKeyCombinationSet, isoLayoutToCharacterMap);
74     }
75 
76     @Override
compareTo(KeyMap o)77     public int compareTo(KeyMap o) {
78         // Order the key maps by their modifier sets.
79         return modifierKeyCombinationSet.compareTo(o.modifierKeyCombinationSet);
80     }
81 }
82