/*
* 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.media.*;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.impl.media.device.*;
/**
* @author Lubomir Marinov
*/
public class DeviceConfigurationComboBoxModel
implements ComboBoxModel
{
public static class CaptureDevice
{
public static boolean equals(CaptureDeviceInfo a, CaptureDeviceInfo b)
{
return (a == null) ? (b == null) : a.equals(b);
}
public final CaptureDeviceInfo info;
public CaptureDevice(CaptureDeviceInfo info)
{
this.info = info;
}
public String toString()
{
if (info == null)
return MediaActivator.getResources().getI18NString(
"impl.media.configform.NO_DEVICE");
return info.getName();
}
}
public static final int AUDIO = 1;
public static final int VIDEO = 2;
private final DeviceConfiguration deviceConfiguration;
private CaptureDevice[] devices;
private final List<ListDataListener> listeners =
new ArrayList<ListDataListener>();
private final int type;
public DeviceConfigurationComboBoxModel(
DeviceConfiguration deviceConfiguration, int type)
{
if (deviceConfiguration == null)
throw new IllegalArgumentException("deviceConfiguration");
if ((type != AUDIO) && (type != VIDEO))
throw new IllegalArgumentException("type");
this.deviceConfiguration = deviceConfiguration;
this.type = type;
}
public void addListDataListener(ListDataListener listener)
{
if (listener == null)
throw new IllegalArgumentException("listener");
if (!listeners.contains(listener))
listeners.add(listener);
}
protected void fireContentsChanged(int index0, int index1)
{
ListDataListener[] listeners =
this.listeners.toArray(new ListDataListener[this.listeners.size()]);
ListDataEvent event =
new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index0,
index1);
for (ListDataListener listener : listeners)
{
listener.contentsChanged(event);
}
}
private DeviceConfiguration getDeviceConfiguration()
{
return deviceConfiguration;
}
private CaptureDevice[] getDevices()
{
if (devices != null)
return devices;
DeviceConfiguration deviceConfiguration = getDeviceConfiguration();
CaptureDeviceInfo[] infos;
switch (type)
{
case AUDIO:
infos = deviceConfiguration.getAvailableAudioCaptureDevices();
break;
case VIDEO:
infos = deviceConfiguration.getAvailableVideoCaptureDevices();
break;
default:
throw new IllegalStateException("type");
}
final int deviceCount = infos.length;
devices = new CaptureDevice[deviceCount + 1];
for (int i = 0; i < deviceCount; i++)
{
devices[i] = new CaptureDevice(infos[i]);
}
devices[deviceCount] = new CaptureDevice(null);
return devices;
}
public Object getElementAt(int index)
{
return getDevices()[index];
}
private CaptureDevice getSelectedDevice()
{
DeviceConfiguration deviceConfiguration = getDeviceConfiguration();
CaptureDeviceInfo info;
switch (type)
{
case AUDIO:
info = deviceConfiguration.getAudioCaptureDevice();
break;
case VIDEO:
info = deviceConfiguration.getVideoCaptureDevice();
break;
default:
throw new IllegalStateException("type");
}
for (CaptureDevice device : getDevices())
{
if (CaptureDevice.equals(device.info, info))
return device;
}
return null;
}
public Object getSelectedItem()
{
return getSelectedDevice();
}
public int getSize()
{
return getDevices().length;
}
public void removeListDataListener(ListDataListener listener)
{
if (listener == null)
throw new IllegalArgumentException("listener");
listeners.remove(listener);
}
private void setSelectedDevice(CaptureDevice device)
{
// We cannot clear the selection of DeviceConfiguration.
if (device == null)
return;
CaptureDevice selectedDevice = getSelectedDevice();
if (selectedDevice != device)
{
DeviceConfiguration deviceConfiguration = getDeviceConfiguration();
switch (type)
{
case AUDIO:
deviceConfiguration.setAudioCaptureDevice(device.info);
break;
case VIDEO:
deviceConfiguration.setVideoCaptureDevice(device.info);
break;
}
fireContentsChanged(-1, -1);
}
}
public void setSelectedItem(Object item)
{
setSelectedDevice((CaptureDevice) item);
}
}