package com.skcraft.playblock.media; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiTextField; import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import com.skcraft.playblock.util.GuiScrollbar; import com.skcraft.playblock.util.StringUtils; public class GuiSearch extends GuiScreen { private static final int xSize = 247; private static final int ySize = 165; private static final int RESULTS_PER_PAGE = 15; private static final int SHOWN_RESULTS = 3; private GuiButton searchButton; private GuiTextField queryField; private GuiScrollbar scrollbar; private final List<SearchResult> searchResults = new ArrayList<SearchResult>(); private SearchResult selectedResult; private Media[] mediaResults; private boolean errorOccured = false; /** * Adds the buttons (and other controls) to the screen in question. */ @Override public void initGui() { this.buttonList.clear(); Keyboard.enableRepeatEvents(true); int left = (width - xSize) / 2; int top = (height - ySize) / 2; buttonList.add(searchButton = new GuiButton(0, left + 179, top + 14, 43, 20, StringUtils.translate("gui.search"))); queryField = new GuiTextField(fontRendererObj, left + 38, top + 19, 150, fontRendererObj.FONT_HEIGHT + 5); queryField.setVisible(true); queryField.setMaxStringLength(100); queryField.setEnableBackgroundDrawing(true); queryField.setCanLoseFocus(true); queryField.setFocused(false); queryField.setEnableBackgroundDrawing(false); scrollbar = new GuiScrollbar(mc, left + 217, top + 44, 114, 0, ySize + 1, 8, 15, "playblock:textures/gui/search_bg.png"); } /** * Draws the screen and all the components in it. */ @Override public void drawScreen(int mouseX, int mouseY, float par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); mc.renderEngine.bindTexture(new ResourceLocation("playblock:textures/gui/search_bg.png")); int left = (width - xSize) / 2; int top = (height - ySize) / 2; drawTexturedModalRect(left, top, 0, 0, xSize, ySize); queryField.drawTextBox(); if (!scrollbar.isEnabled() && searchResults.size() / (float) SHOWN_RESULTS > 1) { scrollbar.setEnabled(true); } else if (scrollbar.isEnabled() && searchResults.size() / (float) SHOWN_RESULTS < 1) { scrollbar.setEnabled(false); } if (errorOccured) { fontRendererObj.drawString("An error has occured!", left + 70, top + 50, 14737632); } scrollbar.drawScrollbar(mouseX, mouseY); renderResults(left, top); super.drawScreen(mouseX, mouseY, par3); } @Override public void actionPerformed(GuiButton button) { if (button.id == searchButton.id) { search(); } } @Override public void handleMouseInput() { super.handleMouseInput(); scrollbar.handleMouseInput(searchResults.size(), SHOWN_RESULTS); } @Override protected void keyTyped(char key, int keycode) { super.keyTyped(key, keycode); if (queryField.isFocused()) { queryField.textboxKeyTyped(key, keycode); if (keycode == 28 || keycode == 156) { search(); } } } @Override protected void mouseClicked(int x, int y, int buttonClicked) { super.mouseClicked(x, y, buttonClicked); int unseenSlots = searchResults.size() - SHOWN_RESULTS; int startIndex = (int) (scrollbar.getCurrentScroll() * unseenSlots + 0.5); if (!searchResults.isEmpty()) { for (int i = startIndex; i < startIndex + SHOWN_RESULTS; i++) { if (i < searchResults.size()) { searchResults.get(i).mouseClicked(x, y, buttonClicked); } } } queryField.mouseClicked(x, y, buttonClicked); } public void setSelectedResult(SearchResult newSelected) { for (SearchResult result : searchResults) { if (result != newSelected) { result.setSelected(false); } else { result.setSelected(true); } } selectedResult = newSelected; } private void addResult(Media media) { searchResults.add(new SearchResult(this, media, mc)); } private void renderResults(int left, int top) { if (searchResults.isEmpty()) { return; } int unseenSlots = searchResults.size() - SHOWN_RESULTS; int startIndex = (int) (scrollbar.getCurrentScroll() * unseenSlots + 0.5); for (int i = startIndex; i < startIndex + SHOWN_RESULTS; i++) { if (i < searchResults.size()) { searchResults.get(i).drawResult(i - startIndex, left, top); } } } private void search() { if (!queryField.getText().isEmpty()) { errorOccured = false; scrollbar.setCurrentScroll(0); searchResults.clear(); YouTube yt = new YouTube(); try { mediaResults = yt.search(queryField.getText(), 1, RESULTS_PER_PAGE); for (int i = 0; i < mediaResults.length; i++) { addResult(mediaResults[i]); } } catch (IOException e) { errorOccured = true; } } } @Override public void onGuiClosed() { Keyboard.enableRepeatEvents(false); } @Override public boolean doesGuiPauseGame() { return false; } }