package com.limegroup.gnutella.gui.options.panes;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.Arrays;
import java.util.Vector;
import java.util.List;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.filters.IP;
import com.limegroup.gnutella.gui.ListEditor;
import com.limegroup.gnutella.settings.FilterSettings;
/**
* This class defines the panel in the options window that allows the user
* to add and remove ip addresses from a list of ip addresses to block.
*/
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
public final class IgnoreMessagesPaneItem extends AbstractPaneItem {
/**
* Constant handle to the <tt>ListEditor</tt> that adds and removes
* ips to ban.
*/
private final ListEditor MESSAGES_LIST = new ListEditor();
/**
* The constructor constructs all of the elements of this
* <tt>AbstractPaneItem</tt>.
*
* @param key the key for this <tt>AbstractPaneItem</tt> that the
* superclass uses to generate strings
*/
public IgnoreMessagesPaneItem(final String key) {
super(key);
add(MESSAGES_LIST);
MESSAGES_LIST.addListDataListener( new IPEnforcer() );
}
/**
* Defines the abstract method in <tt>AbstractPaneItem</tt>.<p>
*
* Sets the options for the fields in this <tt>PaneItem</tt> when the
* window is shown.
*/
public void initOptions() {
String[] bannedIps = FilterSettings.BLACK_LISTED_IP_ADDRESSES.getValue();
MESSAGES_LIST.setModel(new Vector(Arrays.asList(bannedIps)));
}
/**
* Defines the abstract method in <tt>AbstractPaneItem</tt>.<p>
*
* Applies the options currently set in this window, displaying an
* error message to the user if a setting could not be applied.
*
* @throws IOException if the options could not be applied for some reason
*/
public boolean applyOptions() throws IOException {
Vector model = MESSAGES_LIST.getModel();
String[] bannedIps = new String[model.size()];
model.copyInto(bannedIps);
FilterSettings.BLACK_LISTED_IP_ADDRESSES.setValue(bannedIps);
RouterService.adjustSpamFilters();
return false;
}
public boolean isDirty() {
List model = Arrays.asList(FilterSettings.BLACK_LISTED_IP_ADDRESSES.getValue());
return !model.equals(MESSAGES_LIST.getModel());
}
private class IPEnforcer implements ListDataListener {
public void intervalAdded(ListDataEvent lde) {
Vector model = (Vector)lde.getSource();
String ipString = (String)model.get(lde.getIndex0());
// Ensure that this ip can be constructed.
try {
new IP(ipString);
} catch(IllegalArgumentException e) {
// if it can't, remove it & beep.
MESSAGES_LIST.removeItem(lde.getIndex0());
Toolkit.getDefaultToolkit().beep();
}
}
public void intervalRemoved(ListDataEvent lde) { }
public void contentsChanged(ListDataEvent lde) {
Vector model = (Vector)lde.getSource();
String ipString = (String)model.get(lde.getIndex0());
try {
new IP(ipString);
} catch(IllegalArgumentException e) {
// if the new one can't be created, revert
// back to old model & beep.
String[] bannedIps =
FilterSettings.BLACK_LISTED_IP_ADDRESSES.getValue();
MESSAGES_LIST.setModel(new Vector(Arrays.asList(bannedIps)));
Toolkit.getDefaultToolkit().beep();
}
}
}
}