/*
This file is part of Peers, a java SIP softphone.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Copyright 2010 Yohann Martineau
*/
package net.sourceforge.peers.gui;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.Border;
import net.sourceforge.peers.Logger;
import net.sourceforge.peers.sip.Utils;
import net.sourceforge.peers.sip.syntaxencoding.SipUriSyntaxException;
import net.sourceforge.peers.sip.transport.SipRequest;
import net.sourceforge.peers.sip.transport.SipResponse;
public class MainFrame implements WindowListener, ActionListener {
public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI(args);
}
});
}
private static void createAndShowGUI(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
new MainFrame(args);
}
private JFrame mainFrame;
private JPanel mainPanel;
private JPanel dialerPanel;
private JTextField uri;
private JButton actionButton;
private JLabel statusLabel;
private EventManager eventManager;
private Registration registration;
private Logger logger;
public MainFrame(final String[] args) {
String peersHome = Utils.DEFAULT_PEERS_HOME;
if (args.length > 0) {
peersHome = args[0];
}
logger = new Logger(peersHome);
String lookAndFeelClassName = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(lookAndFeelClassName);
} catch (Exception e) {
logger.error("cannot change look and feel", e);
}
String title = "";
if (!Utils.DEFAULT_PEERS_HOME.equals(peersHome)) {
title = peersHome;
}
title += "/Peers: SIP User-Agent";
mainFrame = new JFrame(title);
mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
mainFrame.addWindowListener(this);
mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
dialerPanel = new JPanel();
uri = new JTextField("sip:", 15);
uri.addActionListener(this);
actionButton = new JButton("Call");
actionButton.addActionListener(this);
dialerPanel.add(uri);
dialerPanel.add(actionButton);
dialerPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
statusLabel = new JLabel(title);
statusLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
Border border = BorderFactory.createEmptyBorder(0, 2, 2, 2);
statusLabel.setBorder(border);
mainPanel.add(dialerPanel);
mainPanel.add(statusLabel);
Container contentPane = mainFrame.getContentPane();
contentPane.add(mainPanel);
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("File");
menu.setMnemonic('F');
JMenuItem menuItem = new JMenuItem("Exit");
menuItem.setMnemonic('x');
menuItem.setActionCommand(EventManager.ACTION_EXIT);
registration = new Registration(statusLabel, logger);
Thread thread = new Thread(new Runnable() {
public void run() {
String peersHome = Utils.DEFAULT_PEERS_HOME;
if (args.length > 0) {
peersHome = args[0];
}
eventManager = new EventManager(MainFrame.this,
peersHome, logger);
try {
eventManager.register();
} catch (SipUriSyntaxException e) {
statusLabel.setText(e.getMessage());
}
}
});
thread.start();
try {
while (eventManager == null) {
Thread.sleep(50);
}
} catch (InterruptedException e) {
return;
}
menuItem.addActionListener(eventManager);
menu.add(menuItem);
menuBar.add(menu);
menu = new JMenu("Edit");
menu.setMnemonic('E');
menuItem = new JMenuItem("Account");
menuItem.setMnemonic('A');
menuItem.setActionCommand(EventManager.ACTION_ACCOUNT);
menuItem.addActionListener(eventManager);
menu.add(menuItem);
menuItem = new JMenuItem("Preferences");
menuItem.setMnemonic('P');
menuItem.setActionCommand(EventManager.ACTION_PREFERENCES);
menuItem.addActionListener(eventManager);
menu.add(menuItem);
menuBar.add(menu);
menu = new JMenu("Help");
menu.setMnemonic('H');
menuItem = new JMenuItem("User manual");
menuItem.setMnemonic('D');
menuItem.setActionCommand(EventManager.ACTION_DOCUMENTATION);
menuItem.addActionListener(eventManager);
menu.add(menuItem);
menuItem = new JMenuItem("About");
menuItem.setMnemonic('A');
menuItem.setActionCommand(EventManager.ACTION_ABOUT);
menuItem.addActionListener(eventManager);
menu.add(menuItem);
menuBar.add(menu);
mainFrame.setJMenuBar(menuBar);
mainFrame.pack();
mainFrame.setVisible(true);
}
// window events
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
eventManager.windowClosed();
}
@Override
public void windowClosing(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowOpened(WindowEvent e) {
}
// action event
@Override
public void actionPerformed(ActionEvent e) {
eventManager.callClicked(uri.getText());
}
// misc.
public void setLabelText(String text) {
statusLabel.setText(text);
mainFrame.pack();
}
public void registerFailed(SipResponse sipResponse) {
registration.registerFailed();
}
public void registerSuccessful(SipResponse sipResponse) {
registration.registerSuccessful();
}
public void registering(SipRequest sipRequest) {
registration.registerSent();
}
public void socketExceptionOnStartup() {
JOptionPane.showMessageDialog(mainFrame, "peers SIP port " +
"unavailable, exiting");
System.exit(1);
}
}