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.JOptionPane; import javax.swing.JRadioButton; import net.miginfocom.swing.MigLayout; 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 org.limewire.util.MediaType; import com.google.inject.Inject; import com.google.inject.Provider; /** * Downloads Option View. */ public class DownloadOptionPanel extends OptionPanel { private final Provider<IconManager> iconManager; private final ManageSaveFoldersOptionPanelFactory manageFoldersOptionPanelFactory; private SavingPanel savingPanel; private JCheckBox clearDownloadsCheckBox; //private JCheckBox deleteFileOnCancelCheckBox; @Inject public DownloadOptionPanel(Provider<IconManager> iconManager, ManageSaveFoldersOptionPanelFactory manageFoldersOptionPanelFactory) { this.iconManager = iconManager; this.manageFoldersOptionPanelFactory = manageFoldersOptionPanelFactory; setLayout(new MigLayout("insets 15 15 15 15, fillx, wrap, gap 4")); add(getSavingPanel(), "pushx, growx"); clearDownloadsCheckBox = new JCheckBox(I18n.tr("Clear downloads from list when finished")); clearDownloadsCheckBox.setContentAreaFilled(false); //we aren't using deleteFileOnCancelCheckBox yet //deleteFileOnCancelCheckBox = new JCheckBox(I18n.tr("When I cancel a download, delete the file")); //deleteFileOnCancelCheckBox.setContentAreaFilled(false); //deleteFileOnCancelCheckBox.setVisible(false); add(clearDownloadsCheckBox, "wrap"); //add(deleteFileOnCancelCheckBox); } private OptionPanel getSavingPanel() { if(savingPanel == null) { savingPanel = new SavingPanel(); } return savingPanel; } @Override boolean applyOptions() { SharingSettings.CLEAR_DOWNLOAD.setValue(clearDownloadsCheckBox.isSelected()); //DownloadSettings.DELETE_CANCELED_DOWNLOADS.setValue(deleteFileOnCancelCheckBox.isSelected()); return getSavingPanel().applyOptions(); } @Override boolean hasChanged() { return getSavingPanel().hasChanged() || SharingSettings.CLEAR_DOWNLOAD.getValue() != clearDownloadsCheckBox.isSelected(); // || DownloadSettings.DELETE_CANCELED_DOWNLOADS.getValue() != deleteFileOnCancelCheckBox.isSelected(); } @Override public void initOptions() { getSavingPanel().initOptions(); clearDownloadsCheckBox.setSelected(SharingSettings.CLEAR_DOWNLOAD.getValue()); //deleteFileOnCancelCheckBox.setSelected(DownloadSettings.DELETE_CANCELED_DOWNLOADS.getValue()); } /** * Defines the Saving sub-panel in the Download options container. */ private class SavingPanel extends OptionPanel { private String currentSaveDirectory; private LabelTextField downloadSaveTextField; private JButton browseSaveLocationButton; private JCheckBox autoRenameDuplicateFilesCheckBox; private ManageSaveFoldersOptionPanel saveFolderPanel; private JButton multiLocationConfigureButton; private JRadioButton singleLocationButton; private JRadioButton multiLocationButton; public SavingPanel() { super(I18n.tr("Saving Files")); 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(DownloadOptionPanel.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.setContentAreaFilled(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"); 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 boolean applyOptions() { if (singleLocationButton.isSelected() && saveFolderPanel.isConfigCustom()) { saveFolderPanel.revertToDefault(); } SwingUiSettings.AUTO_RENAME_DUPLICATE_FILES.setValue(autoRenameDuplicateFilesCheckBox.isSelected()); 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(DownloadOptionPanel.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(MediaType.getAudioMediaType(), oldSaveDir, newSaveDir); updateMediaSaveDirectory(MediaType.getVideoMediaType(), oldSaveDir, newSaveDir); updateMediaSaveDirectory(MediaType.getImageMediaType(), oldSaveDir, newSaveDir); updateMediaSaveDirectory(MediaType.getDocumentMediaType(), oldSaveDir, newSaveDir); updateMediaSaveDirectory(MediaType.getProgramMediaType(), oldSaveDir, newSaveDir); updateMediaSaveDirectory(MediaType.getOtherMediaType(), 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(MediaType mediaType, String oldSaveDir, String newSaveDir) { FileSetting mediaSetting = SharingSettings.getFileSettingForMediaType(mediaType); 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() || SwingUiSettings.AUTO_RENAME_DUPLICATE_FILES.getValue() != autoRenameDuplicateFilesCheckBox.isSelected(); } @Override public void initOptions() { autoRenameDuplicateFilesCheckBox.setSelected(SwingUiSettings.AUTO_RENAME_DUPLICATE_FILES.getValue()); 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(""); } } } }