blob: bc8f6b4a41b7c84aff8fc66b042235272c2c558b [file] [log] [blame]
package org.unicode.cldr.draft.keyboard;
import com.google.common.base.Function;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
/**
* Object representing a 1 to 1 mapping between an ISO Position ({@link IsoLayoutPosition}) and the
* provided output that is received when pressing that particular key. This object also includes any
* keys that are available by "long-pressing" on the key (prominent on mobile phones).
*/
public final class CharacterMap implements Comparable<CharacterMap> {
private final IsoLayoutPosition position;
private final String output;
private final ImmutableList<String> longPressKeys;
private final boolean transformNo;
private CharacterMap(IsoLayoutPosition position, String output,
ImmutableList<String> longPressKeys, boolean transformNo) {
this.position = Preconditions.checkNotNull(position);
this.output = Preconditions.checkNotNull(output);
this.longPressKeys = Preconditions.checkNotNull(longPressKeys);
this.transformNo = transformNo;
}
/** Creates a new character map from the given position and output. */
public static CharacterMap of(IsoLayoutPosition position, String output) {
return new CharacterMap(position, output, ImmutableList.<String>of(), false);
}
/** Creates a new character map from the given position, output and long press keys. */
public static CharacterMap of(IsoLayoutPosition position, String output,
ImmutableList<String> longPressKeys) {
return new CharacterMap(position, output, longPressKeys, false);
}
public IsoLayoutPosition position() {
return position;
}
public String output() {
return output;
}
public ImmutableList<String> longPressKeys() {
return longPressKeys;
}
public CharacterMap markAsTransformNo() {
return new CharacterMap(position, output, longPressKeys, true);
}
public boolean isTransformNo() {
return transformNo;
}
@Override public String toString() {
return MoreObjects.toStringHelper(this)
.add("position", position)
.add("output", output)
.add("longPressKeys", longPressKeys)
.toString();
}
@Override public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof CharacterMap) {
CharacterMap other = (CharacterMap) o;
return position.equals(other.position) && output.equals(other.output)
&& longPressKeys.equals(other.longPressKeys);
}
return false;
}
@Override public int hashCode() {
return Objects.hashCode(position, output, longPressKeys);
}
/** Sort character maps based on their ISO layout positions. */
@Override public int compareTo(CharacterMap o) {
return position.compareTo(o.position);
}
static Function<CharacterMap, IsoLayoutPosition> isoLayoutPositionFunction() {
return CharacterMapToIsoLayoutFunction.INSTANCE;
}
private enum CharacterMapToIsoLayoutFunction
implements Function<CharacterMap, IsoLayoutPosition> {
INSTANCE;
@Override
public IsoLayoutPosition apply(CharacterMap character) {
return character.position;
}
}
}