/* * festivoice * * Copyright 2009 FURUHASHI Sadayuki, KASHIHARA Shuzo, SHIBATA Yasuharu * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.festivoice; import java.lang.*; import java.util.*; import java.net.*; import javax.swing.*; import javax.swing.event.*; import java.awt.event.*; import java.awt.*; public class GUILauncher extends JFrame { private JButton submitButton; private JList userList; private JTextField channelField; private JTextField userField; private Client client; private JCheckBox listenOnlyCheckBox; private JButton statusButton; private boolean memberExists = false; private String host; private int port; private int mode; private int quality; private boolean vbr; public GUILauncher(String host, int port, String channel, String user) { this.host = host; this.port = port; this.mode = 2; this.quality = 8; this.vbr = true; initComponents(); userField.setText(user); channelField.setText(channel); //EventQueue.invokeLater(new Runnable() { // public void run() { // tryStart(); // } //}); } private void initComponents() { try{ UIManager.getInstalledLookAndFeels(); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { e.printStackTrace(); } setMinimumSize(new Dimension(270, 150)); JPanel c0 = new JPanel(); c0.setBorder(new javax.swing.border.EmptyBorder(5, 5, 5, 5)); getContentPane().add(c0, BorderLayout.CENTER); c0.setLayout(new BorderLayout(2, 2)); // userLabel: userField channelLabel: channelField JPanel c1 = new JPanel(); c1.setLayout(new BoxLayout(c1, BoxLayout.X_AXIS)); c0.add(c1, BorderLayout.PAGE_START); // userLabel: userField JLabel userLabel = new JLabel(); userLabel.setText("ユーザー名"); c1.add(userLabel); c1.add(Box.createRigidArea(new java.awt.Dimension(3,1))); userField = new JTextField(6); c1.add(userField); // gap c1.add(Box.createRigidArea(new java.awt.Dimension(5,1))); // channelLabel: channelField JLabel channelLabel = new JLabel(); channelLabel.setText("チャンネル"); c1.add(channelLabel); c1.add(Box.createRigidArea(new java.awt.Dimension(3,1))); channelField = new JTextField(6); c1.add(channelField); // userList userList = new JList(new DefaultListModel()); userList.setEnabled(false); JScrollPane c2 = new JScrollPane(); c2.setViewportView(userList); c0.add(c2, BorderLayout.CENTER); // statusButton [x]listen only [submitButton] JPanel c3 = new JPanel(); c3.setLayout(new BorderLayout()); c0.add(c3, BorderLayout.PAGE_END); // talk button statusButton = new JButton(); statusButton.setText("未接続"); statusButton.setEnabled(false); statusButton.addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent e) { talkButtonChanged(); } }); c3.add(statusButton, BorderLayout.LINE_START); // checkbox listenOnlyCheckBox = new JCheckBox(); listenOnlyCheckBox.setText("listen only"); listenOnlyCheckBox.setEnabled(false); listenOnlyCheckBox.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { changeListenOnlyCheckBox(); } }); c3.add(listenOnlyCheckBox, BorderLayout.CENTER); // [submitButton] submitButton = new JButton(); submitButton.setText("接続"); submitButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event) { submitPerformed(); } }); c3.add(submitButton, BorderLayout.LINE_END); // click submitButton on enter key event KeyAdapter submitOnEnterKeyAdapter = new KeyAdapter() { public void keyPressed(KeyEvent event) { if(event.getKeyCode() == KeyEvent.VK_ENTER) { event.consume(); doSubmit(); } } }; channelField.addKeyListener(submitOnEnterKeyAdapter); userField.addKeyListener(submitOnEnterKeyAdapter); submitButton.addKeyListener(submitOnEnterKeyAdapter); setTitle("festivoice.net"); pack(); } private void changeListenOnlyCheckBox() { if(client == null) { return; } if(listenOnlyCheckBox.isSelected()) { statusButton.setEnabled(true); statusButton.requestFocusInWindow(); } else { statusButton.setEnabled(false); } talkButtonChanged(); } private void talkButtonChanged() { if(client == null) { return; } if(!isListenOnly() || statusButton.getModel().isPressed()) { client.setListenOnly(false); if(!memberExists) { statusButton.setText("接続待ち"); } else { statusButton.setText("会話中"); } } else { client.setListenOnly(true); if(!memberExists) { statusButton.setText("接続待ち"); } else { statusButton.setText("話す"); } } } private void doSubmit() { submitButton.doClick(); } private void submitPerformed() { if(!isStarted()) { tryStart(); listenOnlyCheckBox.requestFocusInWindow(); } else { System.exit(0); } } private void clientInitialized() { if(client.isMicAvailable()) { listenOnlyCheckBox.setEnabled(true); } else { listenOnlyCheckBox.setSelected(true); listenOnlyCheckBox.setText("マイクが使えません"); } talkButtonChanged(); } private void updateUserList() { DefaultListModel model = (DefaultListModel)userList.getModel(); model.clear(); model.addElement(userField.getText()); memberExists = false; for (IClientUserInfo userInfo : client.getClientUserInfoIterator()) { model.addElement(userInfo.getUserName()); memberExists = true; } talkButtonChanged(); } private void tryStart() { final String user = userField.getText(); final String channel = channelField.getText(); if(isStarted() || user.equals("") || channel.equals("")) { return; } Client tmpClient; try { tmpClient = new Client(channel, user, new InetSocketAddress(host, port), mode, quality, vbr); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(this, e.getStackTrace(), e.toString(), JOptionPane.ERROR_MESSAGE); return; } statusButton.setText("初期化中"); tmpClient.setInitCallback(new Runnable() { public void run() { EventQueue.invokeLater(new Runnable() { public void run() { clientInitialized(); } }); } }); tmpClient.setUserUpdateCallback(new Runnable() { public void run() { EventQueue.invokeLater(new Runnable() { public void run() { updateUserList(); } }); } }); userField.setEnabled(false); channelField.setEnabled(false); userList.setEnabled(true); submitButton.setText("終了"); tmpClient.start(); client = tmpClient; updateUserList(); } private boolean isListenOnly() { return listenOnlyCheckBox.isSelected(); } private boolean isStarted() { return client != null; } public static void main(String[] args) { if(args.length != 3 && args.length != 4) { throw new IllegalArgumentException("Arguments number is wrong."); } String host = args[0]; int port = Integer.parseInt(args[1]); String channel = args[2]; if(channel.equals("-")) { channel = ""; } String user; if(args.length > 3 && !args[3].equals("") && !args[3].equals("-")) { user = args[3]; } else { user = System.getProperty("user.name"); } GUILauncher launcher = new GUILauncher(host, port, channel, user); launcher.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); launcher.setVisible(true); } }