package mcjty.rftools.blocks.teleporter; import mcjty.lib.base.StyleConfig; import mcjty.lib.container.EmptyContainer; import mcjty.lib.container.GenericGuiContainer; import mcjty.lib.gui.Window; import mcjty.lib.gui.events.ButtonEvent; import mcjty.lib.gui.events.ChoiceEvent; import mcjty.lib.gui.events.TextEvent; import mcjty.lib.gui.layout.HorizontalAlignment; import mcjty.lib.gui.layout.HorizontalLayout; import mcjty.lib.gui.layout.VerticalLayout; import mcjty.lib.gui.widgets.Button; import mcjty.lib.gui.widgets.*; import mcjty.lib.gui.widgets.Label; import mcjty.lib.gui.widgets.Panel; import mcjty.lib.gui.widgets.TextField; import mcjty.lib.network.Argument; import mcjty.rftools.RFTools; import mcjty.rftools.network.RFToolsMessages; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.input.Keyboard; import java.awt.*; import java.util.*; import java.util.List; public class GuiMatterReceiver extends GenericGuiContainer<MatterReceiverTileEntity> { public static final int MATTER_WIDTH = 180; public static final int MATTER_HEIGHT = 160; public static final String ACCESS_PRIVATE = "Private"; public static final String ACCESS_PUBLIC = "Public"; private EnergyBar energyBar; private ChoiceLabel privateSetting; private WidgetList allowedPlayers; private Button addButton; private Button delButton; private TextField nameField; // A copy of the players we're currently showing. private java.util.List<String> players = null; private int listDirty = 0; private static Set<String> fromServer_allowedPlayers = new HashSet<String>(); public static void storeAllowedPlayersForClient(List<PlayerName> players) { Set<String> p = new HashSet<String>(); for (PlayerName n : players) { p.add(n.getName()); } fromServer_allowedPlayers = p; } public GuiMatterReceiver(MatterReceiverTileEntity matterReceiverTileEntity, EmptyContainer container) { super(RFTools.instance, RFToolsMessages.INSTANCE, matterReceiverTileEntity, container, RFTools.GUI_MANUAL_MAIN, "tpreceiver"); matterReceiverTileEntity.setCurrentRF(matterReceiverTileEntity.getEnergyStored(ForgeDirection.DOWN)); xSize = MATTER_WIDTH; ySize = MATTER_HEIGHT; } @Override public void initGui() { super.initGui(); int maxEnergyStored = tileEntity.getMaxEnergyStored(ForgeDirection.DOWN); energyBar = new EnergyBar(mc, this).setFilledRectThickness(1).setHorizontal().setDesiredHeight(12).setDesiredWidth(80).setMaxValue(maxEnergyStored).setShowText(false); energyBar.setValue(tileEntity.getCurrentRF()); TextField textField = new TextField(mc, this).setTooltips("Use this name to", "identify this receiver", "in the dialer").addTextEvent(new TextEvent() { @Override public void textChanged(Widget parent, String newText) { setReceiverName(newText); } }); textField.setText(tileEntity.getName()); Panel namePanel = new Panel(mc, this).setLayout(new HorizontalLayout()).addChild(new Label(mc, this).setText("Name:")).addChild(textField).setDesiredHeight(16); privateSetting = new ChoiceLabel(mc, this).addChoices(ACCESS_PUBLIC, ACCESS_PRIVATE).setDesiredHeight(14).setDesiredWidth(60). setChoiceTooltip(ACCESS_PUBLIC, "Everyone can dial to this receiver"). setChoiceTooltip(ACCESS_PRIVATE, "Only people in the access list below", "can dial to this receiver"). addChoiceEvent(new ChoiceEvent() { @Override public void choiceChanged(Widget parent, String newChoice) { changeAccessMode(newChoice); } }); if (tileEntity.isPrivateAccess()) { privateSetting.setChoice(ACCESS_PRIVATE); } else { privateSetting.setChoice(ACCESS_PUBLIC); } Panel privatePanel = new Panel(mc, this).setLayout(new HorizontalLayout()).addChild(new Label(mc, this).setText("Access:")).addChild(privateSetting).setDesiredHeight(16); allowedPlayers = new WidgetList(mc, this); Slider allowedPlayerSlider = new Slider(mc, this).setDesiredWidth(10).setVertical().setScrollable(allowedPlayers); Panel allowedPlayersPanel = new Panel(mc, this).setLayout(new HorizontalLayout().setHorizontalMargin(3).setSpacing(1)).addChild(allowedPlayers).addChild(allowedPlayerSlider) .setFilledBackground(0xff9e9e9e); nameField = new TextField(mc, this); addButton = new Button(mc, this).setText("Add").setDesiredHeight(13).setDesiredWidth(34).setTooltips("Add a player to the access list"). addButtonEvent(new ButtonEvent() { @Override public void buttonClicked(Widget parent) { addPlayer(); } }); delButton = new Button(mc, this).setText("Del").setDesiredHeight(13).setDesiredWidth(34).setTooltips("Remove the selected player", "from the access list"). addButtonEvent(new ButtonEvent() { @Override public void buttonClicked(Widget parent) { delPlayer(); } }); Panel buttonPanel = new Panel(mc, this).setLayout(new HorizontalLayout()).addChild(nameField).addChild(addButton).addChild(delButton).setDesiredHeight(16); Widget toplevel = new Panel(mc, this).setFilledRectThickness(2).setLayout(new VerticalLayout().setHorizontalMargin(3).setVerticalMargin(3).setSpacing(1)). addChild(energyBar).addChild(namePanel).addChild(privatePanel).addChild(allowedPlayersPanel).addChild(buttonPanel); toplevel.setBounds(new Rectangle(guiLeft, guiTop, MATTER_WIDTH, MATTER_HEIGHT)); window = new Window(this, toplevel); Keyboard.enableRepeatEvents(true); listDirty = 0; requestPlayers(); tileEntity.requestRfFromServer(RFToolsMessages.INSTANCE); } private void setReceiverName(String text) { sendServerCommand(RFToolsMessages.INSTANCE, MatterReceiverTileEntity.CMD_SETNAME, new Argument("name", text)); } private void changeAccessMode(String newAccess) { sendServerCommand(RFToolsMessages.INSTANCE, MatterReceiverTileEntity.CMD_SETPRIVATE, new Argument("private", ACCESS_PRIVATE.equals(newAccess))); } private void addPlayer() { sendServerCommand(RFToolsMessages.INSTANCE, MatterReceiverTileEntity.CMD_ADDPLAYER, new Argument("player", nameField.getText())); listDirty = 0; } private void delPlayer() { sendServerCommand(RFToolsMessages.INSTANCE, MatterReceiverTileEntity.CMD_DELPLAYER, new Argument("player", players.get(allowedPlayers.getSelected()))); listDirty = 0; } private void requestPlayers() { RFToolsMessages.INSTANCE.sendToServer(new PacketGetPlayers(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, MatterReceiverTileEntity.CMD_GETPLAYERS, MatterReceiverTileEntity.CLIENTCMD_GETPLAYERS)); } private void populatePlayers() { List<String> newPlayers = new ArrayList<String>(fromServer_allowedPlayers); Collections.sort(newPlayers); if (newPlayers.equals(players)) { return; } players = new ArrayList<String>(newPlayers); allowedPlayers.removeChildren(); for (String player : players) { allowedPlayers.addChild(new Label(mc, this).setColor(StyleConfig.colorTextInListNormal).setText(player).setHorizontalAlignment(HorizontalAlignment.ALIGH_LEFT)); } } private void requestListsIfNeeded() { listDirty--; if (listDirty <= 0) { requestPlayers(); listDirty = 20; } } @Override protected void drawGuiContainerBackgroundLayer(float v, int i, int i2) { requestListsIfNeeded(); populatePlayers(); enableButtons(); drawWindow(); int currentRF = tileEntity.getCurrentRF(); energyBar.setValue(currentRF); tileEntity.requestRfFromServer(RFToolsMessages.INSTANCE); } private void enableButtons() { boolean isPrivate = ACCESS_PRIVATE.equals(privateSetting.getCurrentChoice()); allowedPlayers.setEnabled(isPrivate); nameField.setEnabled(isPrivate); int isPlayerSelected = allowedPlayers.getSelected(); delButton.setEnabled(isPrivate && (isPlayerSelected != -1)); String name = nameField.getText(); addButton.setEnabled(isPrivate && name != null && !name.isEmpty()); } }