package com.limegroup.gnutella.gui.options.panes;
import java.io.IOException;
import javax.swing.JCheckBox;
import javax.swing.JTextField;
import com.limegroup.gnutella.gui.DaapManager;
import com.limegroup.gnutella.gui.LabeledComponent;
import com.limegroup.gnutella.gui.SizedTextField;
import com.limegroup.gnutella.settings.DaapSettings;
public final class DaapSupportPaneItem extends AbstractPaneItem {
private final String DAAP_ENABLED_LABEL =
"OPTIONS_ITUNES_DAAP_SUPPORT_DAAP_ENABLED_LABEL";
private final String USE_BIO_LABEL =
"OPTIONS_ITUNES_DAAP_SUPPORT_USE_BIO_LABEL";
private final String SERVICE_NAME_LABEL =
"OPTIONS_ITUNES_DAAP_SUPPORT_SERVICE_NAME_LABEL";
private final JCheckBox DAAP_ENABLED = new JCheckBox();
private final JCheckBox USE_BIO = new JCheckBox();
private final JTextField SERVICE_NAME = new SizedTextField();
/**
* 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 locale-specific keys
*/
public DaapSupportPaneItem(final String key) {
super(key);
LabeledComponent comp = new LabeledComponent(DAAP_ENABLED_LABEL, DAAP_ENABLED,
LabeledComponent.LEFT_GLUE);
add(comp.getComponent());
add(getVerticalSeparator());
comp = new LabeledComponent(USE_BIO_LABEL, USE_BIO,
LabeledComponent.LEFT_GLUE);
add(comp.getComponent());
add(getVerticalSeparator());
add(getVerticalSeparator());
comp = new LabeledComponent(SERVICE_NAME_LABEL, SERVICE_NAME,
LabeledComponent.RIGHT_GLUE);
add(comp.getComponent());
}
/**
* 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() {
DAAP_ENABLED.setSelected(DaapSettings.DAAP_ENABLED.getValue() &&
DaapManager.instance().isServerRunning());
USE_BIO.setSelected(!DaapSettings.DAAP_USE_NIO.getValue());
SERVICE_NAME.setText(DaapSettings.DAAP_SERVICE_NAME.getValue());
}
/**
* 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 {
final boolean prevEnabled = DaapSettings.DAAP_ENABLED.getValue();
final boolean prevUseNIO = DaapSettings.DAAP_USE_NIO.getValue();
final String prevServiceName = DaapSettings.DAAP_SERVICE_NAME.getValue();
String serviceName = SERVICE_NAME.getText().trim();
if (serviceName.length()==0 && DAAP_ENABLED.isSelected()) {
throw new IOException();
}
DaapSettings.DAAP_ENABLED.setValue(DAAP_ENABLED.isSelected());
DaapSettings.DAAP_USE_NIO.setValue(!USE_BIO.isSelected());
DaapSettings.DAAP_SERVICE_NAME.setValue(serviceName);
DaapSettings.DAAP_LIBRARY_NAME.setValue(serviceName);
try {
if (DAAP_ENABLED.isSelected()) {
if (!prevEnabled || !USE_BIO.isSelected() != prevUseNIO) {
DaapManager.instance().restart();
} else if (!serviceName.equals(prevServiceName)) {
DaapManager.instance().updateService();
}
} else if (prevEnabled) {
DaapManager.instance().stop();
}
} catch (IOException err) {
DaapSettings.DAAP_ENABLED.setValue(prevEnabled);
DaapSettings.DAAP_USE_NIO.setValue(prevUseNIO);
DaapSettings.DAAP_SERVICE_NAME.setValue(prevServiceName);
DaapSettings.DAAP_LIBRARY_NAME.setValue(prevServiceName);
DaapManager.instance().stop();
initOptions();
throw err;
}
return false;
}
public boolean isDirty() {
return DaapSettings.DAAP_ENABLED.getValue() != DAAP_ENABLED.isSelected() ||
DaapSettings.DAAP_USE_NIO.getValue() == USE_BIO.isSelected() ||
!DaapSettings.DAAP_SERVICE_NAME.getValue().equals(SERVICE_NAME.getText()) ||
!DaapSettings.DAAP_LIBRARY_NAME.getValue().equals(SERVICE_NAME.getText());
}
}