/* * SIPGUIView.java */ package sipgui; import igmp.IGMPListener; import igmp.IGMPListenerObserver; import igmp.IGMPSender; import java.io.IOException; import java.net.UnknownHostException; import java.text.ParseException; import java.util.Set; import java.util.TooManyListenersException; import java.util.logging.Level; import java.util.logging.Logger; import javax.sip.InvalidArgumentException; import javax.sip.SipException; import org.jdesktop.application.Action; import org.jdesktop.application.ResourceMap; import org.jdesktop.application.SingleFrameApplication; import org.jdesktop.application.FrameView; import org.jdesktop.application.TaskMonitor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import javax.swing.Timer; import javax.swing.Icon; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.SwingUtilities; import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; import sip.SIPLayer; import sip.UAC; import sip.UAS; import sip.UASObserver; /** * The application's main frame. */ public class SIPGUIView extends FrameView implements IGMPListenerObserver, UASObserver { private UAS uas; private UAC uac; private String selfName = ""; private String selfHost = ""; private static final String PROXY = "tiserver03.cpt.haw-hamburg.de"; private static final String MULTICAST_GROUP = "239.238.237.17"; private static final int MULTICAST_PORT = 9017; private static int SIP_PORT = 5060; private Thread igmpListenerThread; private IGMPListener igmpListener; private InetAddress getFirstNonLoopbackAddress(boolean preferIpv4, boolean preferIPv6) throws SocketException { Enumeration en = NetworkInterface.getNetworkInterfaces(); while (en.hasMoreElements()) { NetworkInterface i = (NetworkInterface) en.nextElement(); for (Enumeration en2 = i.getInetAddresses(); en2.hasMoreElements();) { InetAddress addr = (InetAddress) en2.nextElement(); if (!addr.isLoopbackAddress()) { if (addr instanceof Inet4Address) { if (preferIPv6) { continue; } return addr; } if (addr instanceof Inet6Address) { if (preferIpv4) { continue; } return addr; } } } } return null; } public SIPGUIView(SingleFrameApplication app) throws UnknownHostException, SocketException { super(app); initComponents(); //set defaults selfHostTextField.setText(getFirstNonLoopbackAddress(true, false).toString().replace("/", "")); selfNameTextField.setText("Hexren"); calleeHostTextField.setText(PROXY); // status bar initialization - message timeout, idle icon and busy animation, etc ResourceMap resourceMap = getResourceMap(); int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout"); messageTimer = new Timer(messageTimeout, new ActionListener() { public void actionPerformed(ActionEvent e) { statusMessageLabel.setText(""); } }); messageTimer.setRepeats(false); int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate"); for (int i = 0; i < busyIcons.length; i++) { busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]"); } busyIconTimer = new Timer(busyAnimationRate, new ActionListener() { public void actionPerformed(ActionEvent e) { busyIconIndex = (busyIconIndex + 1) % busyIcons.length; statusAnimationLabel.setIcon(busyIcons[busyIconIndex]); } }); idleIcon = resourceMap.getIcon("StatusBar.idleIcon"); statusAnimationLabel.setIcon(idleIcon); progressBar.setVisible(false); // connecting action tasks to status bar via TaskMonitor TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext()); taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { String propertyName = evt.getPropertyName(); if ("started".equals(propertyName)) { if (!busyIconTimer.isRunning()) { statusAnimationLabel.setIcon(busyIcons[0]); busyIconIndex = 0; busyIconTimer.start(); } progressBar.setVisible(true); progressBar.setIndeterminate(true); } else if ("done".equals(propertyName)) { busyIconTimer.stop(); statusAnimationLabel.setIcon(idleIcon); progressBar.setVisible(false); progressBar.setValue(0); } else if ("message".equals(propertyName)) { String text = (String) (evt.getNewValue()); statusMessageLabel.setText((text == null) ? "" : text); messageTimer.restart(); } else if ("progress".equals(propertyName)) { int value = (Integer) (evt.getNewValue()); progressBar.setVisible(true); progressBar.setIndeterminate(false); progressBar.setValue(value); } } }); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { mainPanel = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); verbClientsText = new javax.swing.JTextArea(); jLabel2 = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); selfNameTextField = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); selfHostTextField = new javax.swing.JTextField(); setButton = new javax.swing.JButton(); jLabel6 = new javax.swing.JLabel(); jPanel2 = new javax.swing.JPanel(); callButton = new javax.swing.JButton(); jLabel7 = new javax.swing.JLabel(); jLabel8 = new javax.swing.JLabel(); calleeNameTextField = new javax.swing.JTextField(); calleeHostTextField = new javax.swing.JTextField(); byeButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); igmpMessagesText = new javax.swing.JTextArea(); menuBar = new javax.swing.JMenuBar(); javax.swing.JMenu fileMenu = new javax.swing.JMenu(); javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem(); statusPanel = new javax.swing.JPanel(); javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator(); statusMessageLabel = new javax.swing.JLabel(); statusAnimationLabel = new javax.swing.JLabel(); progressBar = new javax.swing.JProgressBar(); mainPanel.setName("mainPanel"); // NOI18N jScrollPane1.setName("jScrollPane1"); // NOI18N verbClientsText.setColumns(20); verbClientsText.setRows(5); verbClientsText.setName("verbClientsText"); // NOI18N jScrollPane1.setViewportView(verbClientsText); org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(sipgui.SIPGUIApp.class).getContext().getResourceMap(SIPGUIView.class); jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N jLabel2.setName("jLabel2"); // NOI18N jPanel1.setBackground(resourceMap.getColor("jPanel1.background")); // NOI18N jPanel1.setName("jPanel1"); // NOI18N selfNameTextField.setText(resourceMap.getString("txtName.text")); // NOI18N selfNameTextField.setName("txtName"); // NOI18N jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N jLabel1.setName("jLabel1"); // NOI18N jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N jLabel4.setName("jLabel4"); // NOI18N selfHostTextField.setText(resourceMap.getString("txtHost.text")); // NOI18N selfHostTextField.setName("txtHost"); // NOI18N setButton.setText(resourceMap.getString("setButton.text")); // NOI18N setButton.setName("setButton"); // NOI18N setButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { setButtonActionPerformed(evt); } }); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel1) .addContainerGap(227, Short.MAX_VALUE)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(selfNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE) .addGap(65, 65, 65)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel4) .addContainerGap(235, Short.MAX_VALUE)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(selfHostTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE) .addGap(18, 18, 18) .addComponent(setButton) .addGap(52, 52, 52)))) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(selfNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(selfHostTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(setButton)) .addContainerGap()) ); jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N jLabel6.setName("jLabel6"); // NOI18N jPanel2.setBackground(resourceMap.getColor("jPanel2.background")); // NOI18N jPanel2.setName("jPanel2"); // NOI18N callButton.setText(resourceMap.getString("btnCall.text")); // NOI18N callButton.setName("btnCall"); // NOI18N callButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { callButtonActionPerformed(evt); } }); jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N jLabel7.setName("jLabel7"); // NOI18N jLabel8.setText(resourceMap.getString("jLabel8.text")); // NOI18N jLabel8.setName("jLabel8"); // NOI18N calleeNameTextField.setText(resourceMap.getString("txtRemoteName.text")); // NOI18N calleeNameTextField.setName("txtRemoteName"); // NOI18N calleeHostTextField.setText(resourceMap.getString("txtRemoteHost.text")); // NOI18N calleeHostTextField.setName("txtRemoteHost"); // NOI18N byeButton.setText(resourceMap.getString("byeButton.text")); // NOI18N byeButton.setName("byeButton"); // NOI18N byeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { byeButtonActionPerformed(evt); } }); cancelButton.setText(resourceMap.getString("cancelButton.text")); // NOI18N cancelButton.setName("cancelButton"); // NOI18N cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jLabel7) .addComponent(calleeNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE) .addComponent(jLabel8) .addComponent(calleeHostTextField) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(callButton) .addGap(18, 18, 18) .addComponent(cancelButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(byeButton))) .addContainerGap(105, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel7) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(calleeNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 40, Short.MAX_VALUE) .addComponent(jLabel8) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(calleeHostTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(callButton) .addComponent(byeButton) .addComponent(cancelButton)) .addGap(14, 14, 14)) ); jScrollPane2.setName("jScrollPane2"); // NOI18N igmpMessagesText.setColumns(20); igmpMessagesText.setRows(5); igmpMessagesText.setName("igmpMessagesText"); // NOI18N jScrollPane2.setViewportView(igmpMessagesText); javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); mainPanel.setLayout(mainPanelLayout); mainPanelLayout.setHorizontalGroup( mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(mainPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel6) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 271, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(mainPanelLayout.createSequentialGroup() .addGap(25, 25, 25) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 230, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(26, 26, 26)) .addGroup(mainPanelLayout.createSequentialGroup() .addGap(68, 68, 68) .addComponent(jLabel2))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); mainPanelLayout.setVerticalGroup( mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(mainPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(jLabel6) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 479, Short.MAX_VALUE) .addGroup(mainPanelLayout.createSequentialGroup() .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(mainPanelLayout.createSequentialGroup() .addGap(78, 78, 78) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 307, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(mainPanelLayout.createSequentialGroup() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(55, 55, 55) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap(70, Short.MAX_VALUE)))) ); menuBar.setName("menuBar"); // NOI18N fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N fileMenu.setName("fileMenu"); // NOI18N javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(sipgui.SIPGUIApp.class).getContext().getActionMap(SIPGUIView.class, this); exitMenuItem.setAction(actionMap.get("quit")); // NOI18N exitMenuItem.setName("exitMenuItem"); // NOI18N fileMenu.add(exitMenuItem); menuBar.add(fileMenu); statusPanel.setName("statusPanel"); // NOI18N statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N statusMessageLabel.setName("statusMessageLabel"); // NOI18N statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N progressBar.setName("progressBar"); // NOI18N javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel); statusPanel.setLayout(statusPanelLayout); statusPanelLayout.setHorizontalGroup( statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 868, Short.MAX_VALUE) .addGroup(statusPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(statusMessageLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 684, Short.MAX_VALUE) .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(statusAnimationLabel) .addContainerGap()) ); statusPanelLayout.setVerticalGroup( statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(statusPanelLayout.createSequentialGroup() .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(statusMessageLabel) .addComponent(statusAnimationLabel) .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(3, 3, 3)) ); setComponent(mainPanel); setMenuBar(menuBar); setStatusBar(statusPanel); }// </editor-fold>//GEN-END:initComponents private void setButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_setButtonActionPerformed try { this.selfName = this.selfNameTextField.getText(); this.selfHost = this.selfHostTextField.getText(); Logger.getLogger(SIPGUIView.class.getName()).log(Level.INFO, selfName + "@" + selfHost); SIPLayer sipLayer = new SIPLayer(selfName, selfHost, SIP_PORT); uas = new UAS(sipLayer); uas.setObserver(this); uac = new UAC(sipLayer); uas.registerAtProxy(PROXY, SIP_PORT); IGMPSender sender = new IGMPSender(); sender.initialize(InetAddress.getByName(MULTICAST_GROUP), MULTICAST_PORT, uas); new Thread(sender).start(); } catch (Exception ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } }//GEN-LAST:event_setButtonActionPerformed private void callButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_callButtonActionPerformed try { uac.sendInvite(this.calleeNameTextField.getText(), this.calleeHostTextField.getText()); igmpListener = new IGMPListener(); igmpListener.setObserver(this); igmpListener.initialize(InetAddress.getByName(MULTICAST_GROUP), MULTICAST_PORT); igmpListenerThread = new Thread(igmpListener); igmpListenerThread.start(); } catch (ParseException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidArgumentException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } catch (SipException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } catch (UnknownHostException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } }//GEN-LAST:event_callButtonActionPerformed private void byeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_byeButtonActionPerformed try { igmpListener.stop(); uac.sendBye(); } catch (ParseException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidArgumentException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } catch (SipException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } }//GEN-LAST:event_byeButtonActionPerformed private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed try { igmpListener.stop(); uac.sendCancel(); } catch (ParseException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidArgumentException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } catch (SipException ex) { Logger.getLogger(SIPGUIView.class.getName()).log(Level.SEVERE, null, ex); } }//GEN-LAST:event_cancelButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton byeButton; private javax.swing.JButton callButton; private javax.swing.JTextField calleeHostTextField; private javax.swing.JTextField calleeNameTextField; private javax.swing.JButton cancelButton; private javax.swing.JTextArea igmpMessagesText; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JPanel mainPanel; private javax.swing.JMenuBar menuBar; private javax.swing.JProgressBar progressBar; private javax.swing.JTextField selfHostTextField; private javax.swing.JTextField selfNameTextField; private javax.swing.JButton setButton; private javax.swing.JLabel statusAnimationLabel; private javax.swing.JLabel statusMessageLabel; private javax.swing.JPanel statusPanel; private javax.swing.JTextArea verbClientsText; // End of variables declaration//GEN-END:variables private final Timer messageTimer; private final Timer busyIconTimer; private final Icon idleIcon; private final Icon[] busyIcons = new Icon[15]; private int busyIconIndex = 0; private JDialog aboutBox; public void addMessage(String message) { String newText = this.igmpMessagesText.getText() + "\n" + message; this.igmpMessagesText.setText(newText); } public void notifyChangedActiveDialogs(Set<String> dialogs) { StringBuilder sb = new StringBuilder(); for(String entry: dialogs){ sb.append(entry + "\n"); } this.verbClientsText.setText(sb.toString()); } }