package org.jivesoftware.sparkplugin.preferences; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import java.util.Vector; import javax.media.format.AudioFormat; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import net.java.sipmack.softphone.SoftPhoneManager; import org.jivesoftware.spark.component.VerticalFlowLayout; import org.jivesoftware.spark.plugin.phone.resource.PhoneRes; public class SipCodecs extends JPanel { private static final long serialVersionUID = 321651651106469534L; private static final String SEPERATOR = "\\^"; private static final String SEP = "^"; private JList _listSelected; private DefaultListModel _listSelectedModel; private JList _listAvailable; private DefaultListModel _listAvailableModel; public SipCodecs() { init(); } private void init() { _listSelectedModel = new DefaultListModel(); _listSelected = new JList(_listSelectedModel); _listAvailableModel = new DefaultListModel(); _listAvailable = new JList(_listAvailableModel); JScrollPane scrollSel = new JScrollPane(_listSelected); JScrollPane scrollAvail = new JScrollPane(_listAvailable); JButton btnLeft = new JButton(PhoneRes.getIString("codecs.select")); JButton btnRight = new JButton(PhoneRes.getIString("codecs.unselect")); JButton btnUp = new JButton(PhoneRes.getIString("codecs.up")); JButton btnDown = new JButton(PhoneRes.getIString("codecs.down")); btnUp.setMinimumSize(new Dimension(80, 25)); btnUp.setPreferredSize(new Dimension(80, 25)); btnUp.setMaximumSize(new Dimension(80, 25)); btnDown.setMaximumSize(new Dimension(80, 25)); btnDown.setPreferredSize(new Dimension(80, 25)); btnDown.setMaximumSize(new Dimension(80, 25)); JPanel panelButtonUpDown = new JPanel(); JPanel panelSelect = new JPanel(); JPanel panelAvailable = new JPanel(); // add actionlisteners btnLeft.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { left(); } }); btnRight.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { right(); } }); btnUp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { up(); } }); btnDown.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { down(); } }); // add Components panelButtonUpDown.setLayout(new VerticalFlowLayout( VerticalFlowLayout.MIDDLE)); panelButtonUpDown.add(btnUp); panelButtonUpDown.add(btnDown); panelSelect.setLayout(new BoxLayout(panelSelect, BoxLayout.Y_AXIS)); panelSelect.add(btnRight); panelSelect.add(new JLabel(PhoneRes.getIString("codecs.audio.selected") + ":")); panelSelect.add(scrollSel); panelAvailable .setLayout(new BoxLayout(panelAvailable, BoxLayout.Y_AXIS)); panelAvailable.add(btnLeft); panelAvailable.add(new JLabel(PhoneRes.getIString("codecs.audio.avail") + ":")); panelAvailable.add(scrollAvail); this.setLayout(new GridBagLayout()); this.add(panelButtonUpDown, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); this.add(panelSelect, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); this.add(panelAvailable, new GridBagConstraints(2, 0, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); } /** * set the codecs which where selected in the correct order * * @param sel */ public void setSelected(String sel) { // if there are no codecs selected, select all _listSelectedModel.removeAllElements(); if (sel == null || sel.trim().length() == 0) { sel = allCodecs(); // clear the available-Vector setAvailable(null); } String[] split = sel.split(SEPERATOR); for (String selsplit : split) { _listSelectedModel.addElement(selsplit); } } /** * set the codecs which where available * * @param avail */ public void setAvailable(String avail) { _listAvailableModel.removeAllElements(); if (avail == null || avail.equals("")) { return; } String[] split = avail.split(SEPERATOR); if (avail.trim() != "") for (String selavail : split) { _listAvailableModel.addElement(selavail); } } public String getSelected() { Vector<String> selected = new Vector<String>(); for (Object s : _listSelectedModel.toArray()) { String ss = (String) s; selected.add(ss); } return formatToString(selected); } public String getAvailable() { Vector<String> selected = new Vector<String>(); if (_listAvailableModel.toArray().length > 0) { for (Object s : _listAvailableModel.toArray()) { String ss = (String) s; selected.add(ss); } return formatToString(selected); } else return ""; } private String formatToString(Vector<String> vec) { String str = ""; for (String vecString : vec) { str = str + vecString + SEP; } return str; } /** * gets all the codecs from the fmjMediaManager and put them into a string * (seperated by SEPERATOR) * * @return */ private String allCodecs() { String all = ""; List<AudioFormat> codecs = SoftPhoneManager.getInstance() .getJmfMediaManager().getAudioFormats(); for (AudioFormat audio : codecs) { all = all + audio.getEncoding() + SEP; } return all; } /** * the selected Rows from the selected-codec-table will be moved to the * available-table */ private void right() { int[] selRows = _listSelected.getSelectedIndices();// tableSelected.getSelectedRows(); // check if there are rows selected if (selRows == null || selRows.length == 0) { JOptionPane.showMessageDialog(this, PhoneRes.getIString("book.noEntry"), PhoneRes.getIString("book.warning"), JOptionPane.WARNING_MESSAGE); return; } Vector<String> removelater = new Vector<String>(); for (int i = 0; i < selRows.length; i++) { String item = (String) _listSelectedModel.elementAt(selRows[i]); _listAvailableModel.addElement(item); removelater.add(item); } for (String item : removelater) { _listSelectedModel.removeElement(item); } _listSelected.updateUI(); _listAvailable.updateUI(); } /** * the selected Rows from the available-codec-table will be moved to the * selected-table */ private void left() { int[] selRows = _listAvailable.getSelectedIndices();// tableAvailable.getSelectedRows(); // check if there are rows selected if (selRows == null || selRows.length == 0) { JOptionPane.showMessageDialog(this, PhoneRes.getIString("book.noEntry"), PhoneRes.getIString("book.warning"), JOptionPane.WARNING_MESSAGE); return; } Vector<String> removelater = new Vector<String>(); for (int i = 0; i < selRows.length; i++) { String item = (String) _listAvailableModel.elementAt(selRows[i]); _listSelectedModel.addElement(item); removelater.add(item); } for (String item : removelater) { _listAvailableModel.removeElement(item); } _listAvailable.updateUI(); _listSelected.updateUI(); } /** * changes the order of the selected Codecs (move selected Row up) */ private void up() { int oldindex = _listSelected.getSelectedIndex();// tableSelected.getSelectedRow(); if (oldindex > 0) { Object obj = _listSelected.getSelectedValue(); _listSelectedModel.removeElementAt(oldindex); _listSelectedModel.add(oldindex - 1, obj); } _listSelected.updateUI(); } /** * changes the order of the selected Codecs (move selected Row down) */ private void down() { int oldindex = _listSelected.getSelectedIndex();// tableSelected.getSelectedRow(); Object obj = _listSelected.getSelectedValue(); _listSelectedModel.removeElementAt(oldindex); _listSelectedModel.add(oldindex + 1, obj); _listSelected.updateUI(); } }