package org.ripple.power.ui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigDecimal;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import org.ripple.power.server.P2PServer;
import org.ripple.power.server.Node;
import org.ripple.power.server.LinkList;
import org.ripple.power.server.chat.ChatMessage;
import org.ripple.power.ui.view.ABaseDialog;
import org.ripple.power.ui.view.EmptyBarBorder;
import org.ripple.power.ui.view.RPInput;
import org.ripple.power.ui.view.RPLabel;
import org.ripple.power.ui.view.RPTextArea;
import org.ripple.power.ui.view.RPTextBox;
import org.ripple.power.utils.IP46Utils;
import org.ripple.power.utils.StringUtils;
import org.ripple.power.utils.SwingUtils;
public class RPChatServerDialog extends ABaseDialog implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 7290977209186202673L;
public static int port = 9500;
private RPComboBox combobox;
private RPTextArea messageShow;
private JScrollPane messageScrollPane;
private RPLabel sendToLabel, messageLabel;
private RPTextBox sysMessage;
private RPCButton sysMessageButton;
private LinkList userLinkList;
private JToolBar toolBar = new JToolBar();
private RPCButton portSet;
private RPCButton startServer;
private RPCButton stopServer;
private RPCButton myIP;
private RPCButton exitButton;
private Dimension faceSize = new Dimension(400, 600);
private JPanel downPanel;
private static P2PServer server;
public RPChatServerDialog(String title, Window parent) {
super(parent, title, ModalityType.MODELESS);
this.setIconImage(UIRes.getIcon());
this.init();
this.setSize(faceSize);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int) (screenSize.width - faceSize.getWidth()) / 2,
(int) (screenSize.height - faceSize.getHeight()) / 2);
this.setResizable(false);
this.pack();
setVisible(true);
}
public void init() {
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
portSet = new RPCButton("Set Port");
startServer = new RPCButton("Start Server");
stopServer = new RPCButton("Stop Server");
myIP = new RPCButton("My IP");
exitButton = new RPCButton("Exit UI");
toolBar.setBorder(new EmptyBarBorder());
toolBar.setBackground(UIConfig.dialogbackground);
toolBar.add(portSet);
toolBar.addSeparator();
toolBar.add(startServer);
toolBar.addSeparator();
toolBar.add(stopServer);
toolBar.addSeparator();
toolBar.add(myIP);
toolBar.addSeparator();
toolBar.add(exitButton);
contentPane.add(toolBar, BorderLayout.NORTH);
stopServer.setEnabled(false);
portSet.addActionListener(this);
startServer.addActionListener(this);
stopServer.addActionListener(this);
exitButton.addActionListener(this);
myIP.addActionListener(this);
combobox = new RPComboBox();
combobox.insertItemAt("all", 0);
combobox.setSelectedIndex(0);
messageShow = new RPTextArea();
messageShow.setEditable(false);
messageScrollPane = new JScrollPane(messageShow,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
messageScrollPane.setPreferredSize(new Dimension(400, 400));
messageScrollPane.revalidate();
sysMessage = new RPTextBox(24);
sysMessage.setEnabled(false);
sysMessageButton = new RPCButton();
sysMessageButton.setText(UIMessage.send);
sysMessageButton.setFont(UIRes.getFont());
sysMessage.addActionListener(this);
sysMessageButton.addActionListener(this);
sendToLabel = new RPLabel("Send To:");
messageLabel = new RPLabel("Message:");
downPanel = new JPanel();
downPanel
.setPreferredSize(new Dimension((int) faceSize.getWidth(), 125));
downPanel.setLayout(null);
downPanel.add(sendToLabel);
sendToLabel.setBounds(10, 5, 70, 30);
downPanel.add(combobox);
combobox.setBounds(80, 5, 90, 30);
downPanel.add(messageLabel);
messageLabel.setBounds(10, 45, 90, 30);
downPanel.add(sysMessage);
sysMessage.setBounds(80, 45, (int) faceSize.getWidth() - 90, 30);
downPanel.add(sysMessageButton);
sysMessageButton.setBounds(80, 85, 90, 30);
contentPane.add(messageScrollPane, BorderLayout.CENTER);
contentPane.add(downPanel, BorderLayout.SOUTH);
messageScrollPane.setBackground(UIConfig.dialogbackground);
downPanel.setBackground(UIConfig.dialogbackground);
contentPane.setBackground(UIConfig.dialogbackground);
if (server == null) {
server = new P2PServer(combobox, sysMessage);
}
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
SwingUtils.close(RPChatServerDialog.this);
}
});
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == startServer) {
startService();
} else if (obj == stopServer) {
int j = UIRes.showConfirmMessage(this,"Stop Server", "Stop the service ?",
"YES",
"NO");
if (j == 0) {
stopService();
}
} else if (obj == portSet) {
RPInput input = new RPInput();
RPInput.TextInputListener in = new RPInput.TextInputListener() {
@Override
public void input(String text) {
if (StringUtils.isNumber(text)) {
RPChatServerDialog.port = new BigDecimal(text)
.intValue();
}
}
@Override
public void canceled() {
}
};
input.getBigTextInput(in, "Open Port", String.valueOf(port),
new Object[] { UIMessage.ok });
} else if (obj == exitButton) {
int j = UIRes.showConfirmMessage(this,"Exit", "Want to quit ?",
"YES",
"NO");
if (j == 0) {
stopService();
SwingUtils.close(this);
}
} else if (obj == sysMessage || obj == sysMessageButton) {
sendSystemMessage();
} else if (obj == myIP) {
try {
info("Net IP:" + IP46Utils.getLocalIP());
} catch (Exception exc) {
}
}
}
public void startService() {
userLinkList = new LinkList();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
server.connect(port, userLinkList);
} catch (Exception e) {
e.printStackTrace();
}
}
});
t.start();
messageShow.append("The server has started, port: " + port + "\n");
startServer.setEnabled(false);
portSet.setEnabled(false);
stopServer.setEnabled(true);
sysMessage.setEnabled(true);
}
public void stopService() {
try {
if (userLinkList != null) {
int count = userLinkList.getCount();
int i = 0;
while (i < count) {
Node node = userLinkList.findUser(i);
node.channel.close();
i++;
}
}
stopServer.setEnabled(false);
startServer.setEnabled(true);
portSet.setEnabled(true);
sysMessage.setEnabled(false);
messageShow.append("The server has been shutdown\n");
combobox.removeAllItems();
combobox.addItem("all");
server.stopServer();
} catch (Exception e) {
e.printStackTrace();
}
}
public void sendSystemMessage() {
String toSomebody = combobox.getSelectedItem().toString();
String message = sysMessage.getText() + "\n";
messageShow.append(message);
ChatMessage chat = new ChatMessage((short) 2, message, UIMessage.info,
toSomebody);
if (toSomebody.equalsIgnoreCase("all")) {
server.broadcasts(chat);
} else {
Node node = userLinkList.findUser(toSomebody);
if (node == null) {
alert("user[" + toSomebody + "] not found");
} else {
node.channel.writeAndFlush(chat);
}
sysMessage.setText("");
}
}
}