/*
* This file is part of Spoutcraft.
*
* Copyright (c) 2011 SpoutcraftDev <http://spoutcraft.org/>
* Spoutcraft is licensed under the GNU Lesser General Public License.
*
* Spoutcraft 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, either version 3 of the License, or
* (at your option) any later version.
*
* Spoutcraft 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 program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.spoutcraft.client.gui.controls;
import net.minecraft.src.GuiScreen;
import org.spoutcraft.api.ChatColor;
import org.spoutcraft.api.gui.Button;
import org.spoutcraft.api.gui.CheckBox;
import org.spoutcraft.api.gui.GenericButton;
import org.spoutcraft.api.gui.GenericLabel;
import org.spoutcraft.api.gui.GenericListView;
import org.spoutcraft.api.gui.GenericScrollArea;
import org.spoutcraft.api.gui.Keyboard;
import org.spoutcraft.api.gui.Orientation;
import org.spoutcraft.api.gui.ScrollArea;
import org.spoutcraft.api.gui.Widget;
import org.spoutcraft.client.SpoutClient;
import org.spoutcraft.client.controls.Shortcut;
import org.spoutcraft.client.controls.SimpleKeyBindingManager;
import org.spoutcraft.client.gui.ButtonUpdater;
import org.spoutcraft.client.gui.GuiSpoutScreen;
public class GuiControls extends GuiSpoutScreen implements ButtonUpdater {
private GenericLabel labelTitle, labelDescription;
private Button buttonDone, buttonAdd, buttonEdit, buttonRemove;
public CheckBox checkVanilla, checkSpoutcraft, checkCustom, checkShortcuts;
public ControlsSearch search;
private ScrollArea filter;
private GenericListView view;
private GuiScreen parentScreen;
private static ControlsModel model = null;
public static final ChatColor VANILLA_COLOR = ChatColor.YELLOW;
public static final ChatColor SPOUTCRAFT_COLOR = ChatColor.RED;
public static final ChatColor CUSTOM_COLOR = ChatColor.BLUE;
public static final ChatColor SHORTCUTS_COLOR = ChatColor.GREEN;
public GuiControls(GuiScreen parent) {
if (model == null) {
model = new ControlsModel(this);
}
this.parentScreen = parent;
}
protected void createInstances() {
labelTitle = new GenericLabel("Controls");
buttonDone = new GenericButton("Done");
buttonAdd = new GenericButton("Add Shortcut");
buttonEdit = new GenericButton("Edit");
buttonEdit.setTooltip("Edit Shortcut");
buttonRemove = new DeleteControlButton(this);
buttonRemove.setTooltip("Remove Shortcut");
labelDescription = new GenericLabel();
labelDescription.setText("Double-click an item, then press the key (combination).");
labelDescription.setWrapLines(true);
filter = new GenericScrollArea();
view = new GenericListView(model);
model.setCurrentGui(this);
checkVanilla = new ControlsCheckBox(this, VANILLA_COLOR + "Minecraft Bindings");
checkSpoutcraft = new ControlsCheckBox(this, SPOUTCRAFT_COLOR + "Spoutcraft Bindings");
checkCustom = new ControlsCheckBox(this, CUSTOM_COLOR + "Custom Bindings");
checkShortcuts = new ControlsCheckBox(this, SHORTCUTS_COLOR + "Shortcuts");
search = new ControlsSearch(this);
filter.attachWidget("Spoutcraft", checkVanilla);
filter.attachWidget("Spoutcraft", checkSpoutcraft);
filter.attachWidget("Spoutcraft", checkCustom);
filter.attachWidget("Spoutcraft", checkShortcuts);
getScreen().attachWidget("Spoutcraft", search);
getScreen().attachWidget("Spoutcraft", labelTitle);
getScreen().attachWidget("Spoutcraft", filter);
getScreen().attachWidget("Spoutcraft", view);
getScreen().attachWidget("Spoutcraft", buttonAdd);
getScreen().attachWidget("Spoutcraft", buttonEdit);
getScreen().attachWidget("Spoutcraft", buttonRemove);
getScreen().attachWidget("Spoutcraft", buttonDone);
getScreen().attachWidget("Spoutcraft", labelDescription);
updateButtons();
model.refresh();
}
protected void layoutWidgets() {
int top = 5;
int swidth = mc.fontRenderer.getStringWidth(labelTitle.getText());
labelTitle.setY(top + 7).setX(width / 2 - swidth / 2).setHeight(11).setWidth(swidth);
search.setX(5).setY(top).setWidth(150).setHeight(20);
top+=25;
int sheight = height - top - 55;
filter.setX(5).setY(top).setWidth(130).setHeight(sheight);
view.setX((int) (5 + filter.getX() + filter.getWidth())).setY(top).setWidth((int) (width - 15 - filter.getWidth())).setHeight(sheight);
int ftop = 5;
checkVanilla.setX(5).setY(ftop).setWidth(100).setHeight(20);
ftop += 25;
checkSpoutcraft.setX(5).setY(ftop).setWidth(100).setHeight(20);
ftop += 25;
checkCustom.setX(5).setY(ftop).setWidth(100).setHeight(20);
ftop += 25;
checkShortcuts.setX(5).setY(ftop).setWidth(100).setHeight(20);
for (Widget w:filter.getAttachedWidgets()) {
w.setWidth(filter.getViewportSize(Orientation.HORIZONTAL) - 10);
}
search.setWidth((int) filter.getWidth());
top += 5 + view.getHeight();
int totalWidth = Math.min(width - 10, 200 * 3 + 10);
int cellWidth = (totalWidth - 10) / 3;
int left = width / 2 - totalWidth / 2;
int center = left + 5 + cellWidth;
int right = center + 5 + cellWidth;
buttonAdd.setHeight(20).setWidth(cellWidth).setX(left).setY(top);
buttonEdit.setHeight(20).setWidth(cellWidth).setX(center).setY(top);
buttonRemove.setHeight(20).setWidth(cellWidth).setX(right).setY(top);
top+=25;
labelDescription.setHeight(20).setWidth(cellWidth * 2 + 5).setX(left).setY(top);
labelDescription.recalculateLines();
buttonDone.setHeight(20).setWidth(cellWidth).setX(right).setY(top);
}
@Override
protected void buttonClicked(Button btn) {
if (btn.equals(buttonDone)) {
mc.displayGuiScreen(parentScreen);
return;
}
if (btn.equals(buttonAdd)) {
Shortcut sh = new Shortcut();
sh.setTitle("");
sh.setKey(Keyboard.KEY_UNKNOWN.getKeyCode());
editItem(sh);
return;
}
ControlsBasicItem item = model.getItem(view.getSelectedRow());
ShortcutBindingItem sh = null;
if (item != null && item instanceof ShortcutBindingItem) {
sh = (ShortcutBindingItem) item;
}
if (sh != null && btn.equals(buttonEdit)) {
editItem(sh.getShortcut());
} else if (btn.equals(buttonEdit) && item != null) {
model.setEditing(item);
}
}
public void editItem(Shortcut item) {
GuiEditShortcut gui = new GuiEditShortcut(this, item);
mc.displayGuiScreen(gui);
}
public void updateButtons() {
ControlsBasicItem item = model.getItem(view.getSelectedRow());
buttonEdit.setEnabled(item != null);
((DeleteControlButton)buttonRemove).setReallyShown(false);
//buttonRemove.setEnabled(item instanceof ShortcutBindingItem || item instanceof KeyBindingItem);
}
protected void keyTyped(char c, int i, boolean pressed) {
ControlsBasicItem item = model.getEditingItem();
if (item != null) {
if (item.useModifiers() && (!SimpleKeyBindingManager.isModifierKey(i) && pressed) || (SimpleKeyBindingManager.isModifierKey(i) && !pressed)) {
item.setModifiers(SimpleKeyBindingManager.getPressedModifiers());
item.setKey(i);
model.finishEdit();
} else if (!item.useModifiers()) {
item.setKey(i);
model.finishEdit();
}
}
}
@Override
public void handleKeyboardInput() {
ControlsBasicItem item = model.getEditingItem();
if (item != null) {
this.keyTyped(org.lwjgl.input.Keyboard.getEventCharacter(), org.lwjgl.input.Keyboard.getEventKey(), org.lwjgl.input.Keyboard.getEventKeyState());
} else {
super.handleKeyboardInput();
}
}
@Override
protected void mouseClicked(int x, int y, int button) {
ControlsBasicItem item = model.getEditingItem();
if (item != null && item.useMouseButtons()) {
item.setModifiers(SimpleKeyBindingManager.getPressedModifiers());
item.setKey(SimpleKeyBindingManager.MOUSE_OFFSET + button);
model.finishEdit();
}
}
public ControlsModel getModel() {
return model;
}
public void deleteCurrentControl() {
SimpleKeyBindingManager man = (SimpleKeyBindingManager) SpoutClient.getInstance().getKeyBindingManager();
ControlsBasicItem item = model.getItem(view.getSelectedRow());
ShortcutBindingItem sh = null;
if (item != null && item instanceof ShortcutBindingItem) {
sh = (ShortcutBindingItem) item;
}
KeyBindingItem binding = null;
if (item != null && item instanceof KeyBindingItem) {
binding = (KeyBindingItem) item;
}
if (sh != null) {
man.unregisterShortcut(sh.getShortcut());
man.save();
} else if (binding != null) {
man.unregisterControl(binding.getBinding());
man.save();
model.refresh();
} else {
item.setKey(-128);
}
model.refresh();
}
}