package me.escapeNT.pail.GUIComponents;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.border.TitledBorder;
import me.escapeNT.pail.Util.Localizable;
import me.escapeNT.pail.Util.Util;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Server;
import org.bukkit.entity.Player;
/**
* Panel containing the basic server controls.
* @author escapeNT
*/
public final class ServerControlPanel extends javax.swing.JPanel implements Localizable {
private HashMap<Object, ImageIcon> onlinePlayers = new HashMap<Object, ImageIcon>();
private IconListRenderer listModel = new IconListRenderer(onlinePlayers, true);
private JPopupMenu playerMenu = null;
private JMenuItem op;
private JMenuItem deop;
/** Creates new form ServerControlPanel */
public ServerControlPanel() {
initComponents();
Util.setServerControls(this);
playerList.setModel(new DefaultListModel());
playerList.setCellRenderer(listModel);
jScrollPane1.setBorder(new TitledBorder(Util.translate("Players")));
// Load images
ImageIcon plus = new ImageIcon(getClass().getResource("images/plus.png"));
ImageIcon arrow = new ImageIcon(getClass().getResource("images/right.png"));
ImageIcon kill = new ImageIcon(getClass().getResource("images/kill.png"));
ImageIcon up = new ImageIcon(getClass().getResource("images/up.png"));
ImageIcon down = new ImageIcon(getClass().getResource("images/down.png"));
ImageIcon msg = new ImageIcon(getClass().getResource("images/msg.png"));
ImageIcon kickico = new ImageIcon(getClass().getResource("images/kick.png"));
ImageIcon banico = new ImageIcon(getClass().getResource("images/ban.png"));
// Construct player popup menu
playerMenu = new JPopupMenu();
JMenuItem giveItem = new JMenuItem(Util.translate("Give Item"), plus);
giveItem.addActionListener(new GiveItemListener());
playerMenu.add(giveItem);
JMenuItem tele = new JMenuItem(Util.translate("Teleport"), arrow);
tele.addActionListener(new TeleportListener());
playerMenu.add(tele);
JMenuItem killPlayer = new JMenuItem(Util.translate("Kill"), kill);
killPlayer.addActionListener(new KillPlayerListener());
playerMenu.add(killPlayer);
op = new JMenuItem(Util.translate("Promote to OP"), up);
op.addActionListener(new OpPlayerListener());
playerMenu.add(op);
deop = new JMenuItem(Util.translate("Demote from OP"), down);
deop.addActionListener(new DeOpPlayerListener());
playerMenu.add(deop);
JMenuItem message = new JMenuItem(Util.translate("Message"), msg);
message.addActionListener(new MessagePlayerListener());
playerMenu.add(message);
JMenuItem kick = new JMenuItem(Util.translate("Kick"), kickico);
kick.addActionListener(new KickPlayerListener());
playerMenu.add(kick);
JMenuItem ban = new JMenuItem(Util.translate("Ban"), banico);
ban.addActionListener(new BanPlayerListener());
playerMenu.add(ban);
}
/** This method is called from within the constructor to
* initialize the form.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jScrollPane2 = new javax.swing.JScrollPane();
jEditorPane1 = new javax.swing.JEditorPane();
serverConsolePanel = new me.escapeNT.pail.GUIComponents.ServerConsolePanel();
jScrollPane1 = new javax.swing.JScrollPane();
playerList = new javax.swing.JList();
jScrollPane2.setViewportView(jEditorPane1);
serverConsolePanel.setPreferredSize(new java.awt.Dimension(640, 450));
playerList.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
playerList.setFocusable(false);
playerList.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
playerListMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
playerListMouseReleased(evt);
}
});
jScrollPane1.setViewportView(playerList);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.add(serverConsolePanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 640, Short.MAX_VALUE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 170, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(20, 20, 20)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, serverConsolePanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 450, Short.MAX_VALUE)
.add(org.jdesktop.layout.GroupLayout.TRAILING, jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 450, Short.MAX_VALUE))
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void playerListMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_playerListMousePressed
showPlayerMenu(evt);
}//GEN-LAST:event_playerListMousePressed
private void playerListMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_playerListMouseReleased
showPlayerMenu(evt);
}//GEN-LAST:event_playerListMouseReleased
private void showPlayerMenu(MouseEvent e) {
if(e.isPopupTrigger()) {
for(int i = 0; i < ((DefaultListModel) playerList.getModel()).getSize(); i++) {
Rectangle r = playerList.getCellBounds(i, i);
if(r.contains(e.getPoint())) {
playerList.setSelectedIndex(i);
Player p = Bukkit.getServer().getPlayer((String)playerList.getSelectedValue());
if(p.isOp()) {
op.setEnabled(false);
deop.setEnabled(true);
} else {
op.setEnabled(true);
deop.setEnabled(false);
}
playerMenu.show(playerList, e.getX(), e.getY());
break;
}
}
}
}
public void translateComponent() {}
private class GiveItemListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
new GiveItemView((String)playerList.getSelectedValue()).setVisible(true);
}
}
private class TeleportListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
new TeleportPlayerView(playerList.getSelectedValue().toString()).setVisible(true);
}
}
private class KillPlayerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Player p = Bukkit.getServer().getPlayer(playerList.getSelectedValue().toString());
p.setHealth(0);
}
}
private class OpPlayerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Server s = Bukkit.getServer();
s.dispatchCommand(Util.getConsoleSender(), "op " + playerList.getSelectedValue().toString());
}
}
private class DeOpPlayerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Server s = Bukkit.getServer();
s.dispatchCommand(Util.getConsoleSender(), "deop " + playerList.getSelectedValue().toString());
}
}
private class MessagePlayerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String msg = JOptionPane.showInputDialog(Util.getPlugin().getMainWindow(), Util.translate("Enter your message:"),
Util.translate("Message Player"), JOptionPane.QUESTION_MESSAGE);
if(msg == null) {
return;
}
Bukkit.getServer().getPlayer(playerList.getSelectedValue().toString()).sendMessage(ChatColor.LIGHT_PURPLE
+ "[Server]" + ChatColor.GRAY + " whispers: " + ChatColor.WHITE + msg);
}
}
private class KickPlayerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Server s = Bukkit.getServer();
String reason = JOptionPane.showInputDialog(Util.getPlugin().getMainWindow(), Util.translate("Enter kick reason:"),
Util.translate("Kick Player"), JOptionPane.QUESTION_MESSAGE);
if(reason == null) {
return;
}
reason = reason.replaceAll(" ", "_");
s.dispatchCommand(Util.getConsoleSender(), "kick " + playerList.getSelectedValue().toString() + " " + reason);
}
}
private class BanPlayerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Bukkit.getServer().dispatchCommand(Util.getConsoleSender(), "ban " + playerList.getSelectedValue().toString());
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JEditorPane jEditorPane1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JList playerList;
private me.escapeNT.pail.GUIComponents.ServerConsolePanel serverConsolePanel;
// End of variables declaration//GEN-END:variables
/**
* Returns the panel containing the console controls.
* @return the serverConsolePanel
*/
public me.escapeNT.pail.GUIComponents.ServerConsolePanel getServerConsolePanel() {
return serverConsolePanel;
}
/**
* Returns the list model for the player selection list.
* @return the listModel
*/
public DefaultListModel getListModel() {
return (DefaultListModel) playerList.getModel();
}
/**
* Adds a player and their face to the list.
* @param name The player name.
*/
public void addPlayer(String name) {
BufferedImage skin;
BufferedImage face;
try {
skin = ImageIO.read(new URL("http://www.minecraft.net/skin/" + name + ".png"));
face = skin.getSubimage(8, 8, 8, 8);
face = resize(face, 23, 23, true);
} catch (Exception ex) {
onlinePlayers.put(name, new ImageIcon());
playerList.setCellRenderer(new IconListRenderer(onlinePlayers, true));
getListModel().addElement(name);
return;
}
onlinePlayers.put(name, new ImageIcon(face));
playerList.setCellRenderer(new IconListRenderer(onlinePlayers, true));
getListModel().addElement(name);
}
private BufferedImage resize(Image originalImage,
int scaledWidth, int scaledHeight, boolean preserveAlpha) {
int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
Graphics2D g = scaledBI.createGraphics();
if(preserveAlpha) {
g.setComposite(AlphaComposite.Src);
}
g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();
return scaledBI;
}
}