package org.limewire.ui.swing.options;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import net.miginfocom.swing.MigLayout;
import org.limewire.core.api.Category;
import org.limewire.core.api.malware.VirusEngine;
import org.limewire.core.settings.MalwareSettings;
import org.limewire.core.settings.SharingSettings;
import org.limewire.setting.FileSetting;
import org.limewire.ui.swing.components.FocusJOptionPane;
import org.limewire.ui.swing.components.LabelTextField;
import org.limewire.ui.swing.options.actions.BrowseDirectoryAction;
import org.limewire.ui.swing.options.actions.CancelDialogAction;
import org.limewire.ui.swing.options.actions.DialogDisplayAction;
import org.limewire.ui.swing.options.actions.OKDialogAction;
import org.limewire.ui.swing.settings.SwingUiSettings;
import org.limewire.ui.swing.util.I18n;
import org.limewire.ui.swing.util.IconManager;
import org.limewire.ui.swing.util.ResizeUtils;
import org.limewire.ui.swing.util.SaveDirectoryHandler;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Downloads Option View.
*/
public class TransferOptionPanel extends OptionPanel {
private final Provider<IconManager> iconManager;
private final ManageSaveFoldersOptionPanelFactory manageFoldersOptionPanelFactory;
private final TransferLimitsOptionPanel connectionsOptionPanel;
private final BitTorrentOptionPanel bitTorrentOptionPanel;
private final VirusEngine virusEngine;
private DownloadsPanel downloadsPanel;
private TrayPanel trayPanel;
private TransferPanel transferPanel;
@Inject
public TransferOptionPanel(Provider<IconManager> iconManager,
ManageSaveFoldersOptionPanelFactory manageFoldersOptionPanelFactory,
Provider<TransferLimitsOptionPanel> connectionOptionPanel,
Provider<BitTorrentOptionPanel> bitTorrentOptionPanel,
VirusEngine virusEngine) {
this.iconManager = iconManager;
this.manageFoldersOptionPanelFactory = manageFoldersOptionPanelFactory;
this.connectionsOptionPanel = connectionOptionPanel.get();
this.bitTorrentOptionPanel = bitTorrentOptionPanel.get();
this.virusEngine = virusEngine;
setLayout(new MigLayout("insets 15 15 15 15, fillx, wrap, gap 4"));
add(getDownloadsPanel(), "pushx, growx, wrap");
add(getTrayPanel(), "pushx, growx, wrap");
add(getTransfersPanel(), "pushx, growx, wrap");
add(new JButton(new DialogDisplayAction(this, this.bitTorrentOptionPanel, I18n.tr("Configure Torrent Settings"), I18n.tr("Configure Torrent Settings..."), I18n.tr("Configure torrent settings."))), "wrap");
}
private OptionPanel getDownloadsPanel() {
if (downloadsPanel == null) {
downloadsPanel = new DownloadsPanel();
}
return downloadsPanel;
}
private OptionPanel getTrayPanel() {
if (trayPanel == null) {
trayPanel = new TrayPanel();
}
return trayPanel;
}
private OptionPanel getTransfersPanel() {
if (transferPanel == null) {
transferPanel = new TransferPanel();
}
return transferPanel;
}
@Override
void setOptionTabItem(OptionTabItem tab) {
super.setOptionTabItem(tab);
getDownloadsPanel().setOptionTabItem(tab);
getTrayPanel().setOptionTabItem(tab);
getTransfersPanel().setOptionTabItem(tab);
}
@Override
ApplyOptionResult applyOptions() {
ApplyOptionResult result = null;
result = getDownloadsPanel().applyOptions();
if (result.isSuccessful())
result.applyResult(getTrayPanel().applyOptions());
if (result.isSuccessful())
result.applyResult(getTransfersPanel().applyOptions());
if (result.isSuccessful())
result.applyResult(bitTorrentOptionPanel.applyOptions());
return result;
}
@Override
boolean hasChanged() {
return getDownloadsPanel().hasChanged() || getTrayPanel().hasChanged() || getTransfersPanel().hasChanged() || bitTorrentOptionPanel.hasChanged();
}
@Override
public void initOptions() {
getDownloadsPanel().initOptions();
getTrayPanel().initOptions();
getTransfersPanel().initOptions();
bitTorrentOptionPanel.initOptions();
}
/**
* Defines the Saving sub-panel in the Download options container.
*/
private class DownloadsPanel extends OptionPanel {
private String currentSaveDirectory;
private final LabelTextField downloadSaveTextField;
private final JButton browseSaveLocationButton;
private final JCheckBox autoRenameDuplicateFilesCheckBox;
private final JCheckBox useAntivirusCheckBox;
private final ManageSaveFoldersOptionPanel saveFolderPanel;
private final JButton multiLocationConfigureButton;
private final JRadioButton singleLocationButton;
private final JRadioButton multiLocationButton;
public DownloadsPanel() {
super(I18n.tr("Downloads"));
ButtonGroup downloadOptions = new ButtonGroup();
singleLocationButton = new JRadioButton(I18n.tr("Save all downloads to one folder:"));
multiLocationButton = new JRadioButton(I18n.tr("Save different categories to different folders"));
singleLocationButton.setOpaque(false);
multiLocationButton.setOpaque(false);
downloadOptions.add(singleLocationButton);
downloadOptions.add(multiLocationButton);
downloadSaveTextField = new LabelTextField(iconManager);
downloadSaveTextField.setEditable(false);
BrowseDirectoryAction directoryAction = new BrowseDirectoryAction(TransferOptionPanel.this, downloadSaveTextField);
downloadSaveTextField.addMouseListener(directoryAction);
browseSaveLocationButton = new JButton(directoryAction);
autoRenameDuplicateFilesCheckBox = new JCheckBox(I18n.tr("If the file already exists, download it with a different name"));
autoRenameDuplicateFilesCheckBox.setOpaque(false);
useAntivirusCheckBox = new JCheckBox(I18n.tr("Scan files I download for viruses"));
useAntivirusCheckBox.setOpaque(false);
add(singleLocationButton);
add(downloadSaveTextField, "span, growx");
add(browseSaveLocationButton, "wrap");
saveFolderPanel = manageFoldersOptionPanelFactory.create(new OKDialogAction(), new CancelDialogAction());
ResizeUtils.forceSize(saveFolderPanel, new Dimension(600, 430));
multiLocationConfigureButton = new JButton(new DialogDisplayAction(this,
saveFolderPanel, I18n.tr("Download Folders"), I18n.tr("Configure..."), I18n
.tr("Configure where different categories are downloaded")));
add(multiLocationButton);
add(multiLocationConfigureButton, "wrap");
add(autoRenameDuplicateFilesCheckBox, "wrap");
add(useAntivirusCheckBox, "hidemode 3, wrap");
ActionListener downloadSwitchAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (singleLocationButton.isSelected()) {
downloadSaveTextField.setVisible(true);
browseSaveLocationButton.setVisible(true);
multiLocationConfigureButton.setVisible(false);
} else {
downloadSaveTextField.setVisible(false);
browseSaveLocationButton.setVisible(false);
multiLocationConfigureButton.setVisible(true);
}
}
};
singleLocationButton.addActionListener(downloadSwitchAction);
multiLocationButton.addActionListener(downloadSwitchAction);
}
@Override
ApplyOptionResult applyOptions() {
if (singleLocationButton.isSelected() && saveFolderPanel.isConfigCustom()) {
saveFolderPanel.revertToDefault();
}
SwingUiSettings.AUTO_RENAME_DUPLICATE_FILES.setValue(autoRenameDuplicateFilesCheckBox
.isSelected());
if(virusEngine.isSupported()){
boolean isReEnable = useAntivirusCheckBox.isSelected()
&& MalwareSettings.VIRUS_SCANNER_ENABLED.getValue() == false;
MalwareSettings.VIRUS_SCANNER_ENABLED.setValue(useAntivirusCheckBox.isSelected());
if (isReEnable){
//check for av updates if the user re-enabled the scanner.
virusEngine.checkForUpdates();
}
}
final String save = downloadSaveTextField.getText();
if (!save.equals(currentSaveDirectory)) {
try {
File saveDir = new File(save);
if (!SaveDirectoryHandler.isDirectoryValid(saveDir)) {
if (!saveDir.mkdirs())
throw new IOException();
}
SharingSettings.setSaveDirectory(saveDir);
updateMediaSaveDirectories(currentSaveDirectory, save);
currentSaveDirectory = save;
} catch (Exception ioe) {
FocusJOptionPane.showMessageDialog(TransferOptionPanel.this, I18n
.tr("Could not save download directory, reverted to old directory"),
I18n.tr("Save Folder Error"), JOptionPane.ERROR_MESSAGE);
downloadSaveTextField.setText(currentSaveDirectory);
}
}
return saveFolderPanel.applyOptions();
}
/**
* Updates the save location for all media types.
*/
private void updateMediaSaveDirectories(String oldSaveDir, String newSaveDir) {
updateMediaSaveDirectory(Category.AUDIO, oldSaveDir, newSaveDir);
updateMediaSaveDirectory(Category.VIDEO, oldSaveDir, newSaveDir);
updateMediaSaveDirectory(Category.IMAGE, oldSaveDir, newSaveDir);
updateMediaSaveDirectory(Category.DOCUMENT, oldSaveDir, newSaveDir);
updateMediaSaveDirectory(Category.PROGRAM, oldSaveDir, newSaveDir);
updateMediaSaveDirectory(Category.OTHER, oldSaveDir, newSaveDir);
}
/**
* Update the save location for the specified media type. If the media
* save location is equal to the old or new default location, then the
* media setting is reverted to the default setting.
*/
private void updateMediaSaveDirectory(Category category, String oldSaveDir,
String newSaveDir) {
FileSetting mediaSetting = SharingSettings.getFileSettingForCategory(category);
if (!mediaSetting.isDefault()) {
String mediaSaveDir = mediaSetting.get().getAbsolutePath();
if (oldSaveDir.equals(mediaSaveDir) || newSaveDir.equals(mediaSaveDir)) {
mediaSetting.revertToDefault();
}
}
}
@Override
boolean hasChanged() {
return !currentSaveDirectory.equals(downloadSaveTextField.getText())
|| saveFolderPanel.hasChanged()
|| singleLocationButton.isSelected()
&& saveFolderPanel.isConfigCustom()
||MalwareSettings.VIRUS_SCANNER_ENABLED.getValue() != useAntivirusCheckBox.isSelected()
|| SwingUiSettings.AUTO_RENAME_DUPLICATE_FILES.getValue() != autoRenameDuplicateFilesCheckBox.isSelected();
}
public void setAVGCheckBoxVisible() {
boolean supported = virusEngine.isSupported();
useAntivirusCheckBox.setVisible(supported);
}
@Override
public void initOptions() {
autoRenameDuplicateFilesCheckBox
.setSelected(SwingUiSettings.AUTO_RENAME_DUPLICATE_FILES.getValue());
useAntivirusCheckBox.setSelected(MalwareSettings.VIRUS_SCANNER_ENABLED.getValue());
setAVGCheckBoxVisible();
saveFolderPanel.initOptions();
if (saveFolderPanel.isConfigCustom()) {
multiLocationButton.doClick();
} else {
singleLocationButton.doClick();
}
try {
File file = SharingSettings.getSaveDirectory();
if (file == null) {
file = SharingSettings.DEFAULT_SAVE_DIR;
if (file == null)
throw (new FileNotFoundException());
}
currentSaveDirectory = file.getCanonicalPath();
downloadSaveTextField.setText(file.getCanonicalPath());
} catch (FileNotFoundException fnfe) {
// simply use the empty string if we could not get the save
// directory.
currentSaveDirectory = "";
downloadSaveTextField.setText("");
} catch (IOException ioe) {
currentSaveDirectory = "";
downloadSaveTextField.setText("");
}
}
}
private class TrayPanel extends OptionPanel {
private JCheckBox closeTrayCheckBox;
private JCheckBox showBandwidthCheckBox;
private JCheckBox clearDownloadsCheckBox;
private JCheckBox clearUploadCheckBox;
// private JCheckBox deleteFileOnCancelCheckBox;
public TrayPanel() {
super(I18n.tr("Tray"));
closeTrayCheckBox = new JCheckBox(I18n.tr("Close tray when there are no transfers"));
closeTrayCheckBox.setOpaque(false);
showBandwidthCheckBox = new JCheckBox(I18n.tr("Show total bandwidth"));
showBandwidthCheckBox.setOpaque(false);
clearDownloadsCheckBox = new JCheckBox(I18n
.tr("Clear downloads from list when finished"));
clearDownloadsCheckBox.setOpaque(false);
clearUploadCheckBox = new JCheckBox(I18n.tr("Clear uploads from list when finished"));
clearUploadCheckBox.setOpaque(false);
// we aren't using deleteFileOnCancelCheckBox yet
// deleteFileOnCancelCheckBox = new
// JCheckBox(I18n.tr("When I cancel a download, delete the file"));
// deleteFileOnCancelCheckBox.setOpaque(false);
// deleteFileOnCancelCheckBox.setVisible(false);
add(closeTrayCheckBox, "wrap");
add(showBandwidthCheckBox, "wrap");
add(clearDownloadsCheckBox, "wrap");
add(clearUploadCheckBox, "wrap");
// add(deleteFileOnCancelCheckBox);
}
@Override
ApplyOptionResult applyOptions() {
SwingUiSettings.HIDE_BOTTOM_TRAY_WHEN_NO_TRANSFERS.setValue(closeTrayCheckBox.isSelected());
SwingUiSettings.SHOW_TOTAL_BANDWIDTH.setValue(showBandwidthCheckBox.isSelected());
SharingSettings.CLEAR_DOWNLOAD.setValue(clearDownloadsCheckBox.isSelected());
SharingSettings.CLEAR_UPLOAD.setValue(clearUploadCheckBox.isSelected());
// DownloadSettings.DELETE_CANCELED_DOWNLOADS.setValue(
// deleteFileOnCancelCheckBox.isSelected());
return new ApplyOptionResult(false, true);
}
@Override
boolean hasChanged() {
return (SwingUiSettings.HIDE_BOTTOM_TRAY_WHEN_NO_TRANSFERS.getValue() != closeTrayCheckBox.isSelected())
|| (SwingUiSettings.SHOW_TOTAL_BANDWIDTH.getValue() != showBandwidthCheckBox.isSelected())
|| (SharingSettings.CLEAR_DOWNLOAD.getValue() != clearDownloadsCheckBox.isSelected())
|| (SharingSettings.CLEAR_UPLOAD.getValue() != clearUploadCheckBox.isSelected());
// || DownloadSettings.DELETE_CANCELED_DOWNLOADS.getValue() !=
// deleteFileOnCancelCheckBox.isSelected();
}
@Override
public void initOptions() {
closeTrayCheckBox.setSelected(SwingUiSettings.HIDE_BOTTOM_TRAY_WHEN_NO_TRANSFERS.getValue());
showBandwidthCheckBox.setSelected(SwingUiSettings.SHOW_TOTAL_BANDWIDTH.getValue());
clearDownloadsCheckBox.setSelected(SharingSettings.CLEAR_DOWNLOAD.getValue());
clearUploadCheckBox.setSelected(SharingSettings.CLEAR_UPLOAD.getValue());
// deleteFileOnCancelCheckBox.setSelected(DownloadSettings.
// DELETE_CANCELED_DOWNLOADS.getValue());
}
}
private class TransferPanel extends OptionPanel {
public TransferPanel() {
super(I18n.tr("Upload/Download Limits"));
add(new JLabel(I18n.tr("Set limits on downloads and uploads")), "split");
add(new JButton(new DialogDisplayAction(this, connectionsOptionPanel, I18n.tr("Transfer Limits"), I18n.tr("Settings..."), I18n.tr("Configure transfer limit settings."))), "wrap");
}
@Override
ApplyOptionResult applyOptions() {
return connectionsOptionPanel.applyOptions();
}
@Override
boolean hasChanged() {
return connectionsOptionPanel.hasChanged();
}
@Override
public void initOptions() {
connectionsOptionPanel.initOptions();
}
}
}