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    }