001 // License: GPL. See LICENSE file for details.
002 package org.openstreetmap.josm.actions.mapmode;
003
004 /**
005 * TODO: rewrite to use awt modifers flag instead.
006 *
007 * @author Ole J??rgen Br??nner (olejorgenb)
008 */
009 public class ModifiersSpec {
010 static public final int ON = 1, OFF = 0, UNKNOWN = 2;
011 public int alt = UNKNOWN;
012 public int shift = UNKNOWN;
013 public int ctrl = UNKNOWN;
014
015 /**
016 * 'A' = Alt, 'S' = Shift, 'C' = Ctrl
017 * Lowercase signifies off and '?' means unknown/optional.
018 * Order is Alt, Shift, Ctrl
019 * @param str
020 */
021 public ModifiersSpec(String str) {
022 assert (str.length() == 3);
023 char a = str.charAt(0);
024 char s = str.charAt(1);
025 char c = str.charAt(2);
026 // @formatter:off
027 alt = (a == '?' ? UNKNOWN : (a == 'A' ? ON : OFF));
028 shift = (s == '?' ? UNKNOWN : (s == 'S' ? ON : OFF));
029 ctrl = (c == '?' ? UNKNOWN : (c == 'C' ? ON : OFF));
030 // @formatter:on
031 }
032
033 public ModifiersSpec(final int alt, final int shift, final int ctrl) {
034 this.alt = alt;
035 this.shift = shift;
036 this.ctrl = ctrl;
037 }
038
039 public boolean matchWithKnown(final int knownAlt, final int knownShift, final int knownCtrl) {
040 return match(alt, knownAlt) && match(shift, knownShift) && match(ctrl, knownCtrl);
041 }
042
043 public boolean matchWithKnown(final boolean knownAlt, final boolean knownShift, final boolean knownCtrl) {
044 return match(alt, knownAlt) && match(shift, knownShift) && match(ctrl, knownCtrl);
045 }
046
047 private boolean match(final int a, final int knownValue) {
048 assert (knownValue == ON | knownValue == OFF);
049 return a == knownValue || a == UNKNOWN;
050 }
051
052 private boolean match(final int a, final boolean knownValue) {
053 return a == (knownValue ? ON : OFF) || a == UNKNOWN;
054 }
055 // does java have built in 3-state support?
056 }