package org.limewire.ui.swing.options;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import net.miginfocom.swing.MigLayout;
import org.limewire.core.settings.SharingSettings;
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.util.I18n;
import org.limewire.ui.swing.util.IconManager;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Files Option View.
*/
public class FilesOptionPanel extends OptionPanel {
private final ManageFileExtensionsOptionPanel manageFileExtensionsOptionPanel;
private final Provider<IconManager> iconManager;
private ManageExtensionsPanel manageExtensionsPanel;
private LimeWireStorePanel limeWireStorePanel;
@Inject
FilesOptionPanel(ManageFileExtensionsOptionPanel manageFileExtensionsOptionPanel,
Provider<IconManager> iconManager) {
this.manageFileExtensionsOptionPanel = manageFileExtensionsOptionPanel;
this.iconManager = iconManager;
setLayout(new MigLayout("insets 15 15 15 15, fillx, wrap", "", ""));
setOpaque(false);
add(getManageExtensionsPanel(), "pushx, growx");
add(getLimeWireStorePanel(), "pushx, growx");
}
private OptionPanel getManageExtensionsPanel() {
if(manageExtensionsPanel == null) {
manageExtensionsPanel = new ManageExtensionsPanel();
}
return manageExtensionsPanel;
}
private OptionPanel getLimeWireStorePanel() {
if(limeWireStorePanel == null) {
limeWireStorePanel = new LimeWireStorePanel();
}
return limeWireStorePanel;
}
@Override
boolean applyOptions() {
boolean restart = getManageExtensionsPanel().applyOptions();
restart |= getLimeWireStorePanel().applyOptions();
return restart;
}
@Override
boolean hasChanged() {
return getManageExtensionsPanel().hasChanged() ||
getLimeWireStorePanel().hasChanged();
}
@Override
public void initOptions() {
getManageExtensionsPanel().initOptions();
getLimeWireStorePanel().initOptions();
}
private class ManageExtensionsPanel extends OptionPanel {
private ManageFileExtensionsOptionPanel extensionsPanel;
private JButton manageButton;
public ManageExtensionsPanel() {
super(I18n.tr("File Extensions"));
extensionsPanel = manageFileExtensionsOptionPanel;
manageButton = new JButton(new DialogDisplayAction(FilesOptionPanel.this,
extensionsPanel, I18n.tr("Manage File Extensions"),
I18n.tr("Manage..."),I18n.tr("Manage file extensions to load")) {
@Override
public void actionPerformed(ActionEvent e) {
extensionsPanel.initOptions();
super.actionPerformed(e);
}
});
add(new JLabel(I18n.tr("Choose the file extensions that belong in each category")), "push");
add(manageButton);
}
@Override
boolean applyOptions() {
return extensionsPanel.applyOptions();
}
@Override
boolean hasChanged() {
return extensionsPanel.hasChanged();
}
@Override
public void initOptions() {
extensionsPanel.reset();
}
}
private class LimeWireStorePanel extends OptionPanel {
private String currentSaveDirectory;
private LWSFileNamingOptionPanel storeOptionPanel;
private LabelTextField storePathTextField;
private JButton browseStorePathButton;
private JButton configureNamingButton;
public LimeWireStorePanel() {
super(I18n.tr("LimeWire Store"));
storeOptionPanel = new LWSFileNamingOptionPanel(new OKDialogAction(), new CancelDialogAction());
storePathTextField = new LabelTextField(iconManager);
storePathTextField.setEditable(false);
BrowseDirectoryAction directoryAction = new BrowseDirectoryAction(FilesOptionPanel.this, storePathTextField);
storePathTextField.addMouseListener(directoryAction);
browseStorePathButton = new JButton(directoryAction);
configureNamingButton = new JButton(new DialogDisplayAction(FilesOptionPanel.this,
storeOptionPanel,I18n.tr("Store File Organization"),
I18n.tr("Configure File Organization..."),I18n.tr("Configure how files downloaded from the LimeWire Store are organized")));
add(new JLabel(I18n.tr("Save Store downloads to:")), "split");
add(storePathTextField);
add(browseStorePathButton, "wrap");
add(configureNamingButton);
}
@Override
boolean applyOptions() {
final String save = storePathTextField.getText();
if(!save.equals(currentSaveDirectory)) {
try {
File saveDir = new File(save);
if(!saveDir.isDirectory()) {
if (!saveDir.mkdirs())
throw new IOException();
}
SharingSettings.setSaveLWSDirectory(saveDir);
currentSaveDirectory = save;
} catch(Exception ioe) {
FocusJOptionPane.showMessageDialog(FilesOptionPanel.this,
I18n.tr("Could not save Store download directory, reverted to old directory"),
I18n.tr("Save Folder Error"),
JOptionPane.ERROR_MESSAGE);
storePathTextField.setText(currentSaveDirectory);
}
}
return storeOptionPanel.applyOptions();
}
@Override
boolean hasChanged() {
return !currentSaveDirectory.equals(storePathTextField.getText()) ||
storeOptionPanel.hasChanged();
}
@Override
public void initOptions() {
storeOptionPanel.initOptions();
try {
File file = SharingSettings.getSaveLWSDirectory();
if (file == null) {
file = SharingSettings.DEFAULT_SAVE_LWS_DIR;
if(file == null)
throw (new FileNotFoundException());
}
currentSaveDirectory = file.getCanonicalPath();
storePathTextField.setText(file.getCanonicalPath());
} catch (FileNotFoundException fnfe) {
// simply use the empty string if we could not get the save
// directory.
currentSaveDirectory = "";
storePathTextField.setText("");
} catch (IOException ioe) {
currentSaveDirectory = "";
storePathTextField.setText("");
}
}
}
}