001    package components;
002    
003    import java.util.HashSet;
004    import java.util.Map;
005    import java.util.Set;
006    import java.util.concurrent.ConcurrentHashMap;
007    
008    /** KeyRegistry is a mutable object that stores the key triggers that the game should respond to.
009     * @author ruthdhan
010     * @specfield keyTriggers : set of <keyCode, keyDirection, gameObject> triples
011     */
012    public class KeyRegistry {
013            private Map<Integer, Set<GameObject>> downs;
014            private Map<Integer, Set<GameObject>> ups;
015            
016            public KeyRegistry() {
017                    downs = new ConcurrentHashMap<Integer, Set<GameObject>>();
018                    ups = new ConcurrentHashMap<Integer, Set<GameObject>>();
019            }
020            
021            public boolean registerDown(int key, GameObject tgt) {
022                    if (downs.containsKey(key)) {
023                            return downs.get(key).add(tgt);
024                    } else {
025                            downs.put(key, new HashSet<GameObject>());
026                            return downs.get(key).add(tgt);
027                    }
028            }
029            public boolean registerUp(int key, GameObject tgt) {
030                    if (ups.containsKey(key)) {
031                            return ups.get(key).add(tgt);
032                    } else {
033                            ups.put(key, new HashSet<GameObject>());
034                            return ups.get(key).add(tgt);
035                    }
036            }
037    
038        public Set<GameObject> getDown(int key) {
039            return downs.get(key);
040        }
041        public Set<GameObject> getUp(int key) {
042            return ups.get(key);
043        }
044        
045        /** @return all keys whose downpresses trigger obj **/
046        public Set<Integer> getDowns(GameObject obj) {
047            Set<Integer> output = new HashSet<Integer>();
048            for (Integer key : downs.keySet()) {
049                    if (downs.get(key).contains(obj))
050                            output.add(key);
051            }
052            return output;
053        }
054        
055        /** @return all keys whose upreleases trigger obj **/
056        public Set<Integer> getUps(GameObject obj) {
057            Set<Integer> output = new HashSet<Integer>();
058            for (Integer key : ups.keySet()) {
059                    if (ups.get(key).contains(obj))
060                            output.add(key);
061            }
062            return output;
063        }
064        
065        /** clear all key down triggers assoc with this object **/
066        public void clearDowns(GameObject obj) {
067            for (Integer key : downs.keySet()) {
068                    downs.get(key).remove(obj);
069            }
070        }
071        
072        /** clear all key up triggers assoc with this object **/
073        public void clearUps(GameObject obj) {
074            for (Integer key : ups.keySet()) {
075                    ups.get(key).remove(obj);
076            }
077        }
078        
079        /** get all down key presses that are listened for **/
080        public Set<Integer> getAllDownKeys() {
081            return downs.keySet();
082        }
083        
084        /** get all up key presses that are listened for **/
085        public Set<Integer> getAllUpKeys() {
086            return ups.keySet();
087        }
088        
089        /** remove the specified key press from the registry */
090        public boolean remove(int key, boolean down, GameObject tgt) {
091            if (down)
092                    return downs.get(key).remove(tgt);
093            else
094                    return ups.get(key).remove(tgt);
095        }
096    }