/*
* Minecraft Forge
* Copyright (c) 2016.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.client.settings;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.util.IntHashMap;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.List;
public class KeyBindingMap
{
private static final EnumMap<KeyModifier, IntHashMap<Collection<KeyBinding>>> map = new java.util.EnumMap<KeyModifier, IntHashMap<Collection<KeyBinding>>>(KeyModifier.class);
static
{
for (KeyModifier modifier : KeyModifier.values())
{
map.put(modifier, new IntHashMap<Collection<KeyBinding>>());
}
}
@Nullable
public KeyBinding lookupActive(int keyCode)
{
KeyModifier activeModifier = KeyModifier.getActiveModifier();
if (!activeModifier.matches(keyCode))
{
KeyBinding binding = getBinding(keyCode, activeModifier);
if (binding != null)
{
return binding;
}
}
return getBinding(keyCode, KeyModifier.NONE);
}
@Nullable
private KeyBinding getBinding(int keyCode, KeyModifier keyModifier)
{
Collection<KeyBinding> bindings = map.get(keyModifier).lookup(keyCode);
if (bindings != null)
{
for (KeyBinding binding : bindings)
{
if (binding.isActiveAndMatches(keyCode))
{
return binding;
}
}
}
return null;
}
public List<KeyBinding> lookupAll(int keyCode)
{
List<KeyBinding> matchingBindings = new ArrayList<KeyBinding>();
for (IntHashMap<Collection<KeyBinding>> bindingsMap : map.values())
{
Collection<KeyBinding> bindings = bindingsMap.lookup(keyCode);
if (bindings != null)
{
matchingBindings.addAll(bindings);
}
}
return matchingBindings;
}
public void addKey(int keyCode, KeyBinding keyBinding)
{
KeyModifier keyModifier = keyBinding.getKeyModifier();
IntHashMap<Collection<KeyBinding>> bindingsMap = map.get(keyModifier);
Collection<KeyBinding> bindingsForKey = bindingsMap.lookup(keyCode);
if (bindingsForKey == null)
{
bindingsForKey = new ArrayList<KeyBinding>();
bindingsMap.addKey(keyCode, bindingsForKey);
}
bindingsForKey.add(keyBinding);
}
public void removeKey(KeyBinding keyBinding)
{
KeyModifier keyModifier = keyBinding.getKeyModifier();
int keyCode = keyBinding.getKeyCode();
IntHashMap<Collection<KeyBinding>> bindingsMap = map.get(keyModifier);
Collection<KeyBinding> bindingsForKey = bindingsMap.lookup(keyCode);
if (bindingsForKey != null)
{
bindingsForKey.remove(keyBinding);
if (bindingsForKey.isEmpty())
{
bindingsMap.removeObject(keyCode);
}
}
}
public void clearMap()
{
for (IntHashMap<Collection<KeyBinding>> bindings : map.values())
{
bindings.clearMap();
}
}
}