package org.limewire.ui.swing.options; import java.awt.event.ActionEvent; import java.io.File; import java.util.EnumMap; import java.util.Map; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import org.limewire.core.api.Category; import org.limewire.core.settings.SharingSettings; import org.limewire.setting.FileSetting; import org.limewire.ui.swing.action.AbstractAction; 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.util.CategoryIconManager; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.I18n; import org.limewire.ui.swing.util.IconManager; import org.limewire.util.Objects; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; /** * Defines the window panel for the Download Folders dialog, which manages the * save folders for individual media types. */ public class ManageSaveFoldersOptionPanel extends OptionPanel { /** Map containing initial save directories for various media types. */ private Map<Category, String> mediaDirectoryMap = new EnumMap<Category, String>(Category.class); private LabelTextField audioTextField; private LabelTextField videoTextField; private LabelTextField imageTextField; private LabelTextField documentTextField; private LabelTextField programTextField; private LabelTextField otherTextField; private JButton audioBrowseButton; private JButton videoBrowseButton; private JButton imageBrowseButton; private JButton documentBrowseButton; private JButton programBrowseButton; private JButton otherBrowseButton; private JButton defaultButton; private JButton okButton; private JButton cancelButton; /** * Constructs a ManageSaveFoldersOptionPanel with the specified managers * and actions. */ @Inject public ManageSaveFoldersOptionPanel(CategoryIconManager categoryIconManager, @Assisted Action okAction, @Assisted CancelDialogAction cancelAction, Provider<IconManager> iconManager) { GuiUtils.assignResources(this); setLayout(new MigLayout("fill, gapy 10")); audioTextField = new LabelTextField(iconManager); videoTextField = new LabelTextField(iconManager); imageTextField = new LabelTextField(iconManager); documentTextField = new LabelTextField(iconManager); programTextField = new LabelTextField(iconManager); otherTextField = new LabelTextField(iconManager); audioBrowseButton = new JButton(new BrowseDirectoryAction(this, audioTextField)); audioTextField.addMouseListener(audioBrowseButton.getAction()); videoBrowseButton = new JButton(new BrowseDirectoryAction(this, videoTextField)); videoTextField.addMouseListener(videoBrowseButton.getAction()); imageBrowseButton = new JButton(new BrowseDirectoryAction(this, imageTextField)); imageTextField.addMouseListener(imageBrowseButton.getAction()); documentBrowseButton = new JButton(new BrowseDirectoryAction(this, documentTextField)); documentTextField.addMouseListener(documentBrowseButton.getAction()); programBrowseButton = new JButton(new BrowseDirectoryAction(this, programTextField)); programTextField.addMouseListener(programBrowseButton.getAction()); otherBrowseButton = new JButton(new BrowseDirectoryAction(this, otherTextField)); otherTextField.addMouseListener(otherBrowseButton.getAction()); cancelAction.setOptionPanel(this); defaultButton = new JButton(new DefaultAction()); okButton = new JButton(okAction); cancelButton = new JButton(cancelAction); add(new JLabel(I18n.tr("Choose where specific file types get saved")), "span, wrap"); add(new JLabel(I18n.tr("Audio"), categoryIconManager.getIcon(Category.AUDIO), SwingConstants.RIGHT), "span, wrap"); add(audioTextField, "growx"); add(audioBrowseButton, "gapleft 30, wrap"); add(new JLabel(I18n.tr("Video"), categoryIconManager.getIcon(Category.VIDEO), SwingConstants.RIGHT), "span, wrap"); add(videoTextField, "growx"); add(videoBrowseButton, "gapleft 30, wrap"); add(new JLabel(I18n.tr("Images"), categoryIconManager.getIcon(Category.IMAGE), SwingConstants.RIGHT), "span, wrap"); add(imageTextField, "growx"); add(imageBrowseButton, "gapleft 30, wrap"); add(new JLabel(I18n.tr("Documents"), categoryIconManager.getIcon(Category.DOCUMENT), SwingConstants.RIGHT), "span, wrap"); add(documentTextField, "growx"); add(documentBrowseButton, "gapleft 30, wrap"); add(new JLabel(I18n.tr("Programs"), categoryIconManager.getIcon(Category.PROGRAM), SwingConstants.RIGHT), "span, wrap"); add(programTextField, "growx"); add(programBrowseButton, "gapleft 30, wrap"); add(new JLabel(I18n.tr("Other"), categoryIconManager.getIcon(Category.OTHER), SwingConstants.RIGHT), "span, wrap"); add(otherTextField, "growx"); add(otherBrowseButton, "gapleft 30, wrap"); add(defaultButton, "gaptop 10, span, split 3, push"); add(okButton, "tag ok, alignx right, gaptop 10"); add(cancelButton, "tag cancel, alignx right, gaptop 10"); } @Override ApplyOptionResult applyOptions() { applyOption(Category.AUDIO, audioTextField); applyOption(Category.VIDEO, videoTextField); applyOption(Category.IMAGE, imageTextField); applyOption(Category.DOCUMENT, documentTextField); applyOption(Category.PROGRAM, programTextField); applyOption(Category.OTHER, otherTextField); return new ApplyOptionResult(false, true); } private void revertToDefault(LabelTextField textField) { textField.setText(SharingSettings.getSaveDirectory().getAbsolutePath()); } void revertToDefault() { revertToDefault(audioTextField); revertToDefault(videoTextField); revertToDefault(imageTextField); revertToDefault(documentTextField); revertToDefault(programTextField); revertToDefault(otherTextField); } boolean isConfigCustom() { File defaultLocation = SharingSettings.getSaveDirectory(); if (!SharingSettings.getFileSettingForCategory(Category.AUDIO).get() .equals(defaultLocation)) { return true; } if (!SharingSettings.getFileSettingForCategory(Category.VIDEO).get() .equals(defaultLocation)) { return true; } if (!SharingSettings.getFileSettingForCategory(Category.IMAGE).get() .equals(defaultLocation)) { return true; } if (!SharingSettings.getFileSettingForCategory(Category.DOCUMENT).get() .equals(defaultLocation)) { return true; } if (!SharingSettings.getFileSettingForCategory(Category.PROGRAM).get() .equals(defaultLocation)) { return true; } if (!SharingSettings.getFileSettingForCategory(Category.OTHER).get() .equals(defaultLocation)) { return true; } return false; } private void applyOption(Category mediaType, LabelTextField textField) { if (hasChanged(mediaType, textField)) { FileSetting saveDirSetting = SharingSettings.getFileSettingForCategory(mediaType); String newSaveDirString = textField.getText(); // Apply media save directory. If the new value is equal to the // default save directory, then revert the setting to the default. String saveDirString = SharingSettings.getSaveDirectory().getAbsolutePath(); if (!newSaveDirString.equals(saveDirString)) { File newSaveDir = new File(newSaveDirString); saveDirSetting.set(newSaveDir); } else { saveDirSetting.revertToDefault(); } } } @Override boolean hasChanged() { return hasChanged(Category.AUDIO, audioTextField) || hasChanged(Category.VIDEO, videoTextField) || hasChanged(Category.IMAGE, imageTextField) || hasChanged(Category.DOCUMENT, documentTextField) || hasChanged(Category.PROGRAM, programTextField) || hasChanged(Category.OTHER, otherTextField); } private boolean hasChanged(Category mediaType, LabelTextField textField) { // Compare text field to initial value. We cannot compare to the // FileSetting value because it may change if the default save // directory is updated. String oldSaveDirString = mediaDirectoryMap.get(mediaType); String newSaveDirString = textField.getText(); return !Objects.equalOrNull(oldSaveDirString, newSaveDirString); } @Override public void initOptions() { initField(Category.AUDIO, audioTextField); initField(Category.VIDEO, videoTextField); initField(Category.IMAGE, imageTextField); initField(Category.DOCUMENT, documentTextField); initField(Category.PROGRAM, programTextField); initField(Category.OTHER, otherTextField); } private void initField(Category mediaType, LabelTextField textField) { FileSetting saveDirSetting = SharingSettings.getFileSettingForCategory(mediaType); File saveDir = saveDirSetting.get(); String saveDirString = saveDir.getAbsolutePath(); textField.setText(saveDirString); // Save initial value for comparison. mediaDirectoryMap.put(mediaType, saveDirString); } /** * Defines the action to revert the media directory settings to the * default save directory. */ private class DefaultAction extends AbstractAction { public DefaultAction() { putValue(Action.NAME, I18n.tr("Use Default")); putValue(Action.SHORT_DESCRIPTION, I18n.tr("Revert directories to the default")); } @Override public void actionPerformed(ActionEvent e) { revertToDefault(); } } }