/*
* This file is part of Spoutcraft (http://wiki.getspout.org/).
*
* 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.getspout.spout.gui.server;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import net.minecraft.src.*;
import org.getspout.spout.client.SpoutClient;
import org.getspout.spout.io.*;
import org.lwjgl.input.Keyboard;
public class GuiFavorites extends GuiScreen {
public List serverList = new ArrayList();
private final DateFormat dateFormatter = new SimpleDateFormat();
protected GuiScreen parentScreen;
protected String screenTitle = "Favorite Servers";
private int selectedWorld;
private GuiFavoritesSlot worldSlotContainer;
private String field_22098_o;
private String field_22097_p;
private boolean deleting;
private GuiButton buttonSelect;
private GuiButton buttonDelete;
private GuiButton buttonRename;
private GuiButton buttonUp;
private GuiButton buttonDown;
private GuiTextField quickJoinText;
private GuiButton quickJoin;
private static final int JOIN_SERVER = 0;
private static final int DELETE_SERVER = 1;
private static final int ADD_SERVER = 2;
private static final int PUBLIC_SERVER_LIST = 3;
private static final int RENAME_SERVER = 4;
private static final int ARROW_UP = 5;
private static final int ARROW_DOWN = 6;
private static final int MAIN_MENU = 7;
private static final int QUICK_JOIN = 8;
public GuiFavorites(GuiScreen var1) {
this.parentScreen = var1;
}
public void initGui() {
StringTranslate var1 = StringTranslate.getInstance();
Keyboard.enableRepeatEvents(true);
this.field_22098_o = var1.translateKey("Unknown");
this.field_22097_p = var1.translateKey("aaa");
this.loadSaves();
this.worldSlotContainer = new GuiFavoritesSlot(this);
this.worldSlotContainer.registerScrollButtons(this.controlList, 4, 5);
this.initButtons();
}
@Override
public void onGuiClosed() {
Keyboard.enableRepeatEvents(false);
}
private void loadSaves() {
this.selectedWorld = -1;
this.serverList.clear();
this.requestServer("");
Collections.sort(this.serverList, new SortByID());
}
protected String getServerName(int var1) {
return ((ServerSlot)this.serverList.get(var1)).name;
}
protected String getCountry(int var1) {
return ((ServerSlot)this.serverList.get(var1)).country;
}
@Override
public void updateScreen() {
quickJoinText.updateCursorCounter();
}
@Override
public void keyTyped(char letter, int key) {
if (key == Keyboard.KEY_RETURN && quickJoinText.isFocused) {
actionPerformed(quickJoin);
}
else {
quickJoinText.textboxKeyTyped(letter, key);
super.keyTyped(letter, key);
}
}
@Override
public void mouseClicked(int var1, int var2, int var3) {
super.mouseClicked(var1, var2, var3);
quickJoinText.mouseClicked(var1, var2, var3);
}
public void initButtons() {
//Top Row
quickJoinText = new GuiTextField(this, SpoutClient.getHandle().fontRenderer, this.width / 2 - 200, height - 70, 263, 20, "");
quickJoinText.setMaxStringLength(40);
quickJoinText.setText(SpoutClient.getHandle().gameSettings.lastServer.replace("_", ":"));
controlList.add(quickJoin = new GuiButton(QUICK_JOIN, width / 2 + 67, height - 70, 129, 20, "Quick Join"));
//Middle row
controlList.add(buttonSelect = new GuiButton(JOIN_SERVER, width / 2 - 200, height - 46, 130, 20, "Join"));
controlList.add(buttonDelete = new GuiButton(DELETE_SERVER, width / 2 - 66, height - 46, 130, 20, "Delete"));
controlList.add(buttonRename = new GuiButton(RENAME_SERVER, width / 2 + 67, height - 46, 129, 20, "Rename"));
//Bottom Row
controlList.add(new GuiButton(ADD_SERVER, width / 2 - 200, height - 22, 130, 20, "Add Server"));
controlList.add(new GuiButton(PUBLIC_SERVER_LIST, width / 2 - 66, height - 22, 130, 20, "Public Server List"));
controlList.add(new GuiButton(MAIN_MENU, width / 2 + 67, height - 22, 129, 20, "Main Menu"));
//Arrow keys
controlList.add(buttonUp = new GuiButton(ARROW_UP, width - 30, 25, 20, 20, "/\\"));
controlList.add(buttonDown = new GuiButton(ARROW_DOWN, width - 30, height - 101, 20, 20, "\\/"));
buttonRename.enabled = false;
buttonSelect.enabled = false;
buttonDelete.enabled = false;
buttonUp.enabled = false;
buttonDown.enabled = false;
}
public void actionPerformed(GuiButton button) {
if(button.enabled) {
String serverName = null;
switch(button.id) {
case JOIN_SERVER:
selectWorld(selectedWorld);
break;
case DELETE_SERVER:
if (selectedWorld > -1) {
serverName = ((ServerSlot)serverList.get(selectedWorld)).name;
if(serverName != null) {
deleting = true;
SpoutClient.getHandle().displayGuiScreen(new GuiYesNo(this, "Are you sure you want to remove '" + serverName + "' from your favorites?", "This action can not be undone", StringTranslate.getInstance().translateKey("selectWorld.deleteButton"), StringTranslate.getInstance().translateKey("gui.cancel"), this.selectedWorld));
}
}
break;
case ADD_SERVER:
SpoutClient.getHandle().displayGuiScreen(new GuiAddFav(this, "", ""));
break;
case PUBLIC_SERVER_LIST:
SpoutClient.getHandle().displayGuiScreen(new GuiMultiplayer(this));
break;
case RENAME_SERVER:
if (selectedWorld > -1) {
serverName = ((ServerSlot)serverList.get(selectedWorld)).name;
if(serverName != null) {
String ip = (((ServerSlot)this.serverList.get(selectedWorld)).ip + ((ServerSlot)this.serverList.get(selectedWorld)).port);
deleting = true;
deleteWorld(true, selectedWorld);
SpoutClient.getHandle().displayGuiScreen(new GuiAddFav(this, serverName, ip, true));
}
}
break;
case ARROW_UP:
shiftUp();
break;
case ARROW_DOWN:
shiftDown();
break;
case MAIN_MENU:
SpoutClient.getHandle().displayGuiScreen(new GuiMainMenu());
break;
case QUICK_JOIN:
try {
if (!quickJoinText.getText().isEmpty()) {
String split[] = quickJoinText.getText().split(":");
String ip = split[0];
int port = split.length > 1 ? Integer.parseInt(split[1]) : 25565;
SpoutClient.getHandle().gameSettings.lastServer = quickJoinText.getText().replace(":", "_");
SpoutClient.getHandle().gameSettings.saveOptions();
SpoutClient.getHandle().displayGuiScreen(new GuiConnecting(SpoutClient.getHandle(), ip, port));
}
}
catch (Exception e) { }
break;
default:
worldSlotContainer.actionPerformed(button);
break;
}
}
}
public void selectWorld(int index) {
if (index > -1) {
try {
String info[] = ((ServerSlot)this.serverList.get(index)).name.split(":");
String ip = info[0];
int port = info.length > 1 ? Integer.parseInt(info[1]) : 25565;
SpoutClient.getHandle().displayGuiScreen(new GuiConnecting(SpoutClient.getHandle(), ip, port));
}
catch (Exception e) { }
}
}
public void deleteWorld(boolean var1, int var2) {
if(this.deleting) {
this.deleting = false;
if(var1) {
this.delSave();
Iterator var3 = this.serverList.iterator();
while(var3.hasNext()) {
ServerSlot var4 = (ServerSlot)var3.next();
if(var2 != var4.ID) {
GuiFavorites.writeFav(var4.name, var4.ip);
}
}
this.loadSaves();
}
}
SpoutClient.getHandle().displayGuiScreen(this);
}
public void shiftUp() {
if(((ServerSlot)this.serverList.get(this.selectedWorld)).ID > 0) {
this.delSave();
--((ServerSlot)this.serverList.get(this.selectedWorld)).ID;
++((ServerSlot)this.serverList.get(this.selectedWorld - 1)).ID;
Collections.sort(this.serverList, new SortByID());
Iterator var1 = this.serverList.iterator();
while(var1.hasNext()) {
ServerSlot var2 = (ServerSlot)var1.next();
GuiFavorites.writeFav(var2.name, var2.ip);
}
--this.selectedWorld;
}
}
public void shiftDown() {
if(((ServerSlot)this.serverList.get(this.selectedWorld)).ID < this.serverList.size() - 1) {
this.delSave();
++((ServerSlot)this.serverList.get(this.selectedWorld)).ID;
--((ServerSlot)this.serverList.get(this.selectedWorld + 1)).ID;
Collections.sort(this.serverList, new SortByID());
Iterator var1 = this.serverList.iterator();
while(var1.hasNext()) {
ServerSlot var2 = (ServerSlot)var1.next();
GuiFavorites.writeFav(var2.name, var2.ip);
}
++this.selectedWorld;
}
}
public void requestServer(String var1) {
try {
int var2 = 0;
FileInputStream var3 = new FileInputStream(getFavoriteServerFile());
DataInputStream var4 = new DataInputStream(var3);
String var6;
for(BufferedReader var5 = new BufferedReader(new InputStreamReader(var4)); (var6 = var5.readLine()) != null; ++var2) {
ServerSlot var7 = new ServerSlot(var2);
String[] var8 = var6.split(">");
var7 = this.setServer(var2, var7, var8[0], var8[1]);
this.serverList.add(var7);
}
var4.close();
} catch (Exception var9) {
System.err.println("Error: " + var9.getMessage());
}
}
public ServerSlot setServer(int var1, ServerSlot var2, String ip, String name) {
String[] var5 = ip.split(":");
if(var5.length >= 2) {
var2.port = var5[1];
}
var2.ip = var5[0];
var2.name = name;
return var2;
}
public static String stripLeadingAndTrailingQuotes(String var0) {
if(var0.startsWith("\"")) {
var0 = var0.substring(1, var0.length());
}
if(var0.endsWith("\"")) {
var0 = var0.substring(0, var0.length() - 1);
}
return var0;
}
public static void writeFav(String name, String ip) {
try {
FileWriter writer = new FileWriter(getFavoriteServerFile(), true);
writer.write(ip + ">" + name + "\n");;
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void delSave() {
try {
File var1 = getFavoriteServerFile();
if(!var1.delete()) {
return;
}
(new FileWriter(getFavoriteServerFile())).close();
} catch (IOException var2) {
;
}
}
public void drawScreen(int var1, int var2, float var3) {
buttonRename.enabled = buttonDelete.enabled;
this.worldSlotContainer.drawScreen(var1, var2, var3);
this.drawCenteredString(SpoutClient.getHandle().fontRenderer, "Favorite Servers", this.width / 2, 5, 16777215);
quickJoinText.drawTextBox();
if (quickJoinText.getText().isEmpty() && !quickJoinText.isFocused) {
this.drawString(SpoutClient.getHandle().fontRenderer, "Quick Join: ", this.width / 2 - 196, height - 64, 5263440);
}
super.drawScreen(var1, var2, var3);
}
public static List getSize(GuiFavorites screen) {
return screen.serverList;
}
public static int onElementSelected(GuiFavorites screen, int var1) {
return screen.selectedWorld = var1;
}
public static int getSelectedWorld(GuiFavorites screen) {
return screen.selectedWorld;
}
public static GuiButton getSelectButton(GuiFavorites screen) {
return screen.buttonSelect;
}
public static GuiButton getDeleteButton(GuiFavorites screen) {
return screen.buttonDelete;
}
public static GuiButton getUpButton(GuiFavorites screen) {
return screen.buttonUp;
}
public static GuiButton getDownButton(GuiFavorites screen) {
return screen.buttonDown;
}
public static GuiButton getRenameButton(GuiFavorites screen) {
return screen.buttonRename;
}
public static String func_22087_f(GuiFavorites screen) {
return screen.field_22098_o;
}
public static DateFormat getDateFormatter(GuiFavorites screen) {
return screen.dateFormatter;
}
public static String func_22088_h(GuiFavorites screen) {
return screen.field_22097_p;
}
public static File getFavoriteServerFile() {
File favorites = new File(FileUtil.getCacheDirectory(), "favorites.txt");
if (!favorites.exists()) {
try {
favorites.createNewFile();
}
catch (IOException io) {io.printStackTrace();}
}
return favorites;
}
}