package org.ripple.power.ui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Label; 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.net.InetAddress; import java.net.UnknownHostException; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JToolBar; import org.ripple.power.config.LSystem; import org.ripple.power.server.chat.ChatMessage; import org.ripple.power.server.chat.MessageClient; import org.ripple.power.txns.NameFind; import org.ripple.power.txns.Updateable; import org.ripple.power.ui.view.ABaseDialog; import org.ripple.power.ui.view.EmptyBarBorder; 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.StringUtils; import org.ripple.power.utils.SwingUtils; import org.ripple.power.wallet.WalletItem; public class RPChatClientDialog extends ABaseDialog implements ActionListener { public class ConnectDialog extends JDialog { private static final long serialVersionUID = 6846926546259580685L; JPanel panelUserConf = new JPanel(); JButton save = new JButton(); JButton cancel = new JButton(); JLabel DLGINFO = new JLabel("Default set 127.0.0.1:9500"); JPanel panelSave = new JPanel(); JLabel message = new JLabel(); String userInputIp; int userInputPort; JTextField inputIp; JTextField inputPort; public ConnectDialog(Window parent, String ip, int port) { super(parent, ModalityType.DOCUMENT_MODAL); this.userInputIp = ip; this.userInputPort = port; try { init(); } catch (Exception e) { e.printStackTrace(); } Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation((int) (screenSize.width - 400) / 2 + 50, (int) (screenSize.height - 600) / 2 + 150); this.setResizable(false); } private void init() throws Exception { this.setSize(new Dimension(300, 130)); this.setTitle("Connection"); message.setText("Server IP:"); inputIp = new JTextField(10); inputIp.setText(userInputIp); inputPort = new JTextField(4); inputPort.setText("" + userInputPort); save.setText(UIMessage.save); cancel.setText(UIMessage.cancel); panelUserConf.setLayout(new GridLayout(2, 2, 1, 1)); panelUserConf.add(message); panelUserConf.add(inputIp); panelUserConf.add(new JLabel("Server Port:")); panelUserConf.add(inputPort); panelSave.add(new Label(" ")); panelSave.add(save); panelSave.add(cancel); panelSave.add(new Label(" ")); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(panelUserConf, BorderLayout.NORTH); contentPane.add(DLGINFO, BorderLayout.CENTER); contentPane.add(panelSave, BorderLayout.SOUTH); save.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent a) { int savePort; try { userInputIp = "" + InetAddress.getByName(inputIp.getText()); userInputIp = userInputIp.substring(1); } catch (UnknownHostException e) { return; } try { savePort = Integer.parseInt(inputPort.getText()); if (savePort < 1 || savePort > 65535) { inputPort.setText(""); return; } userInputPort = savePort; dispose(); } catch (NumberFormatException e) { inputPort.setText(""); return; } } }); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { DLGINFO.setText("Default set 127.0.0.1:9500"); } }); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DLGINFO.setText("Default set 127.0.0.1:9500"); dispose(); } }); } } /** * */ private static final long serialVersionUID = 6181331671740812664L; private String ip = "127.0.0.1"; private int port = 9500; private String userName = "Anonymous"; private int type = 0; private RPComboBox combobox; private RPTextArea messageShow; private JScrollPane messageScrollPane; private RPLabel express, sendToLabel, messageLabel; private RPTextBox clientMessage; private RPCheckBox checkbox; private RPComboBox actionlist; private RPCButton clientMessageButton; private JToolBar toolBar = new JToolBar(); private RPCButton loginButton; private RPCButton logoffButton; private RPCButton userButton; private RPCButton connectButton; private RPCButton exitButton; private Dimension faceSize = new Dimension(400, 600); private JPanel downPanel; public RPChatClientDialog(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); setVisible(true); this.pack(); } public void init() { Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); loginButton = new RPCButton("Login"); logoffButton = new RPCButton("Quit"); userButton = new RPCButton("Set User"); connectButton = new RPCButton("Set Connection"); exitButton = new RPCButton("Exit UI"); toolBar.setBackground(UIConfig.dialogbackground); toolBar.setBorder(new EmptyBarBorder()); toolBar.add(userButton); toolBar.add(connectButton); toolBar.addSeparator(); toolBar.add(loginButton); toolBar.add(logoffButton); toolBar.addSeparator(); toolBar.add(exitButton); contentPane.add(toolBar, BorderLayout.NORTH); checkbox = new RPCheckBox("Secret"); checkbox.setBackground(UIConfig.dialogbackground); checkbox.setSelected(false); actionlist = new RPComboBox(); actionlist.addItem("O(∩_∩)O"); actionlist.addItem(">_<|||"); actionlist.addItem("⊙﹏⊙‖"); actionlist.addItem("→_→"); actionlist.addItem("…(⊙_⊙;)…"); actionlist.addItem("( ^_^ )?"); actionlist.setSelectedIndex(0); loginButton.setEnabled(true); logoffButton.setEnabled(false); loginButton.addActionListener(this); logoffButton.addActionListener(this); userButton.addActionListener(this); connectButton.addActionListener(this); exitButton.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(); clientMessage = new RPTextBox(23); clientMessage.setEnabled(false); clientMessageButton = new RPCButton(); clientMessageButton.setText(UIMessage.send); clientMessageButton.setFont(UIRes.getFont()); clientMessage.addActionListener(this); clientMessageButton.addActionListener(this); sendToLabel = new RPLabel("Send To:"); express = new RPLabel("Face:"); messageLabel = new RPLabel("Message:"); downPanel = new JPanel(); downPanel .setPreferredSize(new Dimension((int) faceSize.getWidth(), 155)); downPanel.setLayout(null); downPanel.add(sendToLabel); sendToLabel.setBounds(10, 5, 70, 30); downPanel.add(combobox); combobox.setBounds(80, 5, 90, 30); downPanel.add(express); express.setBounds(190, 5, 90, 30); downPanel.add(actionlist); actionlist.setBounds(240, 5, 110, 30); downPanel.add(checkbox); checkbox.setBounds(5, 35, 70, 30); downPanel.add(messageLabel); messageLabel.setBounds(10, 65, 70, 30); downPanel.add(clientMessage); clientMessage.setBounds(80, 65, (int) faceSize.getWidth() - 90, 30); downPanel.add(clientMessageButton); clientMessageButton.setBounds(80, 115, 90, 30); contentPane.add(messageScrollPane, BorderLayout.CENTER); contentPane.add(downPanel, BorderLayout.SOUTH); messageScrollPane.setBackground(UIConfig.dialogbackground); downPanel.setBackground(UIConfig.dialogbackground); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (type == 1) { disConnect(); } SwingUtils.close(RPChatClientDialog.this); } }); } public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == userButton) { Updateable update = new Updateable() { @Override public void action(Object o) { Updateable call = new Updateable() { @Override public void action(Object o) { if (o != null && o instanceof WalletItem) { WalletItem item = (WalletItem) o; userName = item.getPublicKey(); try { String tmp = NameFind.getName(userName); if (!StringUtils.isEmpty(tmp)) { userName = tmp; } } catch (Exception e) { } if (userName.length() > 20) { userName = userName.substring(0, 19) + "..."; } } } }; RPSelectWalletDialog.showDialog("Select Address", RPChatClientDialog.this, call); } }; LSystem.postThread(update); } else if (obj == connectButton) { ConnectDialog conConf = new ConnectDialog(this, ip, port); conConf.setVisible(true); ip = conConf.userInputIp; port = conConf.userInputPort; } else if (obj == loginButton) { connect(); } else if (obj == logoffButton) { disConnect(); } else if (obj == clientMessage || obj == clientMessageButton) { sendMessage(); clientMessage.setText(""); } else if (obj == exitButton) { int j = UIRes.showConfirmMessage(this,"Exit", "Want to quit?", "YES", "NO"); if (j == 0) { if (type == 1) { disConnect(); } SwingUtils.close(this); } } } private MessageClient client; public void connect() { Updateable update = new Updateable() { @Override public void action(Object o) { Updateable call = new Updateable() { @Override public void action(Object o) { if (o != null && o instanceof WalletItem) { WalletItem item = (WalletItem) o; userName = item.getPublicKey(); try { String tmp = NameFind.getName(userName); if (!StringUtils.isEmpty(tmp)) { userName = tmp; } } catch (Exception e) { } if (userName.length() > 20) { userName = userName.substring(0, 19) + "..."; } } client = new MessageClient(); loginButton.setEnabled(false); userButton.setEnabled(false); connectButton.setEnabled(false); logoffButton.setEnabled(true); clientMessage.setEnabled(true); messageShow.append("connect to server success\n"); type = 1; new Thread(new Runnable() { @Override public void run() { try { client.init(userName, messageShow, ip, port, combobox); } catch (Exception e) { alert(e.getMessage()); } } }).start(); } }; RPSelectWalletDialog.showDialog("Select Address", RPChatClientDialog.this, call); } }; LSystem.postThread(update); } public void disConnect() { loginButton.setEnabled(true); userButton.setEnabled(true); connectButton.setEnabled(true); logoffButton.setEnabled(false); clientMessage.setEnabled(false); try { client.destory(); messageShow.append("Has been disconnected from the server\n"); type = 0; } catch (Exception e) { e.printStackTrace(); } } public void sendMessage() { if (client == null) { connect(); return; } String toSomebody = combobox.getSelectedItem().toString(); short channelType = 1; String status = ""; if (checkbox.isSelected()) { status = "Secret"; } String action = actionlist.getSelectedItem().toString(); String message = clientMessage.getText(); message = action + message; switch (toSomebody) { case "all": channelType = 2; break; default: message = status + message; break; } try { ChatMessage chat = new ChatMessage(channelType, message, userName, toSomebody); client.write(chat); } catch (Exception e) { e.printStackTrace(); } } }