package openmods.gui.component.page; import java.awt.Desktop; import java.io.File; import java.io.IOException; import java.net.URI; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiConfirmOpenLink; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import openmods.Log; import openmods.gui.component.BaseComponent; import openmods.gui.component.BaseComposite; import openmods.gui.component.EmptyComposite; import openmods.gui.component.GuiComponentLabel; import openmods.gui.component.GuiComponentSprite; import openmods.gui.listener.IMouseDownListener; import openmods.utils.render.FakeIcon; import org.apache.logging.log4j.Level; public abstract class PageBase extends BaseComposite { public enum ActionIcon { YOUTUBE(FakeIcon.createSheetIcon(0, 236, 12, 8)), FOLDER(FakeIcon.createSheetIcon(12, 236, 12, 8)); private ActionIcon(IIcon icon) { this.icon = icon; } public final IIcon icon; } public static final PageBase BLANK_PAGE = new PageBase() {}; public static final ResourceLocation BOOK_TEXTURE = new ResourceLocation("openmodslib:textures/gui/book.png"); public PageBase() { super(0, 15); // x is set on page turn } @Override public int getWidth() { return 180; } @Override public int getHeight() { return 140; } @Override protected void renderComponentBackground(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY) {} public interface IConfirmListener { public void onConfirm(); } protected static BaseComponent createActionButton(int x, int y, final String link, IIcon icon, String text, final IConfirmListener listener) { EmptyComposite result = new EmptyComposite(x, y, 50, 8); GuiComponentLabel label = new GuiComponentLabel(15, 2, StatCollector.translateToLocal(text)); label.setScale(BookScaleConfig.getPageContentScale()); result.addComponent(label); GuiComponentSprite image = new GuiComponentSprite(0, 0, icon, BOOK_TEXTURE); result.addComponent(image); result.setListener(new IMouseDownListener() { @Override public void componentMouseDown(BaseComponent component, int x, int y, int button) { final Minecraft mc = Minecraft.getMinecraft(); if (mc.gameSettings.chatLinksPrompt) { final GuiScreen prevGui = mc.currentScreen; mc.displayGuiScreen(new GuiConfirmOpenLink(new GuiYesNoCallback() { @Override public void confirmClicked(boolean result, int id) { if (result) listener.onConfirm(); mc.displayGuiScreen(prevGui); } }, link, 0, false)); } else { listener.onConfirm(); } } }); return result; } public PageBase addActionButton(int x, int y, final String link, IIcon icon, String text) { addComponent(createActionButton(x, y, link.toString(), icon, text, new IConfirmListener() { @Override public void onConfirm() { final URI uri = URI.create(link); try { Desktop.getDesktop().browse(uri); } catch (IOException e) { Log.log(Level.INFO, e, "Failed to open URI '%s'", uri); } } })); return this; } public PageBase addActionButton(int x, int y, final File file, IIcon icon, String text) { addComponent(createActionButton(x, y, file.getAbsolutePath(), icon, text, new IConfirmListener() { @Override public void onConfirm() { try { Desktop.getDesktop().open(file); } catch (IOException e) { Log.log(Level.INFO, e, "Failed to open file '%s'", file.getAbsolutePath()); } } })); return this; } }