/*
* SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.impl.media;
import java.util.*;
import javax.swing.table.*;
import net.java.sip.communicator.impl.media.codec.*;
/**
* @author Lubomir Marinov
*/
public class EncodingConfigurationTableModel
extends AbstractTableModel
{
public static final int AUDIO = DeviceConfigurationComboBoxModel.AUDIO;
private static final String[] NO_ENCODINGS = new String[0];
public static final int VIDEO = DeviceConfigurationComboBoxModel.VIDEO;
private final EncodingConfiguration encodingConfiguration;
private String[] encodings;
private final int type;
public EncodingConfigurationTableModel(
EncodingConfiguration encodingConfiguration, int type)
{
if (encodingConfiguration == null)
throw new IllegalArgumentException("encodingConfiguration");
if ((type != AUDIO) && (type != VIDEO))
throw new IllegalArgumentException("type");
this.encodingConfiguration = encodingConfiguration;
this.type = type;
}
public Class<?> getColumnClass(int columnIndex)
{
return (columnIndex == 0) ? Boolean.class : super
.getColumnClass(columnIndex);
}
public int getColumnCount()
{
return 2;
}
private String[] getEncodings()
{
if (encodings != null)
return encodings;
String[] availableEncodings;
switch (type)
{
case AUDIO:
availableEncodings =
encodingConfiguration.getAvailableAudioEncodings();
break;
case VIDEO:
availableEncodings =
encodingConfiguration.getAvailableVideoEncodings();
break;
default:
throw new IllegalStateException("type");
}
final int encodingCount = availableEncodings.length;
if (encodingCount < 1)
encodings = NO_ENCODINGS;
else
{
encodings = new String[encodingCount];
System
.arraycopy(availableEncodings, 0, encodings, 0, encodingCount);
Arrays.sort(encodings, 0, encodingCount, new Comparator<String>()
{
public int compare(String encoding0, String encoding1)
{
return encodingConfiguration.getPriority(encoding1) -
encodingConfiguration.getPriority(encoding0);
}
});
}
return encodings;
}
private int[] getPriorities()
{
String[] encodings = getEncodings();
final int count = encodings.length;
int[] priorities = new int[count];
for (int i = 0; i < count; i++)
{
int priority = encodingConfiguration.getPriority(encodings[i]);
priorities[i] = (priority > 0) ? (count - i) : 0;
}
return priorities;
}
public int getRowCount()
{
return getEncodings().length;
}
public Object getValueAt(int rowIndex, int columnIndex)
{
String encoding = getEncodings()[rowIndex];
switch (columnIndex)
{
case 0:
return (encodingConfiguration.getPriority(encoding) > 0);
case 1:
return MediaUtils.sdpToJmfEncoding(encoding);
default:
return null;
}
}
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return (columnIndex == 0);
}
public int move(int rowIndex, boolean up)
{
if (up)
{
if (rowIndex <= 0)
throw new IllegalArgumentException("rowIndex");
return move(rowIndex - 1, false) - 1;
}
if (rowIndex >= (getRowCount() - 1))
throw new IllegalArgumentException("rowIndex");
int[] priorities = getPriorities();
final int nextRowIndex = rowIndex + 1;
if (priorities[rowIndex] > 0)
priorities[rowIndex] = priorities.length - nextRowIndex;
if (priorities[nextRowIndex] > 0)
priorities[nextRowIndex] = priorities.length - rowIndex;
setPriorities(priorities);
String swap = encodings[rowIndex];
encodings[rowIndex] = encodings[nextRowIndex];
encodings[nextRowIndex] = swap;
fireTableRowsUpdated(rowIndex, nextRowIndex);
return nextRowIndex;
}
private void setPriorities(int[] priorities)
{
final int count = encodings.length;
if (priorities.length != count)
throw new IllegalArgumentException("priorities");
for (int i = 0; i < count; i++)
encodingConfiguration.setPriority(encodings[i], priorities[i]);
}
public void setValueAt(Object value, int rowIndex, int columnIndex)
{
if ((columnIndex == 0) && (value instanceof Boolean))
{
int[] priorities = getPriorities();
priorities[rowIndex] =
((Boolean) value) ? (priorities.length - rowIndex) : 0;
setPriorities(priorities);
fireTableCellUpdated(rowIndex, columnIndex);
}
}
}