import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class KaZaGUI extends JFrame { private ActionEventHandler m_handler; private KaZaClient m_client; private KaZaServer m_server; private Thread m_serverThread; private javax.swing.Timer m_timer; /* client tab components */ private JButton m_browseButton; private JButton m_connectButton; private JButton m_closeButton; private JButton m_searchButton; private JTextField m_userNameField; private JTextField m_shareFolderField; private JLabel m_statusLabel; private JTextField m_serverNameField; private JTextField m_queryField; private JComboBox m_speedCombo; /* server tab components */ private JLabel m_serverClientsLabel; private JLabel m_serverStatusLabel; private JButton m_serverStartButton; public KaZaGUI() { super("Josh's KaZa application for CS654!"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(600, 400); setVisible(true); m_handler = new ActionEventHandler(this); Container c = getContentPane(); JTabbedPane pane = new JTabbedPane(); c.add(pane); JPanel clientPanel = getClientPanel(); pane.add("Client", clientPanel); JPanel transferPanel = getTransferPanel(); pane.add("Transfers", transferPanel); JPanel serverPanel = getServerPanel(); pane.add("Server", serverPanel); m_timer = new javax.swing.Timer(1000, m_handler); m_timer.start(); } private class ActionEventHandler implements ActionListener { private KaZaGUI m_kg; public ActionEventHandler(KaZaGUI kg) { m_kg = kg; } public void actionPerformed(ActionEvent e) { if (e.getSource() == m_browseButton) { JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); fc.showOpenDialog(m_kg); m_shareFolderField.setText(fc.getSelectedFile().getAbsolutePath()); } else if (e.getSource() == m_closeButton) { System.exit(0); } else if (e.getSource() == m_connectButton) { ConnectionSpeed cs = (ConnectionSpeed) m_speedCombo.getSelectedItem(); m_client = new KaZaClient(m_userNameField.getText(), cs.getKbps(), m_shareFolderField.getText(), m_serverNameField.getText()); if (m_client.connected()) { m_statusLabel.setText("Connected to " + m_serverNameField.getText()); m_connectButton.setEnabled(false); } else { m_statusLabel.setText("Could not connect to " + m_serverNameField.getText() + "!"); m_client = null; } } else if (e.getSource() == m_serverStartButton) { if (m_server == null) { m_server = new KaZaServer(); m_serverThread = new Thread(m_server); m_serverThread.start(); m_serverStatusLabel.setText("MNH Server Running"); m_serverStartButton.setEnabled(false); } } else if (e.getSource() == m_searchButton) { if ( m_client != null && m_client.connected() && (!m_queryField.getText().trim().equals("")) ) { Vector results = m_client.performSearch(m_queryField.getText()); for (KaZaClient.SearchResult r : results) { System.out.println("Result: " + r.peerAddress + ", " + r.userName + ", " + r.fileName + ", " + r.fileDescription); } } } else if (e.getSource() == m_timer) { if (m_server != null) { Object[] clients = m_server.getClientList(); String caption = "Clients (" + clients.length + "): "; boolean first = true; for (Object o : clients) { String s = (String) o; if (!first) caption += ", "; caption += s; first = false; } m_serverClientsLabel.setText(caption); } } } } private class ConnectionSpeed { private String m_caption; private int m_kbps; public ConnectionSpeed(String caption, int kbps) { m_caption = caption; m_kbps = kbps; } public String toString() { return m_caption; } public int getKbps() { return m_kbps; } } private JPanel getClientPanel() { m_shareFolderField = new JTextField(); m_browseButton = new JButton("..."); m_browseButton.addActionListener(m_handler); m_serverNameField = new JTextField(); m_statusLabel = new JLabel(); m_connectButton = new JButton("Connect"); m_connectButton.addActionListener(m_handler); m_closeButton = new JButton("Exit"); m_closeButton.addActionListener(m_handler); m_searchButton = new JButton("Search"); m_searchButton.addActionListener(m_handler); Vector speeds = new Vector(); speeds.add(new ConnectionSpeed("Modem", 50)); speeds.add(new ConnectionSpeed("768 Kbps", 768)); speeds.add(new ConnectionSpeed("1.5 Mbps", 1500)); speeds.add(new ConnectionSpeed("3 Mbps", 3000)); speeds.add(new ConnectionSpeed("6 Mbps", 6000)); speeds.add(new ConnectionSpeed("10 Mbps", 10000)); speeds.add(new ConnectionSpeed("45 Mbps", 45000)); speeds.add(new ConnectionSpeed("100 Mbps", 100000)); speeds.add(new ConnectionSpeed("1 Gbps", 1000000)); speeds.add(new ConnectionSpeed("10 Gbps", 10000000)); m_speedCombo = new JComboBox(speeds); m_speedCombo.setSelectedIndex(3); m_userNameField = new JTextField(); m_queryField = new JTextField(); JPanel clientPanel = new JPanel(); clientPanel.setLayout(new BoxLayout(clientPanel, BoxLayout.Y_AXIS)); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(new JLabel("User name: ")); p.add(m_userNameField); clientPanel.add(p); p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(new JLabel("Connection speed: ")); p.add(m_speedCombo); clientPanel.add(p); p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(new JLabel("Shared folder: ")); p.add(m_shareFolderField); p.add(m_browseButton); clientPanel.add(p); p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(new JLabel("Server: ")); p.add(m_serverNameField); clientPanel.add(p); p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(new JLabel("Search query: ")); p.add(m_queryField); p.add(m_searchButton); clientPanel.add(p); clientPanel.add(new Box.Filler(new Dimension(0, 0), new Dimension(0, Short.MAX_VALUE), new Dimension(Short.MAX_VALUE, Short.MAX_VALUE))); p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(m_statusLabel); p.add(new Box.Filler(new Dimension(0, 0), new Dimension(Short.MAX_VALUE, 0), new Dimension(Short.MAX_VALUE, Short.MAX_VALUE))); p.add(m_connectButton); p.add(new Box.Filler(new Dimension(8, 0), new Dimension(8, 0), new Dimension(8, Short.MAX_VALUE))); p.add(m_closeButton); clientPanel.add(p); return clientPanel; } private JPanel getTransferPanel() { JPanel transferPanel = new JPanel(); transferPanel.setLayout(new BoxLayout(transferPanel, BoxLayout.Y_AXIS)); transferPanel.add(new JLabel("Transfers:")); transferPanel.add(new Box.Filler(new Dimension(0, 0), new Dimension(0, Short.MAX_VALUE), new Dimension(0, Short.MAX_VALUE))); return transferPanel; } private JPanel getServerPanel() { m_serverStatusLabel = new JLabel(); m_serverStartButton = new JButton("Start MNH Server"); m_serverStartButton.addActionListener(m_handler); m_serverClientsLabel = new JLabel("No Clients"); JPanel serverPanel = new JPanel(); serverPanel.setLayout(new BoxLayout(serverPanel, BoxLayout.Y_AXIS)); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(m_serverClientsLabel); p.add(new Box.Filler(new Dimension(0, 0), new Dimension(Short.MAX_VALUE, 0), new Dimension(Short.MAX_VALUE, Short.MAX_VALUE))); serverPanel.add(p); serverPanel.add(new Box.Filler(new Dimension(0, 0), new Dimension(0, Short.MAX_VALUE), new Dimension(Short.MAX_VALUE, Short.MAX_VALUE))); p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(m_serverStatusLabel); p.add(new Box.Filler(new Dimension(0, 0), new Dimension(Short.MAX_VALUE, 0), new Dimension(Short.MAX_VALUE, Short.MAX_VALUE))); p.add(m_serverStartButton); serverPanel.add(p); return serverPanel; } }