package org.limewire.ui.swing.options;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JSeparator;
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.DownloadSettings;
import org.limewire.core.settings.UploadSettings;
import org.limewire.ui.swing.components.EmbeddedComponentLabel;
import org.limewire.ui.swing.components.PeriodicFieldValidator;
import org.limewire.ui.swing.options.actions.CancelDialogAction;
import org.limewire.ui.swing.options.actions.OKDialogAction;
import org.limewire.ui.swing.util.BackgroundExecutorService;
import org.limewire.ui.swing.util.I18n;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Transfer Limits Option View.
*/
public class TransferLimitsOptionPanel extends OptionPanel {
private final DownloadsPanel downloadsPanel;
private final UploadsPanel uploadPanel;
private final Provider<TorrentManager> torrentManager;
private final TorrentManagerSettings torrentSettings;
@Inject
public TransferLimitsOptionPanel(Provider<TorrentManager> torrentManager,
@TorrentSettingsAnnotation TorrentManagerSettings torrentSettings) {
this.torrentManager = torrentManager;
this.torrentSettings = torrentSettings;
this.downloadsPanel = new DownloadsPanel();
this.uploadPanel = new UploadsPanel();
setLayout(new MigLayout("fill"));
setOpaque(false);
add(downloadsPanel, "pushx, growx, wrap");
add(new JSeparator(), "growx, wrap");
add(uploadPanel, "pushx, growx, wrap");
add(new JButton(new OKDialogAction()), "tag ok, alignx right, split 2");
add(new JButton(new CancelDialogAction()), "tag cancel");
}
@Override
ApplyOptionResult applyOptions() {
ApplyOptionResult result = null;
result = downloadsPanel.applyOptions();
if (result.isSuccessful())
result.applyResult(uploadPanel.applyOptions());
if (result.isSuccessful() && torrentManager.get().isInitialized() && torrentManager.get().isValid()) {
BackgroundExecutorService.execute(new Runnable() {
@Override
public void run() {
torrentManager.get().setTorrentManagerSettings(torrentSettings);
}
});
}
return result;
}
@Override
void setOptionTabItem(OptionTabItem tab) {
super.setOptionTabItem(tab);
getDownloadsPanel().setOptionTabItem(tab);
getUploadPanel().setOptionTabItem(tab);
}
private DownloadsPanel getDownloadsPanel() {
return downloadsPanel;
}
private UploadsPanel getUploadPanel() {
return uploadPanel;
}
@Override
boolean hasChanged() {
return downloadsPanel.hasChanged() || uploadPanel.hasChanged();
}
@Override
public void initOptions() {
downloadsPanel.initOptions();
uploadPanel.initOptions();
}
private class DownloadsPanel extends OptionPanel {
private static final int MIN_DOWNLOADS = 1;
private static final int MAX_DOWNLOADS = 999;
private final JSpinner maxDownloadSpinner;
private final JSpinner maxDownloadSpeedSpinner;
private final JCheckBox limitBandWidthCheckBox;
private final EmbeddedComponentLabel maxDownloadSpeedController;
public DownloadsPanel() {
setLayout(new MigLayout("insets 4, fill, nogrid"));
setOpaque(false);
maxDownloadSpinner = new JSpinner(new SpinnerNumberModel(MIN_DOWNLOADS, MIN_DOWNLOADS,
MAX_DOWNLOADS, 1));
JFormattedTextField maxDownloadField = ((JSpinner.DefaultEditor)maxDownloadSpinner.getEditor()).getTextField();
maxDownloadField.addKeyListener(new PeriodicFieldValidator(maxDownloadField));
maxDownloadSpeedSpinner = new JSpinner(new SpinnerNumberModel(
DownloadSettings.MAX_DOWNLOAD_SPEED.getValue() / 1024,
DownloadSettings.MAX_DOWNLOAD_SPEED.getMinValue().intValue() / 1024,
DownloadSettings.MAX_DOWNLOAD_SPEED.getMaxValue().intValue() / 1024, 1));
JFormattedTextField maxDownloadSpeedField = ((JSpinner.DefaultEditor)maxDownloadSpeedSpinner.getEditor()).getTextField();
maxDownloadSpeedField.addKeyListener(new PeriodicFieldValidator(maxDownloadSpeedField));
limitBandWidthCheckBox = new JCheckBox(I18n.tr("Limit your download bandwidth"));
limitBandWidthCheckBox.setContentAreaFilled(false);
maxDownloadSpeedController = new EmbeddedComponentLabel("{c} KB/s", maxDownloadSpeedSpinner);
maxDownloadSpeedController.setVisible(false);
limitBandWidthCheckBox.addItemListener(new CheckBoxListener(maxDownloadSpeedController,
limitBandWidthCheckBox));
add(new JLabel(I18n.tr("Maximum downloads at once:")));
add(maxDownloadSpinner, "wrap");
add(limitBandWidthCheckBox);
add(maxDownloadSpeedController, "wrap");
}
@Override
ApplyOptionResult applyOptions() {
DownloadSettings.MAX_SIM_DOWNLOAD.setValue((Integer) maxDownloadSpinner.getModel()
.getValue());
DownloadSettings.MAX_DOWNLOAD_SPEED
.setValue((Integer) maxDownloadSpeedSpinner.getValue() * 1024);
DownloadSettings.LIMIT_MAX_DOWNLOAD_SPEED.setValue(limitBandWidthCheckBox.isSelected());
return new ApplyOptionResult(false, true);
}
@Override
boolean hasChanged() {
return DownloadSettings.MAX_SIM_DOWNLOAD.getValue() != (Integer) maxDownloadSpinner
.getModel().getValue()
|| DownloadSettings.MAX_DOWNLOAD_SPEED.getValue() != ((Integer) maxDownloadSpeedSpinner
.getValue() * 1024)
|| DownloadSettings.LIMIT_MAX_DOWNLOAD_SPEED.getValue() != limitBandWidthCheckBox
.isSelected();
}
@Override
public void initOptions() {
maxDownloadSpeedSpinner.setValue(DownloadSettings.MAX_DOWNLOAD_SPEED.getValue() / 1024);
limitBandWidthCheckBox
.setSelected(DownloadSettings.LIMIT_MAX_DOWNLOAD_SPEED.getValue());
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 limitBandwidthCheckBox;
private JSpinner maxUploadSpeedSpinner;
private final EmbeddedComponentLabel maxUploadSpeedController;
public UploadsPanel() {
setLayout(new MigLayout("insets 4, fill, nogrid"));
setOpaque(false);
maxUploadSpinner = new JSpinner(new SpinnerNumberModel(MIN_UPLOADS, MIN_UPLOADS,
MAX_UPLOADS, 1));
JFormattedTextField maxUploadField = ((JSpinner.DefaultEditor)maxUploadSpinner.getEditor()).getTextField();
maxUploadField.addKeyListener(new PeriodicFieldValidator(maxUploadField));
limitBandwidthCheckBox = new JCheckBox(I18n.tr("Limit your upload bandwidth"));
limitBandwidthCheckBox.setContentAreaFilled(false);
maxUploadSpeedSpinner = new JSpinner(new SpinnerNumberModel(UploadSettings.MAX_UPLOAD_SPEED
.getValue()/1024, UploadSettings.MAX_UPLOAD_SPEED.getMinValue().intValue()/1024,
UploadSettings.MAX_UPLOAD_SPEED.getMaxValue().intValue()/1024, 1));
JFormattedTextField maxUploadSpeedField = ((JSpinner.DefaultEditor)maxUploadSpeedSpinner.getEditor()).getTextField();
maxUploadSpeedField.addKeyListener(new PeriodicFieldValidator(maxUploadSpeedField));
maxUploadSpeedController = new EmbeddedComponentLabel("{c} KB/s", maxUploadSpeedSpinner);
maxUploadSpeedController.setVisible(false);
limitBandwidthCheckBox.addItemListener(new CheckBoxListener(maxUploadSpeedController,
limitBandwidthCheckBox));
add(new JLabel(I18n.tr("Maximum uploads at once:")));
add(maxUploadSpinner, "wrap");
add(limitBandwidthCheckBox);
add(maxUploadSpeedController, "wrap");
}
@Override
ApplyOptionResult applyOptions() {
UploadSettings.HARD_MAX_UPLOADS.setValue((Integer) maxUploadSpinner.getModel()
.getValue());
UploadSettings.MAX_UPLOAD_SPEED.setValue((Integer) maxUploadSpeedSpinner.getValue() * 1024);
UploadSettings.LIMIT_MAX_UPLOAD_SPEED.setValue(limitBandwidthCheckBox.isSelected());
return new ApplyOptionResult(false, true);
}
@Override
boolean hasChanged() {
return UploadSettings.HARD_MAX_UPLOADS.getValue() != (Integer) maxUploadSpinner
.getModel().getValue()
|| (UploadSettings.MAX_UPLOAD_SPEED.getValue() != (Integer) maxUploadSpeedSpinner
.getValue() * 1024)
|| UploadSettings.LIMIT_MAX_UPLOAD_SPEED.getValue() != limitBandwidthCheckBox
.isSelected();
}
@Override
public void initOptions() {
maxUploadSpeedSpinner.setValue(UploadSettings.MAX_UPLOAD_SPEED.getValue() / 1024);
maxUploadSpinner.getModel().setValue(UploadSettings.HARD_MAX_UPLOADS.getValue());
limitBandwidthCheckBox.setSelected(UploadSettings.LIMIT_MAX_UPLOAD_SPEED.getValue());
}
}
private static class CheckBoxListener implements ItemListener {
private JComponent component;
private JCheckBox checkBox;
public CheckBoxListener(JComponent slider, JCheckBox checkBox) {
this.component = slider;
this.checkBox = checkBox;
}
@Override
public void itemStateChanged(ItemEvent e) {
component.setVisible(checkBox.isSelected());
}
}
}