Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / RemoteHostsWindow.java
package info.istlab.ServerTester;

import java.awt.Color;
import java.awt.Desktop;
import java.awt.event.ComponentAdapter;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Hashtable;
import java.util.Iterator;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class RemoteHostsWindow extends JPanel {
    JTabbedPane tabbedPane;
    Hashtable<String, RemoteHostPanel> panels = new Hashtable<String, RemoteHostPanel>();
    JFrame frame;
    boolean autoPack = true; // ウィンドウをリサイズしたら、falseにする。再度開いたときにtrueにする。

    public RemoteHostsWindow(Hashtable<String, String> receivedData) {
        frame = new JFrame();
        frame.setTitle("Remote Hosts");
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(java.awt.event.WindowEvent windowEvent) {
                frame.setVisible(false);
            }
        });
        frame.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(java.awt.event.ComponentEvent e) {
                autoPack = false;
            }
        });

        tabbedPane = new JTabbedPane();
        frame.getContentPane().add(tabbedPane);
        Iterator<String> it = receivedData.keySet().iterator();
        while (it.hasNext()) {
            String addr = it.next();
            String value = receivedData.get(addr);
            RemoteHostPanel rhp = new RemoteHostPanel(addr, value);
            tabbedPane.add(addr, rhp);
            panels.put(addr, rhp);
        }
        frame.setLocation(Host.mainhost.nextTo(10,10));
        frame.pack();
        frame.setVisible(true);
    }

    public void updateData(String addr, String value) {
        RemoteHostPanel rhp = panels.get(addr);
        if (rhp != null) {
            rhp.renewal(value);
            tabbedPane.validate();
            tabbedPane.repaint();
            // System.out.println("Tab updated " + addr);
            // System.out.println(value);
        } else {
            rhp = new RemoteHostPanel(addr, value);
            tabbedPane.add(addr, rhp);
            panels.put(addr, rhp);
        }
        packIfNotResized();
    }

    public void packIfNotResized() {
        if (autoPack) {
            frame.pack();
        }
    }
}

class RemoteHostPanel extends JPanel {
    String hostip;

    public RemoteHostPanel(String _hostip, String value) {
        hostip = _hostip;
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        // System.out.println(value);
        fillPanels(value);
    }

    public void addnew(String value) {
        fillPanels(value);
    }

    private void fillPanels(String value) {
        String[] servers = value.split("\n");
        for (String server : servers) {
            if (server.length() < 2) {
                continue;
            }
            // ex: WebServer 8081 127.0.0.1 Running
            String[] info = server.split(" ");
            // System.out.println(server);
            JPanel panel = new JPanel();
            panel.add(new JLabel(info[0]));
            panel.add(new JLabel(info[1]));
            JLabel addressLabel = new JLabel(info[2]);
            if (info[2].equals("127.0.0.1")) {
                addressLabel.setForeground(Color.red);
            }
            panel.add(addressLabel);
            panel.add(new JLabel(info[3]));
            JButton button = new JButton("Connect");
            panel.add(button);
            if (info[3].equals("Running")) {
                button.setEnabled(true);
            } else {
                button.setEnabled(false);
            }
            button.addActionListener(e -> {
                // もしbind addressが0.0.0.0だったら、hostipを使う
                String target = info[2];
                if (target.equals("0.0.0.0")) {
                    target = hostip;
                }
                if (target.equals("127.0.0.1")) {
                    target = hostip;
                }
                if (info[0].startsWith("Web")) {
                    // open web browser
                    Desktop desktop = Desktop.getDesktop();
                    try {
                        desktop.browse(new URI("http://" + target + ":" + info[1]));
                    } catch (IOException | URISyntaxException e1) {
                    }
                } else if (info[0].startsWith("Echo") || info[0].startsWith("ThreadEcho")) {
                    new JExecutor("EchoClient", info[1] + " " + target);
                    // new EchoClient(info[1], target);
                } else if (info[0].startsWith("Time") || info[0].startsWith("ThreadTime")) {
                    new JExecutor("TimeClient", info[1] + " " + target);
                    // new TimeClient(info[1], target);
                } else if (info[0].startsWith("WhiteBoard")) {
                    new JExecutor("WhiteBoardClient", info[1] + " " + target);
                    // new WhiteBoardClient(info[1], target);
                }
            });
            add(panel);
        }
    }

    public void renewal(String value) {
        removeAll();
        fillPanels(value);
        validate();
    }
}