/*
* 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 javax.annotation.Nullable;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.resources.I18n;
import net.minecraft.client.settings.GameSettings;
import org.lwjgl.input.Keyboard;
public enum KeyModifier {
CONTROL {
@Override
public boolean matches(int keyCode)
{
if (Minecraft.IS_RUNNING_ON_MAC)
{
return keyCode == Keyboard.KEY_LMETA || keyCode == Keyboard.KEY_RMETA;
}
else
{
return keyCode == Keyboard.KEY_LCONTROL || keyCode == Keyboard.KEY_RCONTROL;
}
}
@Override
public boolean isActive()
{
return GuiScreen.isCtrlKeyDown();
}
@Override
public boolean isActive(@Nullable IKeyConflictContext conflictContext)
{
return GuiScreen.isCtrlKeyDown();
}
@Override
public String getLocalizedComboName(int keyCode)
{
String keyName = GameSettings.getKeyDisplayString(keyCode);
String localizationFormatKey = Minecraft.IS_RUNNING_ON_MAC ? "forge.controlsgui.control.mac" : "forge.controlsgui.control";
return I18n.format(localizationFormatKey, keyName);
}
},
SHIFT {
@Override
public boolean matches(int keyCode)
{
return keyCode == Keyboard.KEY_LSHIFT || keyCode == Keyboard.KEY_RSHIFT;
}
@Override
public boolean isActive()
{
return GuiScreen.isShiftKeyDown();
}
@Override
public boolean isActive(@Nullable IKeyConflictContext conflictContext)
{
return GuiScreen.isShiftKeyDown();
}
@Override
public String getLocalizedComboName(int keyCode)
{
String keyName = GameSettings.getKeyDisplayString(keyCode);
return I18n.format("forge.controlsgui.shift", keyName);
}
},
ALT {
@Override
public boolean matches(int keyCode)
{
return keyCode == Keyboard.KEY_LMENU || keyCode == Keyboard.KEY_RMENU;
}
@Override
public boolean isActive()
{
return GuiScreen.isAltKeyDown();
}
@Override
public boolean isActive(@Nullable IKeyConflictContext conflictContext)
{
return GuiScreen.isAltKeyDown();
}
@Override
public String getLocalizedComboName(int keyCode)
{
String keyName = GameSettings.getKeyDisplayString(keyCode);
return I18n.format("forge.controlsgui.alt", keyName);
}
},
NONE {
@Override
public boolean matches(int keyCode)
{
return false;
}
@Override
public boolean isActive()
{
return true;
}
@Override
public boolean isActive(@Nullable IKeyConflictContext conflictContext)
{
if (conflictContext != null && !conflictContext.conflicts(KeyConflictContext.IN_GAME))
{
for (KeyModifier keyModifier : MODIFIER_VALUES)
{
if (keyModifier.isActive(conflictContext))
{
return false;
}
}
}
return true;
}
@Override
public String getLocalizedComboName(int keyCode)
{
return GameSettings.getKeyDisplayString(keyCode);
}
};
public static final KeyModifier[] MODIFIER_VALUES = {SHIFT, CONTROL, ALT};
public static KeyModifier getActiveModifier()
{
for (KeyModifier keyModifier : MODIFIER_VALUES)
{
if (keyModifier.isActive(null))
{
return keyModifier;
}
}
return NONE;
}
public static boolean isKeyCodeModifier(int keyCode)
{
for (KeyModifier keyModifier : MODIFIER_VALUES)
{
if (keyModifier.matches(keyCode))
{
return true;
}
}
return false;
}
public static KeyModifier valueFromString(String stringValue)
{
try
{
return valueOf(stringValue);
}
catch (NullPointerException ignored)
{
return NONE;
}
catch (IllegalArgumentException ignored)
{
return NONE;
}
}
public abstract boolean matches(int keyCode);
/**
* @deprecated use {@link #isActive(IKeyConflictContext)}
*/
@Deprecated
public abstract boolean isActive();
public abstract boolean isActive(@Nullable IKeyConflictContext conflictContext);
public abstract String getLocalizedComboName(int keyCode);
}