| // Copyright (C) 2009 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.gwtexpui.globalkey.client; |
| |
| import com.google.gwt.event.dom.client.KeyPressEvent; |
| import com.google.gwt.event.dom.client.KeyPressHandler; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| public class KeyCommandSet implements KeyPressHandler { |
| private final Map<Integer, KeyCommand> map; |
| private List<KeyCommandSet> sets; |
| private String name; |
| |
| public KeyCommandSet() { |
| this(""); |
| } |
| |
| public KeyCommandSet(final String setName) { |
| map = new HashMap<>(); |
| name = setName; |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(final String setName) { |
| assert setName != null; |
| name = setName; |
| } |
| |
| public boolean isEmpty() { |
| return map.isEmpty(); |
| } |
| |
| public void add(KeyCommand a, KeyCommand b) { |
| add(a); |
| add(b); |
| pair(a, b); |
| } |
| |
| public void pair(KeyCommand a, KeyCommand b) { |
| a.sibling = b; |
| b.sibling = a; |
| } |
| |
| public void add(final KeyCommand k) { |
| assert !map.containsKey(k.keyMask) |
| : "Key " + k.describeKeyStroke().asString() |
| + " already registered"; |
| if (!map.containsKey(k.keyMask)) { |
| map.put(k.keyMask, k); |
| } |
| } |
| |
| public void remove(final KeyCommand k) { |
| assert map.get(k.keyMask) == k; |
| map.remove(k.keyMask); |
| } |
| |
| public void add(final KeyCommandSet set) { |
| if (sets == null) { |
| sets = new ArrayList<>(); |
| } |
| assert !sets.contains(set); |
| sets.add(set); |
| for (final KeyCommand k : set.map.values()) { |
| add(k); |
| } |
| } |
| |
| public void remove(final KeyCommandSet set) { |
| assert sets != null; |
| assert sets.contains(set); |
| sets.remove(set); |
| for (final KeyCommand k : set.map.values()) { |
| remove(k); |
| } |
| } |
| |
| public void filter(final KeyCommandFilter filter) { |
| if (sets != null) { |
| for (final KeyCommandSet s : sets) { |
| s.filter(filter); |
| } |
| } |
| for (final Iterator<KeyCommand> i = map.values().iterator(); i.hasNext();) { |
| final KeyCommand kc = i.next(); |
| if (!filter.include(kc)) { |
| i.remove(); |
| } else if (kc instanceof CompoundKeyCommand) { |
| ((CompoundKeyCommand) kc).set.filter(filter); |
| } |
| } |
| } |
| |
| public Collection<KeyCommand> getKeys() { |
| return map.values(); |
| } |
| |
| public Collection<KeyCommandSet> getSets() { |
| return sets != null ? sets : Collections.<KeyCommandSet> emptyList(); |
| } |
| |
| @Override |
| public void onKeyPress(final KeyPressEvent event) { |
| final KeyCommand k = map.get(toMask(event)); |
| if (k != null) { |
| event.preventDefault(); |
| event.stopPropagation(); |
| k.onKeyPress(event); |
| } |
| } |
| |
| static int toMask(final KeyPressEvent event) { |
| int mask = event.getUnicodeCharCode(); |
| if (mask == 0) { |
| mask = event.getNativeEvent().getKeyCode(); |
| } |
| if (event.isAltKeyDown()) { |
| mask |= KeyCommand.M_ALT; |
| } |
| if (event.isControlKeyDown()) { |
| mask |= KeyCommand.M_CTRL; |
| } |
| if (event.isMetaKeyDown()) { |
| mask |= KeyCommand.M_META; |
| } |
| return mask; |
| } |
| } |