package com.aionemu.packetsamurai.gui.protocoleditor;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTabbedPane;
import com.aionemu.packetsamurai.protocol.Protocol;
import com.aionemu.packetsamurai.protocol.ProtocolManager;
@SuppressWarnings("serial")
/**
*
* @author Gilles Duboscq
*
*/
public class ProtocolEditor extends JDialog
{
private Protocol _currentProtocol;
private ProtocolTab _clientTab;
private ProtocolTab _serverTab;
private JMenu _protocolMenu;
private ProtocolEditorListener _pel;
public ProtocolEditor(JFrame frame)
{
super(frame);
setTitle("Packet Samurai - Protocol Editor");
setSize(800, 600);
setLayout(new BorderLayout());
_clientTab = new ProtocolTab();
_serverTab = new ProtocolTab();
//menus
JMenuBar menuBar = new JMenuBar();
//action listener
_pel = new ProtocolEditorListener(this);
// * File menu
JMenu fileMenu = new JMenu("File");
// * Reload Button
JMenuItem reloadButton = new JMenuItem("Reload");
reloadButton.setActionCommand("reload");
reloadButton.addActionListener(_pel);
// * Save Button
JMenuItem saveButton = new JMenuItem("Save");
saveButton.setActionCommand("save");
saveButton.addActionListener(_pel);
fileMenu.add(reloadButton);
fileMenu.add(saveButton);
// * Protocol menu
_protocolMenu = new JMenu("Chose Protocol");
loadProtocols();
JMenu editMenu = new JMenu("Edit");
JMenuItem protoPorpertyButton = new JMenuItem("Protocol Properties");
protoPorpertyButton.setActionCommand("properties");
protoPorpertyButton.addActionListener(_pel);
editMenu.add(protoPorpertyButton);
menuBar.add(fileMenu);
menuBar.add(_protocolMenu);
menuBar.add(editMenu );
setJMenuBar(menuBar);
// tabs
JTabbedPane tabPane = new JTabbedPane();
tabPane.add(_clientTab);
tabPane.add(_serverTab);
add(tabPane);
}
public Protocol getCurrentProtocol()
{
return _currentProtocol;
}
public void loadProtocols()
{
_protocolMenu.removeAll();
for(Protocol proto : ProtocolManager.getInstance().getProtocols())
{
JMenuItem protoButton = new JMenuItem(proto.getName()+" ("+proto.getPort()+")");
protoButton.setActionCommand("p:"+proto.getName());
protoButton.addActionListener(_pel);
_protocolMenu.add(protoButton);
}
JMenuItem newProtoButton = new JMenuItem("New Protocol...");
newProtoButton.setActionCommand("new");
newProtoButton.addActionListener(_pel);
_protocolMenu.addSeparator();
_protocolMenu.add(newProtoButton);
if(!ProtocolManager.getInstance().getProtocols().isEmpty())
switchToProtocol(ProtocolManager.getInstance().getProtocols().iterator().next());
else
switchToProtocol(null);
}
public void switchToProtocol(Protocol p)
{
if(p == null)
{
_currentProtocol = null;
_clientTab.changeFamilly(null);
_serverTab.changeFamilly(null);
}
else
{
_currentProtocol = p;
_clientTab.changeFamilly(p.getClientPacketsFamilly());
_serverTab.changeFamilly(p.getServerPacketsFamilly());
}
}
private static class ProtocolEditorListener implements ActionListener
{
private ProtocolEditor _pEditor;
public ProtocolEditorListener(ProtocolEditor pe)
{
_pEditor = pe;
}
public void actionPerformed(ActionEvent e)
{
String cmd = e.getActionCommand();
System.out.println(cmd);
if(cmd.startsWith("p:"))
{
String pName = cmd.substring(2);
_pEditor.switchToProtocol(ProtocolManager.getInstance().getProtocolByName(pName));
}
else if(cmd.equals("new"))
{
// dialog
}
else if(cmd.equals("properties"))
{
// dialog
}
else if(cmd.equals("save"))
{
Protocol currentProtocol = _pEditor.getCurrentProtocol();
if(currentProtocol != null)
currentProtocol.saveProtocol();
}
else if(cmd.equals("reload"))
{
ProtocolManager.getInstance().loadProtocols();
_pEditor.loadProtocols();
}
}
}
}