package org.limewire.ui.swing.options;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import net.miginfocom.swing.MigLayout;
import org.limewire.core.api.daap.DaapManager;
import org.limewire.core.settings.DaapSettings;
import org.limewire.core.settings.iTunesSettings;
import org.limewire.ui.swing.components.FocusJOptionPane;
import org.limewire.ui.swing.options.actions.OKDialogAction;
import org.limewire.ui.swing.util.I18n;
import com.google.inject.Inject;
public class ITunesOptionPanel extends OptionPanel {
private final JCheckBox addToITunesCheckBox;
private final DaapManager daapManager;
private OptionPanel iTunesSharePanel;
@Inject
public ITunesOptionPanel(DaapManager daapManager) {
this.daapManager = daapManager;
setLayout(new MigLayout("gapy 10"));
addToITunesCheckBox = new JCheckBox(I18n.tr("Add audio files I downloaded from LimeWire to iTunes"));
addToITunesCheckBox.setContentAreaFilled(false);
add(addToITunesCheckBox, "wrap");
add(getITunesSharePanel(), "wrap");
add(new JButton(new OKDialogAction()), "tag ok, gapleft push");
}
@Override
ApplyOptionResult applyOptions() {
iTunesSettings.ITUNES_SUPPORT_ENABLED.setValue(addToITunesCheckBox.isSelected());;
return getITunesSharePanel().applyOptions();
}
@Override
boolean hasChanged() {
return iTunesSettings.ITUNES_SUPPORT_ENABLED.getValue() != addToITunesCheckBox.isSelected()
|| getITunesSharePanel().hasChanged();
}
@Override
public void initOptions() {
getITunesSharePanel().initOptions();
addToITunesCheckBox.setSelected(iTunesSettings.ITUNES_SUPPORT_ENABLED.getValue());
}
private OptionPanel getITunesSharePanel() {
if(iTunesSharePanel == null) {
iTunesSharePanel = new ITunesSharePanel();
}
return iTunesSharePanel;
}
@Override
void setOptionTabItem(OptionTabItem tab) {
super.setOptionTabItem(tab);
getITunesSharePanel().setOptionTabItem(tab);
}
private class ITunesSharePanel extends OptionPanel {
private JCheckBox shareWithITunesCheckBox;
private JCheckBox requirePassWordCheckBox;
private JPasswordField passwordField;
public ITunesSharePanel() {
setLayout(new MigLayout("insets 0, gap 0"));
setOpaque(false);
shareWithITunesCheckBox = new JCheckBox(I18n.tr("Share audio and video files in Public Shared list on my local network with iTunes"));
shareWithITunesCheckBox.setContentAreaFilled(false);
shareWithITunesCheckBox.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
setPasswordVisible(shareWithITunesCheckBox.isSelected());
}
});
requirePassWordCheckBox = new JCheckBox(I18n.tr("Require password"));
requirePassWordCheckBox.setContentAreaFilled(false);
requirePassWordCheckBox.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
passwordField.setEnabled(requirePassWordCheckBox.isSelected());
}
});
passwordField = new JPasswordField(30);
passwordField.setEnabled(false);
add(shareWithITunesCheckBox, "split, wrap");
add(requirePassWordCheckBox, "gapleft 25, split");
add(passwordField);
setPasswordVisible(false);
}
@Override
ApplyOptionResult applyOptions() {
if(hasChanged()) {
final boolean prevEnabled = DaapSettings.DAAP_ENABLED.getValue();
final boolean prevRequiresPassword = DaapSettings.DAAP_REQUIRES_PASSWORD.getValue();
final String prevPassword = DaapSettings.DAAP_PASSWORD.get();
final boolean requiresPassword = requirePassWordCheckBox.isSelected();
String password = new String(passwordField.getPassword());
if (password.equals("") && requiresPassword) {
FocusJOptionPane.showMessageDialog(ITunesOptionPanel.this,
I18n.tr("Daap Password cannot be null, iTunes settings not saved"),
I18n.tr("iTunes Error"),
JOptionPane.ERROR_MESSAGE);
initOptions();
return new ApplyOptionResult(false,true);
}
//enable daap setting
DaapSettings.DAAP_ENABLED.setValue(shareWithITunesCheckBox.isSelected());
//save password value
if (!DaapSettings.DAAP_PASSWORD.equals(password)) {
DaapSettings.DAAP_PASSWORD.set(password);
}
try {
if (requiresPassword != prevRequiresPassword || (requiresPassword && !password.equals(prevPassword))) {
DaapSettings.DAAP_REQUIRES_PASSWORD.setValue(requiresPassword);
// A password is required now or password has changed,
// disconnect all users...
if (requiresPassword) {
daapManager.disconnectAll();
}
daapManager.updateService();
}
if (shareWithITunesCheckBox.isSelected()) {
if (prevEnabled) {
daapManager.restart();
} else if(!prevEnabled) {
daapManager.start();
}
} else if (prevEnabled) {
daapManager.stop();
}
} catch (IOException err) {
DaapSettings.DAAP_ENABLED.setValue(prevEnabled);
DaapSettings.DAAP_REQUIRES_PASSWORD.setValue(prevRequiresPassword);
DaapSettings.DAAP_PASSWORD.set(prevPassword);
daapManager.stop();
initOptions();
FocusJOptionPane.showMessageDialog(ITunesOptionPanel.this,
I18n.tr("Could not restart the Daap connection"),
I18n.tr("Daap Error"),
JOptionPane.ERROR_MESSAGE);
}
}
return new ApplyOptionResult(false, true);
}
@Override
boolean hasChanged() {
return DaapSettings.DAAP_ENABLED.getValue() != shareWithITunesCheckBox.isSelected() ||
DaapSettings.DAAP_REQUIRES_PASSWORD.getValue() != requirePassWordCheckBox.isSelected() ||
(requirePassWordCheckBox.isSelected() && DaapSettings.DAAP_PASSWORD.get() != requirePassWordCheckBox.getText());
}
@Override
public void initOptions() {
shareWithITunesCheckBox.setSelected(DaapSettings.DAAP_ENABLED.getValue());
requirePassWordCheckBox.setSelected(DaapSettings.DAAP_REQUIRES_PASSWORD.getValue());
if(requirePassWordCheckBox.isSelected()) {
passwordField.setText(DaapSettings.DAAP_PASSWORD.get());
}
setPasswordVisible(shareWithITunesCheckBox.isSelected());
}
private void setPasswordVisible(boolean value) {
requirePassWordCheckBox.setVisible(value);
passwordField.setVisible(value);
}
}
}