/*
* jPhonePanel.java
*
* Created on Mar 22, 2010, 6:31:03 PM
*
* @author pquiring@gmail.com
*
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javaforce.*;
import javaforce.jni.JFNative;
import javaforce.voip.*;
/** jphonelite Panel */
public class PhonePanel extends BasePhone implements MeterController, GUI, VideoController {
/** Creates new form jPhonePanel */
public PhonePanel(WindowController wc, boolean isApplet) {
try {
initBasePhone(this, wc);
Settings.isApplet = isApplet;
initComponents();
init();
LocalCamera.init(lines);
if (isApplet) {
sidePanel.setVisible(false);
}
//must set focus to something or VK_BACK_SPACE beeps
SwingUtilities.invokeLater(new Runnable(){
public void run(){
call.requestFocusInWindow(); //must be called from EDT or when window is visible
}
});
} catch (Exception e) {
JFLog.log("Error:" + e);
}
}
/** 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() {
shareDesktopMenu = new javax.swing.JPopupMenu();
shareDesktopViewOnly = new javax.swing.JMenuItem();
shareDesktopRemoteControl = new javax.swing.JMenuItem();
l1 = new javax.swing.JToggleButton();
l2 = new javax.swing.JToggleButton();
l3 = new javax.swing.JToggleButton();
l4 = new javax.swing.JToggleButton();
l5 = new javax.swing.JToggleButton();
l6 = new javax.swing.JToggleButton();
xfr = new javax.swing.JButton();
hld = new javax.swing.JButton();
aa = new javax.swing.JButton();
ac = new javax.swing.JButton();
dnd = new javax.swing.JButton();
cnf = new javax.swing.JButton();
call = new javax.swing.JToggleButton();
end = new javax.swing.JToggleButton();
n1 = new javax.swing.JButton();
n2 = new javax.swing.JButton();
n3 = new javax.swing.JButton();
n4 = new javax.swing.JButton();
n5 = new javax.swing.JButton();
n6 = new javax.swing.JButton();
n7 = new javax.swing.JButton();
n8 = new javax.swing.JButton();
n9 = new javax.swing.JButton();
n0 = new javax.swing.JButton();
nstar = new javax.swing.JButton();
npound = new javax.swing.JButton();
cfg = new javax.swing.JButton();
clear = new javax.swing.JButton();
redial = new javax.swing.JButton();
status = new javax.swing.JTextField();
dial = new javax.swing.JTextField();
sidePanel = new javax.swing.JToggleButton();
contactLabel = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
contactJList = new javax.swing.JList();
recentLabel = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane();
recentList = new javax.swing.JList();
delContact = new javax.swing.JButton();
addContact = new javax.swing.JButton();
editContact = new javax.swing.JButton();
meterRec = new javax.swing.JProgressBar();
meterPlay = new javax.swing.JProgressBar();
mute = new javax.swing.JButton();
headsetPic = new javax.swing.JLabel();
micPic = new javax.swing.JLabel();
backSpace = new javax.swing.JButton();
micScale = new javax.swing.JLabel();
spkScale = new javax.swing.JLabel();
volRec = new javax.swing.JSlider();
volPlay = new javax.swing.JSlider();
presenceStatus = new javax.swing.JComboBox();
jLabel1 = new javax.swing.JLabel();
spk = new javax.swing.JButton();
labels1 = new javax.swing.JLabel();
spkPic = new javax.swing.JLabel();
mutePic = new javax.swing.JLabel();
labels2 = new javax.swing.JLabel();
videoPanel = new javax.swing.JButton();
fullScreenPic = new javax.swing.JLabel();
enableVideoPic = new javax.swing.JLabel();
videoPic = new javax.swing.JLabel();
record = new javax.swing.JButton();
recordPic = new javax.swing.JLabel();
shareDesktopViewOnly.setText("Share Desktop (view only)");
shareDesktopMenu.add(shareDesktopViewOnly);
shareDesktopRemoteControl.setText("Share Desktop (remote control)");
shareDesktopMenu.add(shareDesktopRemoteControl);
setMaximumSize(new java.awt.Dimension(560, 350));
setMinimumSize(new java.awt.Dimension(290, 350));
setLayout(null);
l1.setToolTipText("Line 1");
l1.setMargin(new java.awt.Insets(2, 2, 2, 2));
l1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
l1ActionPerformed(evt);
}
});
add(l1);
l1.setBounds(10, 70, 30, 30);
l2.setToolTipText("Line 2");
l2.setMargin(new java.awt.Insets(2, 2, 2, 2));
l2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
l2ActionPerformed(evt);
}
});
add(l2);
l2.setBounds(50, 70, 30, 30);
l3.setToolTipText("Line 3");
l3.setMargin(new java.awt.Insets(2, 2, 2, 2));
l3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
l3ActionPerformed(evt);
}
});
add(l3);
l3.setBounds(90, 70, 30, 30);
l4.setToolTipText("Line 4");
l4.setMargin(new java.awt.Insets(2, 2, 2, 2));
l4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
l4ActionPerformed(evt);
}
});
add(l4);
l4.setBounds(130, 70, 30, 30);
l5.setToolTipText("Line 5");
l5.setMargin(new java.awt.Insets(2, 2, 2, 2));
l5.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
l5ActionPerformed(evt);
}
});
add(l5);
l5.setBounds(170, 70, 30, 30);
l6.setToolTipText("Line 6");
l6.setMargin(new java.awt.Insets(2, 2, 2, 2));
l6.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
l6ActionPerformed(evt);
}
});
add(l6);
l6.setBounds(210, 70, 30, 30);
xfr.setToolTipText("Transfer");
xfr.setMargin(new java.awt.Insets(2, 0, 2, 0));
xfr.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
xfrActionPerformed(evt);
}
});
add(xfr);
xfr.setBounds(10, 110, 30, 30);
hld.setToolTipText("Hold");
hld.setMargin(new java.awt.Insets(2, 0, 2, 0));
hld.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
hldActionPerformed(evt);
}
});
add(hld);
hld.setBounds(50, 110, 30, 30);
aa.setToolTipText("Auto Answer");
aa.setMargin(new java.awt.Insets(2, 0, 2, 0));
aa.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
aaActionPerformed(evt);
}
});
add(aa);
aa.setBounds(130, 110, 30, 30);
ac.setToolTipText("Auto Conference");
ac.setMargin(new java.awt.Insets(2, 0, 2, 0));
ac.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
acActionPerformed(evt);
}
});
add(ac);
ac.setBounds(170, 110, 30, 30);
dnd.setToolTipText("Do-Not-Disturb");
dnd.setMargin(new java.awt.Insets(2, 0, 2, 0));
dnd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
dndActionPerformed(evt);
}
});
add(dnd);
dnd.setBounds(210, 110, 30, 30);
cnf.setToolTipText("Conference");
cnf.setMargin(new java.awt.Insets(2, 0, 2, 0));
cnf.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cnfActionPerformed(evt);
}
});
add(cnf);
cnf.setBounds(250, 110, 30, 30);
call.setText("Call");
call.setFocusCycleRoot(true);
call.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
callActionPerformed(evt);
}
});
add(call);
call.setBounds(10, 150, 70, 50);
end.setText("End");
end.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
endActionPerformed(evt);
}
});
add(end);
end.setBounds(210, 150, 70, 50);
n1.setText("1");
n1.setMargin(new java.awt.Insets(2, 2, 2, 2));
n1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n1ActionPerformed(evt);
}
});
add(n1);
n1.setBounds(90, 150, 30, 30);
n2.setText("2");
n2.setMargin(new java.awt.Insets(2, 2, 2, 2));
n2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n2ActionPerformed(evt);
}
});
add(n2);
n2.setBounds(130, 150, 30, 30);
n3.setText("3");
n3.setMargin(new java.awt.Insets(2, 2, 2, 2));
n3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n3ActionPerformed(evt);
}
});
add(n3);
n3.setBounds(170, 150, 30, 30);
n4.setText("4");
n4.setMargin(new java.awt.Insets(2, 2, 2, 2));
n4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n4ActionPerformed(evt);
}
});
add(n4);
n4.setBounds(90, 190, 30, 30);
n5.setText("5");
n5.setMargin(new java.awt.Insets(2, 2, 2, 2));
n5.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n5ActionPerformed(evt);
}
});
add(n5);
n5.setBounds(130, 190, 30, 30);
n6.setText("6");
n6.setMargin(new java.awt.Insets(2, 2, 2, 2));
n6.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n6ActionPerformed(evt);
}
});
add(n6);
n6.setBounds(170, 190, 30, 30);
n7.setText("7");
n7.setMargin(new java.awt.Insets(2, 2, 2, 2));
n7.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n7ActionPerformed(evt);
}
});
add(n7);
n7.setBounds(90, 230, 30, 30);
n8.setText("8");
n8.setMargin(new java.awt.Insets(2, 2, 2, 2));
n8.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n8ActionPerformed(evt);
}
});
add(n8);
n8.setBounds(130, 230, 30, 30);
n9.setText("9");
n9.setMargin(new java.awt.Insets(2, 2, 2, 2));
n9.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n9ActionPerformed(evt);
}
});
add(n9);
n9.setBounds(170, 230, 30, 30);
n0.setText("0");
n0.setMargin(new java.awt.Insets(2, 2, 2, 2));
n0.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
n0ActionPerformed(evt);
}
});
add(n0);
n0.setBounds(130, 270, 30, 30);
nstar.setText("*");
nstar.setMargin(new java.awt.Insets(2, 2, 2, 2));
nstar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
nstarActionPerformed(evt);
}
});
add(nstar);
nstar.setBounds(90, 270, 30, 30);
npound.setText("#");
npound.setMargin(new java.awt.Insets(2, 2, 2, 2));
npound.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
npoundActionPerformed(evt);
}
});
add(npound);
npound.setBounds(170, 270, 30, 30);
cfg.setToolTipText("Configure");
cfg.setMargin(new java.awt.Insets(2, 0, 2, 0));
cfg.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cfgActionPerformed(evt);
}
});
add(cfg);
cfg.setBounds(250, 70, 30, 30);
clear.setText("CLR");
clear.setToolTipText("Clear");
clear.setMargin(new java.awt.Insets(2, 0, 2, 0));
clear.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
clearActionPerformed(evt);
}
});
add(clear);
clear.setBounds(170, 310, 30, 30);
redial.setToolTipText("Redial");
redial.setMargin(new java.awt.Insets(2, 0, 2, 0));
redial.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
redialActionPerformed(evt);
}
});
add(redial);
redial.setBounds(90, 110, 30, 30);
status.setEditable(false);
add(status);
status.setBounds(10, 40, 240, 20);
dial.setEditable(false);
add(dial);
dial.setBounds(10, 10, 240, 20);
sidePanel.setText(">");
sidePanel.setToolTipText("Toggle Side Panel");
sidePanel.setMargin(new java.awt.Insets(2, 0, 2, 0));
sidePanel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
sidePanelActionPerformed(evt);
}
});
add(sidePanel);
sidePanel.setBounds(260, 10, 20, 50);
contactLabel.setText("Contacts");
add(contactLabel);
contactLabel.setBounds(290, 10, 70, 10);
contactJList.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
contactJList.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
contactJListMouseClicked(evt);
}
});
contactJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
contactJListValueChanged(evt);
}
});
jScrollPane1.setViewportView(contactJList);
add(jScrollPane1);
jScrollPane1.setBounds(290, 30, 250, 150);
recentLabel.setText("Recent Calls");
add(recentLabel);
recentLabel.setBounds(290, 190, 80, 10);
recentList.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
recentList.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
recentListMouseClicked(evt);
}
});
recentList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
recentListValueChanged(evt);
}
});
jScrollPane2.setViewportView(recentList);
add(jScrollPane2);
jScrollPane2.setBounds(290, 210, 250, 130);
delContact.setText("Remove");
delContact.setMargin(new java.awt.Insets(2, 0, 2, 0));
delContact.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
delContactActionPerformed(evt);
}
});
add(delContact);
delContact.setBounds(480, 10, 60, 20);
addContact.setText("Add");
addContact.setMargin(new java.awt.Insets(2, 0, 2, 0));
addContact.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addContactActionPerformed(evt);
}
});
add(addContact);
addContact.setBounds(360, 10, 50, 20);
editContact.setText("Edit");
editContact.setMargin(new java.awt.Insets(2, 0, 2, 0));
editContact.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editContactActionPerformed(evt);
}
});
add(editContact);
editContact.setBounds(420, 10, 50, 20);
meterRec.setOrientation(1);
add(meterRec);
meterRec.setBounds(40, 210, 10, 90);
meterPlay.setOrientation(1);
add(meterPlay);
meterPlay.setBounds(270, 210, 10, 90);
mute.setToolTipText("Mute");
mute.setMargin(new java.awt.Insets(2, 0, 2, 0));
mute.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
muteActionPerformed(evt);
}
});
add(mute);
mute.setBounds(10, 310, 30, 30);
headsetPic.setText(".");
add(headsetPic);
headsetPic.setBounds(210, 230, 30, 30);
micPic.setText(".");
add(micPic);
micPic.setBounds(50, 230, 30, 30);
backSpace.setText("<");
backSpace.setMargin(new java.awt.Insets(2, 2, 2, 2));
backSpace.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
backSpaceActionPerformed(evt);
}
});
add(backSpace);
backSpace.setBounds(90, 310, 30, 30);
micScale.setText(".");
add(micScale);
micScale.setBounds(30, 210, 10, 90);
spkScale.setText(".");
add(spkScale);
spkScale.setBounds(260, 210, 10, 90);
volRec.setOrientation(javax.swing.JSlider.VERTICAL);
volRec.setValue(75);
volRec.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
volRecStateChanged(evt);
}
});
add(volRec);
volRec.setBounds(10, 210, 20, 90);
volPlay.setOrientation(javax.swing.JSlider.VERTICAL);
volPlay.setValue(75);
volPlay.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
volPlayStateChanged(evt);
}
});
add(volPlay);
volPlay.setBounds(240, 210, 20, 90);
presenceStatus.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Auto", "DND", "Busy", "Idle", "Offline" }));
presenceStatus.setEnabled(false);
presenceStatus.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
presenceStatusItemStateChanged(evt);
}
});
add(presenceStatus);
presenceStatus.setBounds(450, 185, 90, 20);
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
jLabel1.setText("Status:");
add(jLabel1);
jLabel1.setBounds(380, 190, 70, 10);
spk.setToolTipText("Speaker Phone Mode");
spk.setMargin(new java.awt.Insets(2, 0, 2, 0));
spk.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
spkActionPerformed(evt);
}
});
add(spk);
spk.setBounds(250, 310, 30, 30);
add(labels1);
labels1.setBounds(10, 100, 270, 10);
add(spkPic);
spkPic.setBounds(250, 340, 30, 10);
add(mutePic);
mutePic.setBounds(10, 340, 30, 10);
add(labels2);
labels2.setBounds(10, 140, 270, 10);
videoPanel.setToolTipText("Show Video Panel");
videoPanel.setMargin(new java.awt.Insets(2, 0, 2, 0));
videoPanel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
videoPanelActionPerformed(evt);
}
});
add(videoPanel);
videoPanel.setBounds(210, 310, 30, 30);
add(fullScreenPic);
fullScreenPic.setBounds(470, 670, 60, 10);
add(enableVideoPic);
enableVideoPic.setBounds(20, 670, 60, 10);
add(videoPic);
videoPic.setBounds(210, 340, 30, 10);
record.setToolTipText("Record");
record.setMargin(new java.awt.Insets(2, 0, 2, 0));
record.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
recordActionPerformed(evt);
}
});
add(record);
record.setBounds(50, 310, 30, 30);
add(recordPic);
recordPic.setBounds(50, 340, 30, 10);
}// </editor-fold>//GEN-END:initComponents
private void n3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n3ActionPerformed
addDigit('3');
}//GEN-LAST:event_n3ActionPerformed
private void cfgActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cfgActionPerformed
if (registeringAll) {
doConfig = true; //do after registerAll is complete
return;
}
for(int a=0;a<6;a++) { if (lines[a].incall) return; }
cfg.setIcon(ii[PIC_GREEN]);
unRegisterAll();
selectLine(-1);
for(int a=0;a<6;a++) { lines[a].msgwaiting = false; }
sound.uninit();
dial.setText("");
status.setText("");
EditSettings.editSettings(null);
initDTLS();
reset();
cfg.setIcon(ii[PIC_GREY]);
}//GEN-LAST:event_cfgActionPerformed
private void n1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n1ActionPerformed
addDigit('1');
}//GEN-LAST:event_n1ActionPerformed
private void n2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n2ActionPerformed
addDigit('2');
}//GEN-LAST:event_n2ActionPerformed
private void n4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n4ActionPerformed
addDigit('4');
}//GEN-LAST:event_n4ActionPerformed
private void n5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n5ActionPerformed
addDigit('5');
}//GEN-LAST:event_n5ActionPerformed
private void n6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n6ActionPerformed
addDigit('6');
}//GEN-LAST:event_n6ActionPerformed
private void n7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n7ActionPerformed
addDigit('7');
}//GEN-LAST:event_n7ActionPerformed
private void n8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n8ActionPerformed
addDigit('8');
}//GEN-LAST:event_n8ActionPerformed
private void n9ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n9ActionPerformed
addDigit('9');
}//GEN-LAST:event_n9ActionPerformed
private void nstarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nstarActionPerformed
addDigit('*');
}//GEN-LAST:event_nstarActionPerformed
private void n0ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_n0ActionPerformed
addDigit('0');
}//GEN-LAST:event_n0ActionPerformed
private void npoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_npoundActionPerformed
addDigit('#');
}//GEN-LAST:event_npoundActionPerformed
private void clearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearActionPerformed
clear();
}//GEN-LAST:event_clearActionPerformed
private void callActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_callActionPerformed
call();
}//GEN-LAST:event_callActionPerformed
private void endActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_endActionPerformed
end();
}//GEN-LAST:event_endActionPerformed
private void l1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_l1ActionPerformed
selectLine(0);
}//GEN-LAST:event_l1ActionPerformed
private void l2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_l2ActionPerformed
selectLine(1);
}//GEN-LAST:event_l2ActionPerformed
private void l3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_l3ActionPerformed
selectLine(2);
}//GEN-LAST:event_l3ActionPerformed
private void l4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_l4ActionPerformed
selectLine(3);
}//GEN-LAST:event_l4ActionPerformed
private void l5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_l5ActionPerformed
selectLine(4);
}//GEN-LAST:event_l5ActionPerformed
private void l6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_l6ActionPerformed
selectLine(5);
}//GEN-LAST:event_l6ActionPerformed
private void xfrActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_xfrActionPerformed
doXfer();
}//GEN-LAST:event_xfrActionPerformed
private void hldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hldActionPerformed
doHold();
}//GEN-LAST:event_hldActionPerformed
private void redialActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_redialActionPerformed
doRedial();
}//GEN-LAST:event_redialActionPerformed
private void aaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aaActionPerformed
toggleAA();
}//GEN-LAST:event_aaActionPerformed
private void acActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_acActionPerformed
toggleAC();
}//GEN-LAST:event_acActionPerformed
private void dndActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dndActionPerformed
toggleDND();
}//GEN-LAST:event_dndActionPerformed
private void cnfActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cnfActionPerformed
doConference();
}//GEN-LAST:event_cnfActionPerformed
private void sidePanelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sidePanelActionPerformed
toggleContacts();
}//GEN-LAST:event_sidePanelActionPerformed
private void addContactActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addContactActionPerformed
addContact();
}//GEN-LAST:event_addContactActionPerformed
private void delContactActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_delContactActionPerformed
delContact();
}//GEN-LAST:event_delContactActionPerformed
private void contactJListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_contactJListValueChanged
// dialContact();
}//GEN-LAST:event_contactJListValueChanged
private void recentListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_recentListValueChanged
// dialRecent();
}//GEN-LAST:event_recentListValueChanged
private void contactJListMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_contactJListMouseClicked
if (evt.getClickCount() == 2) dialContact();
}//GEN-LAST:event_contactJListMouseClicked
private void recentListMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_recentListMouseClicked
if (evt.getClickCount() == 2) dialRecent();
}//GEN-LAST:event_recentListMouseClicked
private void editContactActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editContactActionPerformed
editContact();
}//GEN-LAST:event_editContactActionPerformed
private void muteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_muteActionPerformed
toggleMute();
}//GEN-LAST:event_muteActionPerformed
private void backSpaceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backSpaceActionPerformed
addDigit((char)KeyEvent.VK_BACK_SPACE);
}//GEN-LAST:event_backSpaceActionPerformed
private void volRecStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_volRecStateChanged
setVolRec();
}//GEN-LAST:event_volRecStateChanged
private void volPlayStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_volPlayStateChanged
setVolPlay();
}//GEN-LAST:event_volPlayStateChanged
private void presenceStatusItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_presenceStatusItemStateChanged
publishPresence();
}//GEN-LAST:event_presenceStatusItemStateChanged
private void spkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_spkActionPerformed
toggleSpeaker();
}//GEN-LAST:event_spkActionPerformed
private void videoPanelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_videoPanelActionPerformed
toggleVideoPanel(line);
}//GEN-LAST:event_videoPanelActionPerformed
private void recordActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_recordActionPerformed
toggleRecord();
}//GEN-LAST:event_recordActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton aa;
private javax.swing.JButton ac;
private javax.swing.JButton addContact;
private javax.swing.JButton backSpace;
private javax.swing.JToggleButton call;
private javax.swing.JButton cfg;
private javax.swing.JButton clear;
private javax.swing.JButton cnf;
private javax.swing.JList contactJList;
private javax.swing.JLabel contactLabel;
private javax.swing.JButton delContact;
private javax.swing.JTextField dial;
private javax.swing.JButton dnd;
private javax.swing.JButton editContact;
private javax.swing.JLabel enableVideoPic;
private javax.swing.JToggleButton end;
private javax.swing.JLabel fullScreenPic;
private javax.swing.JLabel headsetPic;
private javax.swing.JButton hld;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JToggleButton l1;
private javax.swing.JToggleButton l2;
private javax.swing.JToggleButton l3;
private javax.swing.JToggleButton l4;
private javax.swing.JToggleButton l5;
private javax.swing.JToggleButton l6;
private javax.swing.JLabel labels1;
private javax.swing.JLabel labels2;
private javax.swing.JProgressBar meterPlay;
private javax.swing.JProgressBar meterRec;
private javax.swing.JLabel micPic;
private javax.swing.JLabel micScale;
private javax.swing.JButton mute;
private javax.swing.JLabel mutePic;
private javax.swing.JButton n0;
private javax.swing.JButton n1;
private javax.swing.JButton n2;
private javax.swing.JButton n3;
private javax.swing.JButton n4;
private javax.swing.JButton n5;
private javax.swing.JButton n6;
private javax.swing.JButton n7;
private javax.swing.JButton n8;
private javax.swing.JButton n9;
private javax.swing.JButton npound;
private javax.swing.JButton nstar;
private javax.swing.JComboBox presenceStatus;
private javax.swing.JLabel recentLabel;
private javax.swing.JList recentList;
private javax.swing.JButton record;
private javax.swing.JLabel recordPic;
private javax.swing.JButton redial;
private javax.swing.JPopupMenu shareDesktopMenu;
private javax.swing.JMenuItem shareDesktopRemoteControl;
private javax.swing.JMenuItem shareDesktopViewOnly;
private javax.swing.JToggleButton sidePanel;
private javax.swing.JButton spk;
private javax.swing.JLabel spkPic;
private javax.swing.JLabel spkScale;
private javax.swing.JTextField status;
private javax.swing.JButton videoPanel;
private javax.swing.JLabel videoPic;
private javax.swing.JSlider volPlay;
private javax.swing.JSlider volRec;
private javax.swing.JButton xfr;
// End of variables declaration//GEN-END:variables
/** Init panel variables. */
public void init() {
JFLog.log("jphonelite/" + version);
loadIcons();
Settings.loadSettings();
if (Settings.current.welcome) {
new Thread() {
public void run() {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JF.showMessage("Welcome", "Welcome to jPhoneLite!\nPlease press CFG button to configure your options.");
}
});
}
}.start();
Settings.current.welcome = false;
Settings.saveSettings();
}
contactJList.setCellRenderer(new ListCellRenderer() {
public Component getListCellRendererComponent(
JList list, // the list
Object value, // value to display
int index, // cell index
boolean isSelected, // is the cell selected
boolean cellHasFocus) // does the cell have focus
{
//each Object 'is' a JLabel (Contact) which makes this easy
JLabel label = (JLabel)value;
if (isSelected) {
label.setBackground(list.getSelectionBackground());
label.setForeground(list.getSelectionForeground());
} else {
label.setBackground(list.getBackground());
label.setForeground(list.getForeground());
}
label.setEnabled(list.isEnabled());
label.setFont(list.getFont());
label.setOpaque(true);
return label;
}
});
if (!Settings.isApplet) {
if (SystemTray.isSupported()) {
tray = SystemTray.getSystemTray();
// create a popup menu
PopupMenu popup = new PopupMenu();
show = new MenuItem("Show");
show.addActionListener(this);
popup.add(show);
popup.addSeparator();
exit = new MenuItem("Exit");
exit.addActionListener(this);
popup.add(exit);
Dimension size = tray.getTrayIconSize();
ImageIcon appicon = ii[PIC_TRAY];
JFImage scaled = new JFImage(size.width, size.height);
scaled.fill(0, 0, size.width, size.height, 0x00000000, true); //fill with alpha transparent
if (false) {
//scaled image (looks bad sometimes)
scaled.getGraphics().drawImage(appicon.getImage()
, 0, 0, size.width, size.height
, 0, 0, appicon.getIconWidth(), appicon.getIconHeight()
, null);
} else {
//center image
scaled.getGraphics().drawImage(appicon.getImage()
, (size.width - appicon.getIconWidth()) / 2
, (size.height - appicon.getIconHeight()) / 2
, null);
}
icon = new TrayIcon(scaled.getImage(), "jPhoneLite", popup);
icon.addActionListener(this);
try { tray.add(icon); } catch (Exception e) { JFLog.log(e); }
}
}
lines = new PhoneLine[6];
lineButtons = new JToggleButton[6];
lineButtons[0] = l1;
lineButtons[1] = l2;
lineButtons[2] = l3;
lineButtons[3] = l4;
lineButtons[4] = l5;
lineButtons[5] = l6;
for(int a=0;a<6;a++) {
lineButtons[a].setMargin(new Insets(0,0,0,0));
lineButtons[a].setIconTextGap(0);
lines[a] = new PhoneLine();
}
numButtons = new JButton[12];
numButtons[0] = n1;
numButtons[1] = n2;
numButtons[2] = n3;
numButtons[3] = n4;
numButtons[4] = n5;
numButtons[5] = n6;
numButtons[6] = n7;
numButtons[7] = n8;
numButtons[8] = n9;
numButtons[9] = n0;
numButtons[10] = nstar;
numButtons[11] = npound;
for(int a=0;a<12;a++) {
numButtons[a].addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
JButton o = (JButton)e.getSource();
pressDigit(o.getText().charAt(0));
}
public void mouseReleased(MouseEvent e) {
JButton o = (JButton)e.getSource();
releaseDigit(o.getText().charAt(0));
}
});
}
//set PICs
call.setText("");
call.setIcon(ii[PIC_CALL]);
// call.setPressedIcon(ii[PIC_CALL2]);
call.setSelectedIcon(ii[PIC_CALL2]);
end.setText("");
end.setIcon(ii[PIC_END]);
// end.setPressedIcon(ii[PIC_END2]);
end.setSelectedIcon(ii[PIC_END2]);
labels1.setText("");
labels1.setIcon(ii[PIC_LABELS1]);
labels2.setText("");
labels2.setIcon(ii[PIC_LABELS2]);
micPic.setText("");
micPic.setIcon(ii[PIC_MIC]);
headsetPic.setText("");
headsetPic.setIcon(ii[PIC_HEADSET]);
spk.setText("");
spk.setIcon(ii[Settings.current.speakerMode ? PIC_GREEN : PIC_GREY]);
spkPic.setText("");
spkPic.setIcon(ii[PIC_SPK]);
videoPanel.setIcon(ii[PIC_GREY]);
videoPic.setText("");
videoPic.setIcon(ii[PIC_VIDEO]);
mute.setText("");
mute.setIcon(ii[PIC_GREY]);
mutePic.setText("");
mutePic.setIcon(ii[PIC_MUTE]);
xfr.setText("");
xfr.setIcon(ii[PIC_GREY]);
hld.setText("");
hld.setIcon(ii[PIC_GREY]);
redial.setText("");
redial.setIcon(ii[PIC_GREY]);
aa.setText("");
aa.setIcon(ii[PIC_GREY]);
ac.setText("");
ac.setIcon(ii[PIC_GREY]);
dnd.setText("");
dnd.setIcon(ii[PIC_GREY]);
cnf.setText("");
cnf.setIcon(ii[PIC_GREY]);
cfg.setText("");
cfg.setIcon(ii[PIC_GREY]);
record.setIcon(ii[PIC_GREY]);
recordPic.setText("");
recordPic.setIcon(ii[PIC_RECORD]);
java.util.Timer buttontimer = new java.util.Timer();
buttontimer.schedule(new ButtonColorUpdater(), 0, 250);
keepAliveinit();
reset();
if (Settings.current.checkVersion) {
new Thread() {
public void run() {
checkVersion();
}
}.start();
}
}
/** MeterController : Sets the recording level on the display meter. */
public void setMeterRec(int lvl) {meterRec.setValue(lvl);}
/** MeterController : Sets the playback level on the display meter. */
public void setMeterPlay(int lvl) {meterPlay.setValue(lvl);}
/** MeterController : Sets the speaker mic status (green=true red=false). */
public void setSpeakerStatus(boolean state) {
if (!Settings.current.speakerMode) return; //could happen just after turned off
spk.setIcon(ii[state ? PIC_GREEN : PIC_RED]);
}
/** Change volume from slider control. */
public void setVolRec() {
sound.setVolRec(volRec.getValue());
}
/** Change volume from slider control. */
public void setVolPlay() {
sound.setVolPlay(volPlay.getValue());
}
public void setScales() {
if (sound.isSWVolRec()) {
micScale.setText("");
micScale.setIcon(ii[PIC_SWSCALE]);
volRec.setValue(Settings.current.volRecSW);
sound.setVolRec(Settings.current.volRecSW);
} else {
micScale.setText("");
micScale.setIcon(ii[PIC_HWSCALE]);
volRec.setValue(Settings.current.volRecHW);
sound.setVolRec(Settings.current.volRecHW);
}
if (sound.isSWVolPlay()) {
spkScale.setText("");
spkScale.setIcon(ii[PIC_SWSCALE]);
volPlay.setValue(Settings.current.volPlaySW);
sound.setVolPlay(Settings.current.volPlaySW);
} else {
spkScale.setText("");
spkScale.setIcon(ii[PIC_HWSCALE]);
volPlay.setValue(Settings.current.volPlayHW);
sound.setVolPlay(Settings.current.volPlayHW);
}
}
/** Select a new line. */
public void selectLine(int newline) {
if (line != -1 && lines[line].xfer) {
for (int a=0;a<6;a++) lineButtons[a].setSelected(false);
lineButtons[line].setSelected(true);
if (newline == -1) { //???
return;
}
if (!lines[newline].talking) {
return;
}
lines[newline].sip.referLive(lines[newline].callid, lines[line].callid);
return;
}
if (line != -1 && Settings.current.autohold && lines[line].talking && !lines[line].hld && !lines[line].cnf && newline != line) {
doHold();
}
//make sure line is valid
for (int a=0;a<6;a++) lineButtons[a].setSelected(false);
if ((line != -1) && (lines[line].dtmf != 'x')) lines[line].dtmfend = true;
if (newline == -1) {
line = -1;
dial.setText("");
status.setText("");
hld.setIcon(ii[PIC_GREY]);
dnd.setIcon(ii[PIC_GREY]);
cnf.setIcon(ii[PIC_GREY]);
videoPanel.setIcon(ii[PIC_GREY]);
return;
}
lineButtons[newline].setSelected(true);
sound.selectLine(newline);
if (Settings.current.autohold && lines[line].talking && lines[line].hld == true && newline != line) {
doHold();
}
line = newline;
updateLine();
}
/** Update the number to be dialed, status and buttons for current selected line. */
public void updateLine() {
PhoneLine pl = lines[line];
end.setSelected(false);
if (pl.incall) {
call.setSelected(true);
} else {
call.setSelected(false);
}
dial.setText(pl.dial);
status.setText(pl.status);
hld.setIcon(ii[pl.hld ? PIC_RED : PIC_GREY]);
dnd.setIcon(ii[pl.dnd ? PIC_RED : PIC_GREY]);
cnf.setIcon(ii[pl.cnf ? PIC_GREEN : PIC_GREY]);
xfr.setIcon(ii[pl.xfer ? PIC_GREEN : PIC_GREY]);
videoPanel.setIcon(ii[pl.videoWindow != null ? PIC_GREEN : PIC_GREY]);
}
public void updateCallButton(boolean state) {
call.setSelected(state);
}
public void updateEndButton(boolean state) {
end.setSelected(state);
}
public void endLineUpdate(int xline) {
if ((Settings.current.usePublish) && (presenceStatus.getSelectedIndex() == 0)) lines[xline].sip.publish("open");
if (lines[xline].videoWindow != null) {
toggleVideoPanel(xline);
}
if (sound.record != null) {
toggleRecord();
}
}
public void callInviteUpdate() {
updateRecentList();
if ((Settings.current.usePublish) && (presenceStatus.getSelectedIndex() == 0)) lines[line].sip.publish("busy");
}
/*
Line Colors:
black=not registered
grey=available
green=in use
red=unauth
green/grey=ringing
*/
/** TimerTask executed every 250ms to change the line lights(icons). */
public class ButtonColorUpdater extends java.util.TimerTask {
public boolean odd = false;
public void run() {
int clr = PIC_BLACK;
int cnt = 0;
for(int a=0;a<6;a++) {
if (Settings.current.lines[a].user.length() > 0) cnt++;
PhoneLine pl = lines[a];
if ((pl.sip != null) && (pl.auth)) {
clr = PIC_GREY;
if (pl.msgwaiting) {
if (odd) clr = PIC_ORANGE;
}
if (pl.incoming) {
if (odd) clr = PIC_GREEN; else clr = PIC_GREY;
} else if (pl.incall) clr = PIC_GREEN;
} else {
if (pl.unauth)
clr = PIC_RED;
else
clr = PIC_BLACK;
}
if (pl.clr != clr) {
lineButtons[a].setIcon(ii[clr]);
pl.clr = clr;
}
}
if (cnt == 0) {
//let noob know to press the config button to get started
if (odd) clr = PIC_RED; else clr = PIC_GREY;
cfg.setIcon(ii[clr]);
}
else if (doConfig) {
//let impatient user know the config screen will come up in a second
if (odd) clr = PIC_GREEN; else clr = PIC_GREY;
cfg.setIcon(ii[clr]);
}
odd = !odd;
}
}
/** Sets a contacts icon status when received from a NOTIFY message. */
public void setStatus(String number, String server, String status) {
//BUG : Assuming port 5060 - TLS uses 5061
if (server.indexOf(':') == -1) server += ":5060";
JFLog.log("setStatus(" + number + "," + server + "," + status);
for(int a=0;a<contactList.size();a++) {
String contact = contactList.get(a).contact;
String fields[] = SIP.split(contact);
if (fields[2].indexOf(':') == -1) fields[2] += ":5060";
if ( (fields[1].equals(number)) && (fields[2].equals(server)) ) {
if (status.equals("open")) {
contactList.get(a).setIcon(ii[PIC_ICON_OPEN]);
break;
}
if (status.equals("closed")) {
contactList.get(a).setIcon(ii[PIC_ICON_CLOSED]);
break;
}
if (status.equals("idle")) {
contactList.get(a).setIcon(ii[PIC_ICON_IDLE]);
break;
}
if (status.equals("busy")) {
contactList.get(a).setIcon(ii[PIC_ICON_BUSY]);
break;
}
if (status.equals("dnd")) {
contactList.get(a).setIcon(ii[PIC_ICON_DND]);
break;
}
break;
}
}
contactJList.repaint();
}
/** Updates contact list after a change. */
public void updateContactList(boolean sub) {
String fields1[], fields2[];
//x = "display name" <sip:user@host;tag=...>;tag=...
//return: [0] [1] [2] [...][:][...]
for(int a=0;a<Settings.current.sipcontacts.length;a++) {
fields1 = SIP.split(Settings.current.sipcontacts[a]);
boolean ok = false;
for(int b=0;b<contactList.size();b++) {
fields2 = SIP.split(contactList.get(b).contact);
if (fields1[0].equals(fields2[0])) {ok = true; break;}
}
if (!ok) {
Contact contact = new Contact(fields1[0], Settings.current.sipcontacts[a]);
contact.setIcon(ii[PIC_ICON_CLOSED]);
contactList.add(contact);
if (SIP.getFlag2(fields1, "monitor").equals("true")) addMonitor(Settings.current.sipcontacts[a], sub);
}
}
contactJList.setListData(contactList.toArray());
}
/** Update recent lists after a change. */
public void updateRecentList() {
recentList.setListData(Settings.current.callLog);
}
/** Call a contact (double-click). */
public void dialContact() {
String contact = ((Contact)contactJList.getSelectedValue()).contact;
String fields[] = SIP.split(contact);
if (line == -1) return;
if (lines[line].xfer) {
lines[line].dial = fields[1];
updateLine();
return;
}
if (lines[line].incall) return;
if (fields[1].length() == 0) return;
lines[line].dial = fields[1];
call();
}
/** Call a recent number (double-click). */
public void dialRecent() {
if (line == -1) return;
String dial = (String)recentList.getSelectedValue();
if ((dial == null) || (dial.length() == 0)) return;
if (lines[line].xfer) {
lines[line].dial = dial;
updateLine();
return;
}
if (lines[line].incall) return;
lines[line].dial = dial;
call();
}
/** Toggle side panel (contacts/recent lists). */
public void toggleContacts() {
showingContacts = !showingContacts;
wc.setPanelSize();
if (!showingContacts) {
sidePanel.setText(">");
} else {
sidePanel.setText("<");
}
}
public void toggleVideoPanel(int xline) {
if (!JFNative.loaded) return;
if (!Settings.current.nativeVideo) return;
PhoneLine pl = lines[xline];
if (pl.videoWindow == null) {
if (xline == -1) {
JFLog.log("Unable to start video : No line selected");
return;
}
if (!pl.talking) {
JFLog.log("Unable to start video : No call active");
return;
}
SDP.Stream vstream = lines[xline].sdp.getFirstVideoStream();
if (vstream == null) {
JFLog.log("Unable to start video : No video stream");
return;
}
if (vstream.codecs == null || vstream.codecs.length == 0 || getVideoCodec(xline) == null)
{
JFLog.log("Unable to start video: No video codec available");
return;
}
}
toggleVideoActive(xline);
if (line == xline) updateLine();
}
private Codec getVideoCodec(int xline) {
//returns first codec
if (lines[xline].sdp == null) return null;
SDP.Stream vstream = lines[xline].sdp.getFirstVideoStream();
if (vstream == null) return null;
if (vstream.codecs.length == 0) return null;
Codec codec = vstream.codecs[0];
if (LocalCamera.isRunning()) {
if (!LocalCamera.getCodec().name.equals(codec.name)) return null;
}
return codec;
}
private void toggleVideoActive(int xline) {
PhoneLine pl = lines[xline];
if (pl.videoWindow == null) {
Codec codec = getVideoCodec(xline);
if (codec == null) return;
RTP rtp = pl.videoRTP;
rtp.start(); //may not have started yet
pl.videoWindow = new VideoWindow(this, xline);
if (!LocalCamera.isRunning()) {
LocalCamera.setCodec(codec);
}
LocalCamera.enable(xline);
for(int a=0;a<pl.sdp.streams.length;a++) {
SDP.Stream stream = pl.sdp.streams[a];
if (stream.type == SDP.Type.video) {
if (stream.canRecv()) {
RTPChannel channel = rtp.getDefaultChannel();
if (channel == null || !channel.stream.content.equals(stream.content)) {
channel = rtp.createChannel(stream);
channel.start();
}
addRemoteCamera(pl, channel);
}
}
}
} else {
LocalCamera.disable(xline);
synchronized(pl.remoteCamerasLock) {
for(int a=0;a<pl.remoteCameras.size();a++) {
pl.remoteCameras.get(a).cancel();
}
pl.remoteCameras.clear();
}
pl.videoWindow.dispose();
pl.videoWindow = null;
}
}
/** Adds a new contact. */
public void addContact() {
String contact = EditContact.editContact(null, "\"New User\"<sip:@>", true);
if (contact == null) {JFLog.log("Contact is null"); return;}
String fields[] = SIP.split(contact);
Settings.setContact(fields[0], contact);
updateContactList(true);
Settings.saveSettings();
}
/** Edits an existing contact. */
public void editContact() {
Contact label = (Contact)contactJList.getSelectedValue();
if (label == null) return;
String contact = label.contact;
String orgcontact = contact;
String orgfields[] = SIP.split(contact);
String orgname = orgfields[0];
contact = EditContact.editContact(null, contact, false);
if (contact == null) return;
String fields[] = SIP.split(contact);
if (!fields[0].equals(orgname)) {
Settings.delContact(orgname);
if (SIP.getFlag2(orgfields, "monitor").equals("true")) delMonitor(orgcontact);
for(int a=0;a<contactList.size();a++) {
String fields2[] = SIP.split(contactList.get(a).contact);
if (fields2[0].equals(orgname)) {
contactList.remove(a);
break;
}
}
} else {
if ((SIP.getFlag2(orgfields, "monitor").equals("true")) && (SIP.getFlag2(fields, "monitor").equals("false"))) delMonitor(orgcontact);
for(int a=0;a<contactList.size();a++) {
String fields2[] = SIP.split(contactList.get(a).contact);
if (fields2[0].equals(fields[0])) {
contactList.get(a).contact = contact;
break;
}
}
}
Settings.setContact(fields[0], contact);
updateContactList(true);
Settings.saveSettings();
}
/** Deletes a contact. */
public void delContact() {
Contact label = (Contact)contactJList.getSelectedValue();
if (label == null) return;
String contact = label.contact;
String fields[] = SIP.split(contact);
if (JOptionPane.showConfirmDialog(this, "Delete " + fields[0] + "?", "Delete entry?", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) return;
Settings.delContact(fields[0]);
for(int a=0;a<contactList.size();a++) {
String fields2[] = SIP.split(contactList.get(a).contact);
if (fields2[0].equals(fields[0])) {
contactList.remove(a);
break;
}
}
updateContactList(true);
Settings.saveSettings();
if (SIP.getFlag2(fields, "monitor").equals("true")) delMonitor(contact);
}
public void hld_setIcon(ImageIcon ii) {
hld.setIcon(ii);
}
public void aa_setIcon(ImageIcon ii) {
aa.setIcon(ii);
}
public void ac_setIcon(ImageIcon ii) {
ac.setIcon(ii);
}
public void dnd_setIcon(ImageIcon ii) {
dnd.setIcon(ii);
}
public void cnf_setIcon(ImageIcon ii) {
cnf.setIcon(ii);
}
public void mute_setIcon(ImageIcon ii) {
mute.setIcon(ii);
}
public void spk_setIcon(ImageIcon ii) {
spk.setIcon(ii);
}
public void setFonts() {
// JFLog.log("Font name= " + l1.getFont().getName() + ",stype=" + l1.getFont().getStyle() + ",size=" + l1.getFont().getSize() );
//sets font sizes for all buttons
int small = 10;
int large = 12; //default size
if (Settings.current.smallerFont) {
small -= 2;
large -= 2;
}
Font smallFont = new java.awt.Font("Dialog", 0, small);
Font largeFont = new java.awt.Font("Dialog", 0, large);
//these components use three or more letter and require a smaller font
clear.setFont(smallFont);
//the remaining components are okay with the normal font
sidePanel.setFont(largeFont);
addContact.setFont(largeFont);
editContact.setFont(largeFont);
delContact.setFont(largeFont);
contactLabel.setFont(largeFont);
recentLabel.setFont(largeFont);
}
public void setPresenceStatus() {
presenceStatus.setSelectedIndex(0);
if (Settings.current.usePublish) {
presenceStatus.setEnabled(true);
} else {
presenceStatus.setEnabled(false);
}
}
public void publishPresence() {
if (line == -1) return;
String state = (String)presenceStatus.getSelectedItem();
if (state.equals("Auto")) {
if (lines[line].incall) state = "busy"; else state = "open";
} else if (state.equals("DND")) {
state = "dnd";
} else if (state.equals("Busy")) {
state = "busy";
} else if (state.equals("Idle")) {
state = "idle";
} else if (state.equals("Offline")) {
state = "closed";
}
for(int a=0;a<6;a++) {
if (Settings.current.lines[a].same != -1) continue;
if (lines[a].sip == null) continue;
if (!lines[a].sip.isRegistered()) continue;
lines[a].sip.publish(state);
}
}
//NOTE:using "presence" here, could also use "reg" to track registration
public void addMonitor(String contact, boolean sub) {
// JFLog.log("addMonitor:" + contact);
String fields[] = SIP.split(contact);
//only want first 3 fields in the monitorList
String fields3[] = new String[3];
fields3[0] = fields[0];
fields3[1] = fields[1];
fields3[2] = fields[2];
String contact3 = SIP.join(fields3);
monitorList.add(contact3);
if (!sub) return;
//we need to see if a SIP is already registered that we can subscribe to
for(int a=0;a<6;a++) {
if (lines[a].sip == null) continue;
if (!lines[a].sip.isRegistered()) continue;
if (lines[a].sip.getRemoteHost().equals(fields[3])) {
//found one that matches
lines[a].sip.subscribe(fields3[1], "presence", 3600);
return;
}
}
}
public void delMonitor(String contact) {
String fields[] = SIP.split(contact);
String fields3[] = new String[3];
fields3[0] = fields[0];
fields3[1] = fields[1];
fields3[2] = fields[2];
String contact3 = SIP.join(fields3);
for(int a=0;a<monitorList.size();a++) {
if (monitorList.get(a).equals(contact3)) {
monitorList.remove(a);
break;
}
}
//we need to see if a SIP is already registered that we can subscribe to
for(int a=0;a<6;a++) {
if (lines[a].sip == null) continue;
if (!lines[a].sip.isRegistered()) continue;
if (lines[a].sip.getRemoteHost().equals(fields[3])) {
//found one that matches
lines[a].sip.subscribe(fields3[1], "presence", 0);
return;
}
}
}
public void clearMonitor() {
monitorList = new Vector<String>();
}
public void monitorSubscribe(SIPClient sip) {
//subscribe for any that belong to sip
String server = sip.getRemoteHost();
for(int a=0;a<monitorList.size();a++) {
String contact = monitorList.get(a);
String fields[] = SIP.split(contact);
if (fields[2].equalsIgnoreCase(server)) {
sip.subscribe(fields[1], "presence", 3600);
}
}
}
public void onRegister(SIPClient sip) {
if ((Settings.current.usePublish) && (presenceStatus.getSelectedIndex() == 0)) lines[line].sip.publish("open");
monitorSubscribe(sip);
}
public Dimension getPreferredSize() {
int x = 290;
int y = 360;
if (showingContacts) x += 270;
return new Dimension(x, y);
}
//NOTE : H.263 Valid sizes are 128x96, 176x144, 352x288, 704x576, and 1408x1152
public static final int vx = 352;
public static final int vy = 288;
public void rtp_jpeg_receive(RTPChannel channel, byte data[], int pos, int len) {
RemoteCamera camera = findRemoteCamera(channel);
if (camera != null) camera.rtp_jpeg_data(data, pos, len);
}
public void rtp_h263_receive(RTPChannel channel, byte data[], int pos, int len) {
RemoteCamera camera = findRemoteCamera(channel);
if (camera != null) camera.rtp_h263_data(data, pos, len);
}
public void rtp_h263_1998_receive(RTPChannel channel, byte data[], int pos, int len) {
RemoteCamera camera = findRemoteCamera(channel);
if (camera != null) camera.rtp_h263_1998_data(data, pos, len);
}
public void rtp_h263_2000_receive(RTPChannel channel, byte data[], int pos, int len) {
RemoteCamera camera = findRemoteCamera(channel);
if (camera != null) camera.rtp_h263_2000_data(data, pos, len);
}
public void rtp_h264_receive(RTPChannel channel, byte data[], int pos, int len) {
RemoteCamera camera = findRemoteCamera(channel);
if (camera != null) camera.rtp_h264_data(data, pos, len);
}
public void rtp_vp8_receive(RTPChannel channel, byte data[], int pos, int len) {
RemoteCamera camera = findRemoteCamera(channel);
if (camera != null) camera.rtp_vp8_data(data, pos, len);
}
public String getLineStatus() {
return status.getText();
}
public void toggleRecord() {
if (line == -1) return;
if (sound.record == null) {
Record record = new Record();
record.open();
sound.record = record;
} else {
Record record = sound.record;
sound.record = null;
JF.sleep(40);
record.close();
}
record.setIcon(ii[sound.record != null ? PIC_RED : PIC_GREY]);
}
private int find_best_length(byte data[], int offset, int length) {
//see if there is a 0,0,1 and return a length to that
//this way the next packet will start at a resync point
int a = 1;
while (data[offset + a] == 0) a++; //skip the one at the beginning of this packet
for(;a<length-3;a++) {
if (data[offset + a] == 0 && data[offset + a + 1] == 0 && data[offset + a + 2] == 1) return a;
}
return length;
}
private void printArray(String msg, byte data[], int offset, int datalen) {
StringBuilder sb = new StringBuilder();
sb.append(msg);
sb.append(",len=");
sb.append(Integer.toString(datalen));
sb.append('=');
while (datalen > 0) {
int packlen = datalen;
packlen = find_best_length(data, offset, packlen);
int printlen = packlen;
if (printlen > 16) printlen = 16;
sb.append(";packlen=" + packlen + "=");
for(int a=0;a<printlen;a++) {
if (a > 0) sb.append(',');
int b = ((int)data[offset + a]) & 0xff;
if (b < 16) sb.append('0');
sb.append(Integer.toString(b, 16));
}
datalen -= packlen;
offset += packlen;
}
JFLog.log(sb.toString());
}
private boolean validSIPRange() {
if (Settings.current.sipmin <= 0) return false;
if (Settings.current.sipmax <= 0) return false;
if (Settings.current.sipmax < Settings.current.sipmin) return false;
if (Settings.current.sipmax - Settings.current.sipmin < 32) return false;
return true;
}
private boolean validRTPRange() {
if (Settings.current.rtpmin <= 0) return false;
if (Settings.current.rtpmax <= 0) return false;
if (Settings.current.rtpmax < Settings.current.rtpmin) return false;
if (Settings.current.rtpmax - Settings.current.rtpmin < 128) return false;
return true;
}
private void setPortRanges() {
if (Settings.current.sipRange && validSIPRange()) {
this.setSIPPortRange(Settings.current.sipmin, Settings.current.sipmax);
} else {
this.setSIPPortRange(5061, 5199);
}
if (Settings.current.rtpRange && validRTPRange()) {
RTP.setPortRange(Settings.current.rtpmin, Settings.current.rtpmax);
} else {
RTP.setPortRange(32768, 65534);
}
}
private void setNAT() {
SIPClient.NAT nat = null;
switch (Settings.current.nat) {
case 0: nat = SIPClient.NAT.None; break;
case 2: nat = SIPClient.NAT.STUN; break;
case 3: nat = SIPClient.NAT.TURN; break;
case 4: nat = SIPClient.NAT.ICE; break;
}
SIPClient.setNAT(nat, Settings.current.natHost, Settings.current.natUser, Settings.current.natPass);
SIPClient.useNATOnPrivateNetwork(Settings.current.natPrivate);
SIPClient.setEnableRport(Settings.current.rport);
SIPClient.setEnableReceived(Settings.current.received);
if (Settings.current.nat >= 3) {
RTP.enableTURN(Settings.current.natHost, Settings.current.natUser, Settings.current.natPass);
} else {
RTP.disableTURN();
}
}
private void reset() {
setPortRanges();
setNAT();
setFonts();
JFLog.setEnabled(!Settings.current.disableLogging);
wc.setPanelAlwaysOnTop(Settings.current.alwaysOnTop);
updateContactList(false);
updateRecentList();
if (!sound.init(lines, this)) {
JOptionPane.showMessageDialog(this,
"No compatible sound found",
"Warning",
JOptionPane.INFORMATION_MESSAGE);
}
setPresenceStatus();
setScales();
new Thread() {
public void run() {
reRegisterAll();
}
}.start();
if ((!Settings.isLinux) && (!Settings.isWindows)) {
videoPanel.setEnabled(false);
} else {
videoPanel.setEnabled(true);
}
}
public void doConfig() {
cfg.doClick();
}
}