package org.limewire.ui.swing.options;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import net.miginfocom.swing.MigLayout;
import org.limewire.bittorrent.TorrentManager;
import org.limewire.bittorrent.TorrentManagerSettings;
import org.limewire.bittorrent.TorrentSettingsAnnotation;
import org.limewire.core.settings.ConnectionSettings;
import org.limewire.core.settings.DownloadSettings;
import org.limewire.core.settings.SharingSettings;
import org.limewire.core.settings.SpeedConstants;
import org.limewire.core.settings.UploadSettings;
import org.limewire.ui.swing.util.I18n;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Connections Option View.
*/
public class ConnectionsOptionPanel extends OptionPanel {
private ConnectionSpeedPanel connectionSpeedPanel;
private DownloadsPanel downloadsPanel;
private UploadsPanel uploadPanel;
private final Provider<TorrentManager> torrentManager;
private final TorrentManagerSettings torrentSettings;
@Inject
public ConnectionsOptionPanel(Provider<TorrentManager> torrentManager, @TorrentSettingsAnnotation TorrentManagerSettings torrentSettings) {
this.torrentManager = torrentManager;
this.torrentSettings = torrentSettings;
setLayout(new MigLayout("insets 15 15 15 15, fillx, wrap", "", ""));
setOpaque(false);
add(getDownloadsPanel(), "pushx, growx");
add(getUploadPanel(), "pushx, growx");
add(getConnectionSpeedPanel(), "pushx, growx");
}
private OptionPanel getConnectionSpeedPanel() {
if(connectionSpeedPanel == null) {
connectionSpeedPanel = new ConnectionSpeedPanel();
}
return connectionSpeedPanel;
}
private OptionPanel getDownloadsPanel() {
if(downloadsPanel == null) {
downloadsPanel = new DownloadsPanel();
}
return downloadsPanel;
}
private OptionPanel getUploadPanel() {
if(uploadPanel == null) {
uploadPanel = new UploadsPanel();
}
return uploadPanel;
}
@Override
boolean applyOptions() {
boolean restart = getConnectionSpeedPanel().applyOptions();
restart |= getDownloadsPanel().applyOptions();
restart |= getUploadPanel().applyOptions();
if (torrentManager.get().isInitialized() && torrentManager.get().isValid()) {
torrentManager.get().setTorrentManagerSettings(torrentSettings);
}
return restart;
}
@Override
boolean hasChanged() {
return getConnectionSpeedPanel().hasChanged() ||
getDownloadsPanel().hasChanged() ||
getUploadPanel().hasChanged();
}
@Override
public void initOptions() {
getConnectionSpeedPanel().initOptions();
getDownloadsPanel().initOptions();
getUploadPanel().initOptions();
}
private static class ConnectionSpeedPanel extends OptionPanel {
private ButtonGroup buttonGroup;
private JRadioButton broadBandButton;
private JRadioButton dialupButton;
public ConnectionSpeedPanel() {
super(I18n.tr("Connection Speed"));
buttonGroup = new ButtonGroup();
broadBandButton = new JRadioButton(I18n.tr("Broadband"));
broadBandButton.setContentAreaFilled(false);
dialupButton = new JRadioButton(I18n.tr("Dial-up"));
dialupButton.setContentAreaFilled(false);
buttonGroup.add(broadBandButton);
buttonGroup.add(dialupButton);
add(new JLabel(I18n.tr("Set your connection speed")), "push");
add(broadBandButton);
add(dialupButton);
}
@Override
boolean applyOptions() {
ConnectionSettings.CONNECTION_SPEED.setValue(getSpeed(broadBandButton.isSelected()));
return false;
}
@Override
boolean hasChanged() {
return ConnectionSettings.CONNECTION_SPEED.getValue() != getSpeed(broadBandButton.isSelected());
}
@Override
public void initOptions() {
if(ConnectionSettings.CONNECTION_SPEED.getValue() == SpeedConstants.MODEM_SPEED_INT)
dialupButton.setSelected(true);
else
broadBandButton.setSelected(true);
}
private int getSpeed(boolean isBroadband) {
if(isBroadband) {
return SpeedConstants.CABLE_SPEED_INT;
} else {
return SpeedConstants.MODEM_SPEED_INT;
}
}
}
private class DownloadsPanel extends OptionPanel {
private static final int MIN_DOWNLOADS = 1;
private static final int MAX_DOWNLOADS = 999;
private JSpinner maxDownloadSpinner;
private JCheckBox limitBandWidthCheckBox;
private BandWidthSlider bandWidthSlider;
public DownloadsPanel() {
super(I18n.tr("Downloads"));
maxDownloadSpinner = new JSpinner(new SpinnerNumberModel(MIN_DOWNLOADS, MIN_DOWNLOADS, MAX_DOWNLOADS, 1));
limitBandWidthCheckBox = new JCheckBox(I18n.tr("Limit your download bandwidth"));
limitBandWidthCheckBox.setContentAreaFilled(false);
bandWidthSlider = new BandWidthSlider();
bandWidthSlider.setVisible(false);
limitBandWidthCheckBox.addItemListener(new CheckBoxListener(bandWidthSlider, limitBandWidthCheckBox));
add(new JLabel(I18n.tr("Don't allow more than")), "split");
add(maxDownloadSpinner, "split");
add(new JLabel(I18n.tr("downloads at once")), "wrap");
add(limitBandWidthCheckBox, "aligny 50%, split");
add(bandWidthSlider, "aligny 50%, wrap");
}
@Override
boolean applyOptions() {
DownloadSettings.MAX_SIM_DOWNLOAD.setValue((Integer) maxDownloadSpinner.getModel().getValue());
if(limitBandWidthCheckBox.isSelected()) {
DownloadSettings.DOWNLOAD_SPEED.setValue(bandWidthSlider.getValue());
} else {
DownloadSettings.DOWNLOAD_SPEED.setValue(BandWidthSlider.DEFAULT_SLIDER);
}
return false;
}
@Override
boolean hasChanged() {
return DownloadSettings.MAX_SIM_DOWNLOAD.getValue() != (Integer) maxDownloadSpinner.getModel().getValue()
|| DownloadSettings.DOWNLOAD_SPEED.getValue() != bandWidthSlider.getValue();
}
@Override
public void initOptions() {
bandWidthSlider.setValue(DownloadSettings.DOWNLOAD_SPEED.getValue());
if(DownloadSettings.DOWNLOAD_SPEED.getValue() == 100)
limitBandWidthCheckBox.setSelected(false);
else
limitBandWidthCheckBox.setSelected(true);
maxDownloadSpinner.getModel().setValue(DownloadSettings.MAX_SIM_DOWNLOAD.getValue());
}
}
private static class UploadsPanel extends OptionPanel {
private static final int MIN_UPLOADS = 0;
private static final int MAX_UPLOADS = 50;
private JSpinner maxUploadSpinner;
private JCheckBox uploadBandwidthCheckBox;
private JCheckBox clearUploadCheckBox;
private BandWidthSlider bandWidthSlider;
public UploadsPanel() {
super(I18n.tr("Uploads"));
maxUploadSpinner = new JSpinner(new SpinnerNumberModel(MIN_UPLOADS, MIN_UPLOADS, MAX_UPLOADS, 1));
uploadBandwidthCheckBox = new JCheckBox(I18n.tr("Limit your upload bandwidth"));
uploadBandwidthCheckBox.setContentAreaFilled(false);
clearUploadCheckBox = new JCheckBox(I18n.tr("Clear uploads from list when finished"));
clearUploadCheckBox.setContentAreaFilled(false);
bandWidthSlider = new BandWidthSlider();
bandWidthSlider.setVisible(false);
uploadBandwidthCheckBox.addItemListener(new CheckBoxListener(bandWidthSlider, uploadBandwidthCheckBox));
add(new JLabel(I18n.tr("Don't allow more than")), "split");
add(maxUploadSpinner, "split");
add(new JLabel(I18n.tr("uploads at once")), "wrap");
add(uploadBandwidthCheckBox, "aligny 50%, split");
add(bandWidthSlider, "aligny 50%, wrap");
add(clearUploadCheckBox, "split");
}
@Override
boolean applyOptions() {
UploadSettings.HARD_MAX_UPLOADS.setValue((Integer)maxUploadSpinner.getModel().getValue());
SharingSettings.CLEAR_UPLOAD.setValue(clearUploadCheckBox.isSelected());
if(uploadBandwidthCheckBox.isSelected()) {
UploadSettings.UPLOAD_SPEED.setValue(bandWidthSlider.getValue());
} else {
UploadSettings.UPLOAD_SPEED.setValue(BandWidthSlider.DEFAULT_SLIDER);
}
return false;
}
@Override
boolean hasChanged() {
return UploadSettings.HARD_MAX_UPLOADS.getValue() != (Integer) maxUploadSpinner.getModel().getValue()
|| UploadSettings.UPLOAD_SPEED.getValue() != bandWidthSlider.getValue()
|| SharingSettings.CLEAR_UPLOAD.getValue() != clearUploadCheckBox.isSelected();
}
@Override
public void initOptions() {
bandWidthSlider.setValue(UploadSettings.UPLOAD_SPEED.getValue());
maxUploadSpinner.getModel().setValue(UploadSettings.HARD_MAX_UPLOADS.getValue());
clearUploadCheckBox.setSelected(SharingSettings.CLEAR_UPLOAD.getValue());
if(UploadSettings.UPLOAD_SPEED.getValue() == 100)
uploadBandwidthCheckBox.setSelected(false);
else
uploadBandwidthCheckBox.setSelected(true);
}
}
private static class CheckBoxListener implements ItemListener {
private BandWidthSlider slider;
private JCheckBox checkBox;
public CheckBoxListener(BandWidthSlider slider, JCheckBox checkBox) {
this.slider = slider;
this.checkBox = checkBox;
}
@Override
public void itemStateChanged(ItemEvent e) {
slider.setVisible(checkBox.isSelected());
}
}
}