package openblocks.client.gui;
import com.google.common.collect.Lists;
import java.io.File;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.World;
import openblocks.OpenBlocks;
import openblocks.client.ChangelogBuilder;
import openblocks.client.ChangelogBuilder.Changelog;
import openblocks.client.ChangelogBuilder.ChangelogSection;
import openblocks.client.gui.page.IntroPage;
import openblocks.common.PlayerInventoryStore;
import openmods.Log;
import openmods.gui.ComponentGui;
import openmods.gui.DummyContainer;
import openmods.gui.component.BaseComposite;
import openmods.gui.component.GuiComponentBook;
import openmods.gui.component.page.PageBase;
import openmods.gui.component.page.PageBase.ActionIcon;
import openmods.gui.component.page.SectionPage;
import openmods.gui.component.page.TitledPage;
import openmods.infobook.PageBuilder;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
public class GuiInfoBook extends ComponentGui {
private GuiComponentBook book;
public GuiInfoBook() {
super(new DummyContainer(), 0, 0);
}
@Override
public void initGui() {
// Nothing can change this value, otherwise client will crash when player picks item
// this.mc.thePlayer.openContainer = this.inventorySlots;
this.guiLeft = (this.width - this.xSize) / 2;
this.guiTop = (this.height - this.ySize) / 2;
}
private static int alignToEven(final GuiComponentBook book) {
int index = book.getNumberOfPages();
if ((index & 1) == 1) {
book.addPage(PageBase.BLANK_PAGE);
index++;
}
return index;
}
@Override
public void handleKeyboardInput() {
super.handleKeyboardInput();
if (Keyboard.getEventKeyState()) {
switch (Keyboard.getEventKey()) {
case Keyboard.KEY_PRIOR:
book.prevPage();
break;
case Keyboard.KEY_NEXT:
book.nextPage();
break;
case Keyboard.KEY_HOME:
book.firstPage();
break;
case Keyboard.KEY_END:
book.lastPage();
break;
}
}
}
@Override
protected BaseComposite createRoot() {
book = new GuiComponentBook();
book.addPage(PageBase.BLANK_PAGE);
book.addPage(new IntroPage());
book.addPage(new TitledPage("openblocks.gui.credits.title", "openblocks.gui.credits.content"));
final TocPage contentsPage = new TocPage(book, Minecraft.getMinecraft().fontRenderer);
book.addPage(contentsPage);
{
addSectionPage(book, contentsPage, "openblocks.gui.blocks");
PageBuilder builder = new PageBuilder();
builder.includeModId(OpenBlocks.MODID);
builder.createBlockPages();
builder.insertTocPages(book, 4, 4, 1.5f);
alignToEven(book);
builder.insertPages(book);
}
{
addSectionPage(book, contentsPage, "openblocks.gui.items");
PageBuilder builder = new PageBuilder();
builder.includeModId(OpenBlocks.MODID);
builder.createItemPages();
builder.insertTocPages(book, 4, 4, 1.5f);
alignToEven(book);
builder.insertPages(book);
}
{
addSectionPage(book, contentsPage, "openblocks.gui.misc");
book.addPage(new TitledPage("openblocks.gui.config.title", "openblocks.gui.config.content"));
book.addPage(new TitledPage("openblocks.gui.restore_inv.title", "openblocks.gui.restore_inv.content")
.addActionButton(10, 133, getSavePath(), ActionIcon.FOLDER.icon, "openblocks.gui.save_folder"));
book.addPage(new TitledPage("openblocks.gui.bkey.title", "openblocks.gui.bkey.content"));
if (OpenBlocks.Enchantments.explosive != null) book.addPage(new TitledPage("openblocks.gui.unstable.title", "openblocks.gui.unstable.content"));
if (OpenBlocks.Enchantments.lastStand != null) book.addPage(new TitledPage("openblocks.gui.laststand.title", "openblocks.gui.laststand.content"));
if (OpenBlocks.Enchantments.flimFlam != null) book.addPage(new TitledPage("openblocks.gui.flimflam.title", "openblocks.gui.flimflam.content"));
}
{
addSectionPage(book, contentsPage, "openblocks.gui.changelogs");
createChangelogPages(book);
}
book.enablePages();
xSize = book.getWidth();
ySize = book.getHeight();
return book;
}
private static void addSectionPage(GuiComponentBook book, TocPage contentsPage, String sectionLabel) {
final int startIndex = alignToEven(book);
book.addPage(PageBase.BLANK_PAGE);
book.addPage(new SectionPage(sectionLabel));
contentsPage.addTocEntry(sectionLabel, startIndex, startIndex + 2);
}
private static File getSavePath() {
try {
MinecraftServer server = MinecraftServer.getServer();
if (server != null) {
World world = server.worldServerForDimension(0);
File saveFolder = PlayerInventoryStore.getSaveFolder(world);
return saveFolder;
}
} catch (Throwable t) {
Log.warn(t, "Failed to get save folder from local server");
}
try {
return Minecraft.getMinecraft().mcDataDir;
} catch (Throwable t) {
Log.warn(t, "Failed to get save folder from MC data dir");
}
return new File("invalid.path");
}
private static void createChangelogPages(final GuiComponentBook book) {
String prevVersion = null;
int prevIndex = 0;
List<ChangelogPage> prevPages = Lists.newArrayList();
final List<Changelog> changelogs = ChangelogBuilder.readChangeLogs();
for (int i = 0; i < changelogs.size(); i++) {
Changelog changelog = changelogs.get(i);
final String currentVersion = changelog.version;
int currentPage = book.getNumberOfPages();
for (ChangelogPage prevPage : prevPages)
prevPage.addNextVersionBookmark(book, currentVersion, currentPage);
prevPages.clear();
for (ChangelogSection section : changelog.sections) {
ChangelogPage page = new ChangelogPage(currentVersion, section.title, section.lines);
book.addPage(page);
prevPages.add(page);
if (i > 0) {
page.addPrevVersionBookmark(book, prevVersion, prevIndex);
}
}
alignToEven(book);
prevVersion = currentVersion;
prevIndex = currentPage;
}
}
@Override
public void drawScreen(int par1, int par2, float par3) {
super.drawScreen(par1, par2, par3);
prepareRenderState();
GL11.glPushMatrix();
root.renderOverlay(this.mc, this.guiLeft, this.guiTop, par1 - this.guiLeft, par2 - this.guiTop);
GL11.glPopMatrix();
restoreRenderState();
}
}