/*
* 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.server;
import net.minecraft.src.GuiScreen;
import org.spoutcraft.api.gui.Button;
import org.spoutcraft.api.gui.Color;
import org.spoutcraft.api.gui.GenericButton;
import org.spoutcraft.api.gui.GenericLabel;
import org.spoutcraft.api.gui.GenericTextField;
import org.spoutcraft.api.gui.Keyboard;
import org.spoutcraft.api.gui.TextField;
import org.spoutcraft.api.gui.GenericListView;
import org.spoutcraft.client.SpoutClient;
public class GuiFavorites extends GuiScreen {
private GuiScreen parent;
// GUI stuff
private Button buttonJoin, buttonAdd, buttonDelete, buttonEdit, buttonMainMenu, buttonServerList, buttonClear, buttonQuickJoin, buttonMoveUp, buttonMoveDown, buttonRefresh;
private GenericLabel labelTitle;
private TextField textQuickJoin;
private GenericListView view;
public ServerModel model = SpoutClient.getInstance().getServerManager().getFavorites();
private long pollTime = 0L;
public GuiFavorites(GuiScreen parent) {
this.parent = parent;
model.setCurrentGUI(this);
}
@Override
public void initGui() {
labelTitle = new GenericLabel("Favorite Servers");
labelTitle.setY(12).setX(width / 2 - mc.fontRenderer.getStringWidth(labelTitle.getText()) / 2);
labelTitle.setHeight(15).setWidth(mc.fontRenderer.getStringWidth(labelTitle.getText()) / 2);
getScreen().attachWidget("Spoutcraft", labelTitle);
buttonMoveUp = new GenericButton("/\\");
buttonMoveUp.setTooltip("Move Item Up");
buttonMoveUp.setX(5).setY(5);
buttonMoveUp.setHeight(20).setWidth(20);
getScreen().attachWidget("Spoutcraft", buttonMoveUp);
buttonMoveDown = new GenericButton("\\/");
buttonMoveDown.setTooltip("Move Item Down");
buttonMoveDown.setX(25).setY(5);
buttonMoveDown.setHeight(20).setWidth(20);
getScreen().attachWidget("Spoutcraft", buttonMoveDown);
buttonRefresh = new GenericButton("Refresh");
buttonRefresh.setHeight(20).setWidth(100).setX(width - 105).setY(5);
getScreen().attachWidget("Spoutcraft", buttonRefresh);
int viewheight = height - 110;
view = new GenericListView(model);
view.setX(5).setY(30).setWidth(width - 10).setHeight(viewheight);
getScreen().attachWidget("Spoutcraft", view);
int top = (int) (view.getY() + view.getHeight() + 5);
int totalWidth = Math.min(width - 9, 200 * 3 + 10);
int cellWidth = (totalWidth - 10) / 3;
int left = width / 2 - totalWidth / 2;
int center = left + cellWidth + 5;
int right = center + cellWidth + 5;
String text = SpoutClient.getHandle().gameSettings.lastServer.replace("_", ":");
if (textQuickJoin != null) {
text = textQuickJoin.getText();
}
textQuickJoin = new QuickJoin();
textQuickJoin.setX(left + 2).setY(top + 2).setHeight(16).setWidth((cellWidth * 2 + 5 - 4) - (cellWidth/2));
textQuickJoin.setMaximumCharacters(0);
textQuickJoin.setText(text);
getScreen().attachWidget("Spoutcraft", textQuickJoin);
buttonClear = new GenericButton("Clear");
buttonClear.setX(left + 10 + (cellWidth*2) - (cellWidth/2)).setY(top).setWidth((cellWidth/2) - 5).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonClear);
buttonQuickJoin = new GenericButton("Quick Join");
buttonQuickJoin.setX(right).setY(top).setWidth(cellWidth).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonQuickJoin);
top += 25;
buttonJoin = new GenericButton("Join Server");
buttonJoin.setX(right).setY(top).setWidth(cellWidth).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonJoin);
buttonAdd = new GenericButton("Add Favorite");
buttonAdd.setX(center).setY(top).setWidth(cellWidth).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonAdd);
buttonEdit = new GenericButton("Edit");
buttonEdit.setX(left).setY(top).setWidth(cellWidth).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonEdit);
top += 25;
buttonDelete = new DeleteFavoriteButton(this);
buttonDelete.setX(left).setY(top).setWidth(cellWidth).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonDelete);
buttonServerList = new GenericButton("Public Servers");
buttonServerList.setX(center).setY(top).setWidth(cellWidth)
.setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonServerList);
buttonMainMenu = new GenericButton("Main Menu");
buttonMainMenu.setX(right).setY(top).setWidth(cellWidth).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonMainMenu);
refresh();
updateButtons();
SpoutClient.getInstance().getServerManager().staticServers.load();
}
private class QuickJoin extends GenericTextField {
@Override
public boolean onKeyPressed(Keyboard key) {
if (key == Keyboard.KEY_RETURN && buttonQuickJoin.isEnabled()) {
doQuickJoin();
return true;
} else {
buttonQuickJoin.setEnabled(textQuickJoin.getText().length() > 0);
}
return false;
}
}
@Override
public void drawScreen(int var1, int var2, float var3) {
drawDefaultBackground();
}
@Override
public void buttonClicked(Button btn) {
if (btn.equals(buttonMainMenu)) {
SpoutClient.getHandle().displayGuiScreen(new org.spoutcraft.client.gui.mainmenu.MainMenu());
}
if (btn.equals(buttonServerList)) {
//SpoutClient.getHandle().displayGuiScreen(new GuiServerList());
SpoutClient.getHandle().displayGuiScreen(new GuiStaticServerList(this)); //Use static version until WebAPI is updated.
}
if (btn.equals(buttonClear)) {
textQuickJoin.setText("");
}
if (btn.equals(buttonQuickJoin)) {
doQuickJoin();
}
if (btn.equals(buttonAdd)) {
String address = "";
if (model instanceof FavoritesModel) {
address = textQuickJoin.getText();
} else if (model instanceof LANModel) {
ServerItem item = (ServerItem) view.getSelectedItem();
address = item.ip + ":" + item.port;
}
SpoutClient.getHandle().displayGuiScreen(new GuiAddFavorite(address, this));
}
if (btn.equals(buttonEdit)) {
ServerItem item = (ServerItem) view.getSelectedItem();
// Produces a "hang" why ever :(
if (item != null) {
SpoutClient.getHandle().displayGuiScreen(new GuiAddFavorite(item, this));
} else {
updateButtons();
}
}
if (btn.equals(buttonJoin)) {
ServerItem item = null;
if (view.getSelectedRow() > -1) {
item = (ServerItem) model.getItem(view.getSelectedRow());
}
if (item != null) {
SpoutClient.getInstance().getServerManager().join(item, this, "Favorites");
} else {
// Just in case something weird happens
updateButtons();
}
}
FavoritesModel fav = null;
if (model instanceof FavoritesModel) {
fav = (FavoritesModel) model;
}
if (btn.equals(buttonMoveUp) && fav != null) {
if (view.getSelectedRow() != -1) {
fav.move(view.getSelectedRow(), view.getSelectedRow() - 1);
view.shiftSelection(-1);
fav.save();
}
}
if (btn.equals(buttonMoveDown) && fav != null) {
if (view.getSelectedRow() != -1) {
fav.move(view.getSelectedRow(), view.getSelectedRow() + 1);
view.shiftSelection(1);
fav.save();
}
}
if (btn.equals(buttonRefresh)) {
refresh();
}
}
public void refresh() {
pollTime = System.currentTimeMillis();
for (int i = 0; i < model.getSize(); i++) {
ServerItem item = (ServerItem) model.getItem(i);
item.poll();
}
}
public void deleteCurrentFavorite() {
if (model instanceof FavoritesModel) {
FavoritesModel fav = (FavoritesModel) model;
fav.removeServer((ServerItem) view.getSelectedItem());
fav.save();
}
}
public void doQuickJoin() {
try {
String adress = textQuickJoin.getText();
if (!adress.isEmpty()) {
String split[] = adress.split(":");
String ip = split[0];
int port = split.length > 1 ? Integer.parseInt(split[1]) : ServerItem.DEFAULT_PORT;
SpoutClient.getHandle().gameSettings.lastServer = adress.replace(":", "_");
SpoutClient.getHandle().gameSettings.saveOptions();
SpoutClient.getInstance().getServerManager().join(ip, port, this, "Favorites");
}
} catch (Exception e) {
}
}
public void updateButtons() {
boolean enable = true;
if (view != null && view.getSelectedRow() == -1) {
enable = false;
}
// GUI has not been initialized
if (buttonEdit == null) {
return;
}
buttonEdit.setEnabled(enable);
buttonDelete.setEnabled(enable);
buttonJoin.setEnabled(enable);
buttonDelete.setText("Delete");
buttonMoveDown.setEnabled(enable);
buttonMoveUp.setEnabled(enable);
buttonAdd.setEnabled(true);
if (model.isPolling()) {
buttonRefresh.setEnabled(false);
buttonRefresh.setText("Polling...");
buttonRefresh.setDisabledColor(new Color(0f, 0f, 1f));
} else {
buttonRefresh.setEnabled(true);
buttonRefresh.setText("Refresh");
}
if (view.getSelectedItem() instanceof ServerItem) {
ServerItem item = (ServerItem) view.getSelectedItem();
buttonJoin.setEnabled(item.isCompatible(SpoutClient.spoutcraftVersion));
}
}
@Override
public void updateScreen() {
if (model.isPolling()) {
Color color = new Color(0, 0f, 0);
double darkness = 0;
long t = System.currentTimeMillis() % 1000;
darkness = Math.cos(t * 2 * Math.PI / 1000) * 0.2 + 0.2;
color.setBlue(1f - (float) darkness);
if (model.isPolling()) {
buttonRefresh.setDisabledColor(color);
}
// If polling locks up and takes > 15s, unlock the button
if (pollTime + 15000L < System.currentTimeMillis()) {
for (int i = 0; i < model.getSize(); i++) {
ServerItem item = (ServerItem) model.getItem(i);
if (item.isPolling()) {
item.endPolling();
}
}
model.setPolling(false);
}
}
buttonClear.setEnabled(textQuickJoin.getText().length() > 0);
buttonQuickJoin.setEnabled(textQuickJoin.getText().length() > 0);
super.updateScreen();
}
}