package mcjty.rftools.blocks.security; import mcjty.lib.base.StyleConfig; 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.PositionalLayout; 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.minecraft.inventory.Slot; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import java.awt.*; public class GuiSecurityManager extends GenericGuiContainer<SecurityManagerTileEntity> { public static final int SECURITYMANAGER_WIDTH = 244; public static final int SECURITYMANAGER_HEIGHT = 206; private static final ResourceLocation iconLocation = new ResourceLocation(RFTools.MODID, "textures/gui/securitymanager.png"); private static final ResourceLocation guiElements = new ResourceLocation(RFTools.MODID, "textures/gui/guielements.png"); private WidgetList players; private Button addButton; private Button delButton; private TextField nameField; private ImageChoiceLabel blacklistMode; private TextField channelNameField; private int listDirty = 0; public static SecurityChannels.SecurityChannel channelFromServer = null; public GuiSecurityManager(SecurityManagerTileEntity securityManagerTileEntity, SecurityManagerContainer container) { super(RFTools.instance, RFToolsMessages.INSTANCE, securityManagerTileEntity, container, RFTools.GUI_MANUAL_MAIN, "security"); xSize = SECURITYMANAGER_WIDTH; ySize = SECURITYMANAGER_HEIGHT; } @Override public void initGui() { super.initGui(); players = new WidgetList(mc, this); Slider allowedPlayerSlider = new Slider(mc, this).setDesiredWidth(10).setVertical().setScrollable(players); Panel allowedPlayersPanel = new Panel(mc, this).setLayout(new HorizontalLayout().setHorizontalMargin(3).setSpacing(1)).addChild(players).addChild(allowedPlayerSlider). setLayoutHint(new PositionalLayout.PositionalHint(72, 5, SECURITYMANAGER_WIDTH - 76, 96)); nameField = new TextField(mc, this).setDesiredHeight(15); addButton = new Button(mc, this).setText("Add").setDesiredHeight(14).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(14).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().setHorizontalMargin(3).setSpacing(1)).addChild(nameField).addChild(addButton).addChild(delButton).setDesiredHeight(16). setLayoutHint(new PositionalLayout.PositionalHint(72, 100, SECURITYMANAGER_WIDTH - 76, 14)); channelNameField = new TextField(mc, this).setLayoutHint(new PositionalLayout.PositionalHint(8, 27, 60, 14)).addTextEvent(new TextEvent() { @Override public void textChanged(Widget parent, String newText) { updateChannelName(); } }); blacklistMode = new ImageChoiceLabel(mc, this).setLayoutHint(new PositionalLayout.PositionalHint(10, 44, 16, 16)).setTooltips("Black or whitelist mode").addChoiceEvent(new ChoiceEvent() { @Override public void choiceChanged(Widget parent, String newChoice) { updateSettings(); } }); blacklistMode.addChoice("White", "Whitelist players", guiElements, 15 * 16, 32); blacklistMode.addChoice("Black", "Blacklist players", guiElements, 14 * 16, 32); Widget toplevel = new Panel(mc, this).setBackground(iconLocation).setLayout(new PositionalLayout()).addChild(allowedPlayersPanel).addChild(buttonPanel).addChild(channelNameField). addChild(blacklistMode); toplevel.setBounds(new Rectangle(guiLeft, guiTop, xSize, ySize)); window = new Window(this, toplevel); Keyboard.enableRepeatEvents(true); channelFromServer = null; } private void requestInfoIfNeeded() { int id = getCardID(); if (id == -1) { return; } listDirty--; if (listDirty <= 0) { RFToolsMessages.INSTANCE.sendToServer(new PacketGetSecurityInfo(id)); listDirty = 20; } } private void updateChannelName() { listDirty = 20; // Make sure we don't request new info from server too fast String channelName = channelNameField.getText(); if (channelFromServer != null) { channelFromServer.setName(channelName); } sendServerCommand(RFToolsMessages.INSTANCE, SecurityManagerTileEntity.CMD_SETCHANNELNAME, new Argument("name", channelName)); } private void updateSettings() { listDirty = 20; // Make sure we don't request new info from server too fast boolean whitelist = blacklistMode.getCurrentChoiceIndex() == 0; if (channelFromServer != null) { channelFromServer.setWhitelist(whitelist); } sendServerCommand(RFToolsMessages.INSTANCE, SecurityManagerTileEntity.CMD_SETMODE, new Argument("whitelist", whitelist)); } 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).setText(player).setHorizontalAlignment(HorizontalAlignment.ALIGH_LEFT)); // } } private void addPlayer() { sendServerCommand(RFToolsMessages.INSTANCE, SecurityManagerTileEntity.CMD_ADDPLAYER, new Argument("player", nameField.getText())); } private void delPlayer() { sendServerCommand(RFToolsMessages.INSTANCE, SecurityManagerTileEntity.CMD_DELPLAYER, new Argument("player", nameField.getText())); } private int getCardID() { Slot slot = (Slot) inventorySlots.inventorySlots.get(SecurityManagerContainer.SLOT_CARD); if (slot.getHasStack()) { NBTTagCompound tagCompound = slot.getStack().getTagCompound(); if (tagCompound == null) { return -1; } if (tagCompound.hasKey("channel")) { return tagCompound.getInteger("channel"); } } return -1; } private void updateGui() { int id = getCardID(); blacklistMode.setEnabled(id != -1); players.setEnabled(id != -1); addButton.setEnabled(id != -1); delButton.setEnabled(id != -1); nameField.setEnabled(id != -1); channelNameField.setEnabled(id != -1); players.removeChildren(); if (id != -1 && channelFromServer != null) { channelNameField.setText(channelFromServer.getName()); blacklistMode.setCurrentChoice(channelFromServer.isWhitelist() ? 0 : 1); for (String player : channelFromServer.getPlayers()) { players.addChild(new Label(mc, this).setText(player).setColor(StyleConfig.colorTextInListNormal).setHorizontalAlignment(HorizontalAlignment.ALIGH_LEFT)); } } else { channelNameField.setText(""); } } @Override protected void drawGuiContainerBackgroundLayer(float v, int i, int i2) { updateGui(); drawWindow(); requestInfoIfNeeded(); } }