package org.limewire.ui.swing.options;
import static org.limewire.ui.swing.util.I18n.tr;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Locale;
import javax.swing.AbstractAction;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
import org.limewire.core.api.Application;
import org.limewire.setting.evt.SettingEvent;
import org.limewire.setting.evt.SettingListener;
import org.limewire.ui.swing.components.FocusJOptionPane;
import org.limewire.ui.swing.components.LanguageComboBox;
import org.limewire.ui.swing.components.NonNullJComboBox;
import org.limewire.ui.swing.components.TextFieldClipboardControl;
import org.limewire.ui.swing.friends.settings.FriendAccountConfiguration;
import org.limewire.ui.swing.friends.settings.FriendAccountConfigurationManager;
import org.limewire.ui.swing.settings.QuestionsHandler;
import org.limewire.ui.swing.settings.SwingUiSettings;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.I18n;
import org.limewire.ui.swing.util.LanguageUtils;
import org.limewire.ui.swing.util.SwingUtils;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Misc Option View.
*/
public class MiscOptionPanel extends OptionPanel {
private final Provider<FriendAccountConfigurationManager> accountManager;
private NotificationsPanel notificationsPanel;
private FriendsChatPanel friendsChatPanel;
private Locale currentLanguage;
private JLabel comboLabel;
private final JComboBox languageDropDown;
@Inject
public MiscOptionPanel(Provider<FriendAccountConfigurationManager> accountManager, Application application) {
this.accountManager = accountManager;
GuiUtils.assignResources(this);
setLayout(new MigLayout("nogrid, insets 15 15 15 15, fillx, gap 4"));
comboLabel = new JLabel(I18n.tr("Language:"));
languageDropDown = new LanguageComboBox();
add(comboLabel);
add(languageDropDown, "wrap");
add(getNotificationsPanel(), "growx, wrap");
add(getFriendChatPanel());
}
private OptionPanel getNotificationsPanel() {
if(notificationsPanel == null) {
notificationsPanel = new NotificationsPanel();
}
return notificationsPanel;
}
private OptionPanel getFriendChatPanel() {
if(friendsChatPanel == null) {
friendsChatPanel = new FriendsChatPanel();
}
return friendsChatPanel;
}
@Override
ApplyOptionResult applyOptions() {
Locale selectedLocale = (Locale) languageDropDown.getSelectedItem();
ApplyOptionResult result = getNotificationsPanel().applyOptions();
if (result.isSuccessful())
result.applyResult(getFriendChatPanel().applyOptions());
// if the language changed, always notify about a required restart
if(selectedLocale != null && !currentLanguage.equals(selectedLocale) && result.isSuccessful()) {
currentLanguage = selectedLocale;
LanguageUtils.setLocale(selectedLocale);
result.updateRestart(true);
}
return result;
}
@Override
void setOptionTabItem(OptionTabItem tab) {
super.setOptionTabItem(tab);
getFriendChatPanel().setOptionTabItem(tab);
getNotificationsPanel().setOptionTabItem(tab);
}
@Override
boolean hasChanged() {
Locale selectedLocale = (Locale) languageDropDown.getSelectedItem();
return getNotificationsPanel().hasChanged() ||
getFriendChatPanel().hasChanged() ||
selectedLocale != currentLanguage;
}
@Override
public void initOptions() {
getNotificationsPanel().initOptions();
getFriendChatPanel().initOptions();
currentLanguage = LanguageUtils.getCurrentLocale();
// if language got corrupted somehow, resave it
// this shouldn't be possible but somehow currentLanguage can be
// null on OSX.
if(currentLanguage == null) {
LanguageUtils.setLocale(Locale.ENGLISH);
currentLanguage = Locale.ENGLISH;
}
languageDropDown.setSelectedItem(currentLanguage);
}
private class NotificationsPanel extends OptionPanel {
private JCheckBox showNotificationsCheckBox;
private JButton resetWarningsButton;
public NotificationsPanel() {
super(tr("Notifications and Warnings"));
showNotificationsCheckBox = new JCheckBox(tr("Show popup system notifications"));
showNotificationsCheckBox.setContentAreaFilled(false);
resetWarningsButton = new JButton(new AbstractAction(I18n.tr("Reset")){
@Override
public void actionPerformed(ActionEvent e) {
resetWarnings();
}
});
add(showNotificationsCheckBox, "wrap");
add(new JLabel(I18n.tr("Reset warning messages")));
add(resetWarningsButton, "wrap");
}
@Override
ApplyOptionResult applyOptions() {
SwingUiSettings.SHOW_NOTIFICATIONS.setValue(showNotificationsCheckBox.isSelected());
return new ApplyOptionResult(false, true);
}
@Override
boolean hasChanged() {
return showNotificationsCheckBox.isSelected() != SwingUiSettings.SHOW_NOTIFICATIONS.getValue();
}
@Override
public void initOptions() {
showNotificationsCheckBox.setSelected(SwingUiSettings.SHOW_NOTIFICATIONS.getValue());
}
}
private class FriendsChatPanel extends OptionPanel implements SettingListener {
private JCheckBox autoLoginCheckBox;
private JComboBox serviceComboBox;
private JLabel serviceLabel;
private JTextField serviceField;
private JTextField usernameField;
private JPasswordField passwordField;
public FriendsChatPanel() {
super(tr("Friends and Chat"));
SwingUiSettings.XMPP_AUTO_LOGIN.addSettingListener(this);
autoLoginCheckBox = new JCheckBox(tr("Sign into Friends when LimeWire starts"));
autoLoginCheckBox.setContentAreaFilled(false);
autoLoginCheckBox.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
setComponentsEnabled(autoLoginCheckBox.isSelected());
if (autoLoginCheckBox.isSelected())
usernameField.requestFocusInWindow();
}
});
serviceComboBox = new NonNullJComboBox();
for(String label : accountManager.get().getLabels()) {
if(!label.equals("Facebook")) {
serviceComboBox.addItem(label);
}
}
serviceComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
populateInputs();
}
});
serviceComboBox.setRenderer(new Renderer());
serviceLabel = new JLabel(tr("Jabber Server:"));
serviceField = new JTextField(18);
usernameField = new JTextField(18);
passwordField = new JPasswordField(18);
TextFieldClipboardControl.install(serviceField);
TextFieldClipboardControl.install(usernameField);
TextFieldClipboardControl.install(passwordField);
add(autoLoginCheckBox, "wrap");
JPanel servicePanel = new JPanel(new MigLayout("insets 0, fill"));
servicePanel.setOpaque(false);
servicePanel.add(new JLabel(tr("Using:")), "gapleft 25");
servicePanel.add(serviceComboBox, "wrap");
servicePanel.add(serviceLabel, "gapleft 25, hidemode 3");
servicePanel.add(serviceField, "hidemode 3, wrap");
servicePanel.add(new JLabel(tr("Username:")), "gapleft 25");
servicePanel.add(usernameField, "wrap");
servicePanel.add(new JLabel(tr("Password:")), "gapleft 25");
servicePanel.add(passwordField, "wrap");
add(servicePanel);
}
private void populateInputs() {
String label = (String)serviceComboBox.getSelectedItem();
if(label.equals("Jabber")) {
serviceLabel.setVisible(true);
serviceField.setVisible(true);
} else {
serviceLabel.setVisible(false);
serviceField.setVisible(false);
}
FriendAccountConfiguration config = accountManager.get().getConfig(label);
if(config == accountManager.get().getAutoLoginConfig()) {
serviceField.setText(config.getServiceName());
usernameField.setText(config.getUserInputLocalID());
passwordField.setText(config.getPassword());
} else {
serviceField.setText("");
usernameField.setText("");
passwordField.setText("");
}
}
private void setComponentsEnabled(boolean enabled) {
serviceComboBox.setEnabled(enabled);
serviceField.setEnabled(enabled);
usernameField.setEnabled(enabled);
passwordField.setEnabled(enabled);
if(!enabled) {
serviceField.setText("");
usernameField.setText("");
passwordField.setText("");
}
}
@Override
ApplyOptionResult applyOptions() {
if(hasChanged()) {
if(autoLoginCheckBox.isSelected()) {
// Set this as the auto-login account
String user = usernameField.getText().trim();
String password = new String(passwordField.getPassword());
if (user.length() == 0) {
getOptionTabItem().select();
usernameField.requestFocusInWindow();
FocusJOptionPane.showMessageDialog(this, tr("Username cannot be blank."),
tr("Username"), JOptionPane.ERROR_MESSAGE);
return new ApplyOptionResult(false, false);
}
if (password.length() == 0) {
getOptionTabItem().select();
passwordField.requestFocusInWindow();
FocusJOptionPane.showMessageDialog(this, tr("Password cannot be blank."),
tr("Password"), JOptionPane.ERROR_MESSAGE);
return new ApplyOptionResult(false, false);
}
String label = (String)serviceComboBox.getSelectedItem();
FriendAccountConfiguration config = accountManager.get().getConfig(label);
if(label.equals("Jabber")) {
String service = serviceField.getText().trim();
if(service.isEmpty()) {
getOptionTabItem().select();
serviceField.requestFocusInWindow();
FocusJOptionPane.showMessageDialog(this, tr("Service cannot be blank."),
tr("Service"), JOptionPane.ERROR_MESSAGE);
return new ApplyOptionResult(false, false);
}
config.setServiceName(service);
}
config.setUsername(user);
config.setPassword(password);
accountManager.get().setAutoLoginConfig(config);
} else {
accountManager.get().setAutoLoginConfig(null);
}
}
return new ApplyOptionResult(false, true);
}
@Override
boolean hasChanged() {
FriendAccountConfiguration auto = accountManager.get().getAutoLoginConfig();
if(auto == null) {
return autoLoginCheckBox.isSelected();
} else {
if(!autoLoginCheckBox.isSelected())
return true;
String label = (String)serviceComboBox.getSelectedItem();
if(!label.equals(auto.getLabel()))
return true;
String serviceName = serviceField.getText().trim();
if(!serviceName.equals(auto.getServiceName()))
return true;
String username = usernameField.getText().trim();
if(!username.equals(auto.getUserInputLocalID()))
return true;
String password = new String(passwordField.getPassword());
if(!password.equals(auto.getPassword()))
return true;
}
return false;
}
@Override
public void initOptions() {
FriendAccountConfiguration auto = accountManager.get().getAutoLoginConfig();
if(auto == null) {
serviceComboBox.setSelectedItem("Gmail");
setComponentsEnabled(false);
autoLoginCheckBox.setSelected(false);
} else {
serviceComboBox.setSelectedItem(auto.getLabel());
setComponentsEnabled(true);
autoLoginCheckBox.setSelected(true);
}
populateInputs();
}
@Override
public void settingChanged(SettingEvent evt) {
SwingUtils.invokeNowOrLater(new Runnable() {
@Override
public void run() {
initOptions();
}
});
}
}
private class Renderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
FriendAccountConfiguration config = accountManager.get().getConfig(value.toString());
if(config != null) {
setIcon(config.getIcon());
} else {
setIcon(null);
}
return this;
}
}
private static void resetWarnings() {
QuestionsHandler.WARN_TORRENT_SEED_MORE.revertToDefault();
QuestionsHandler.CONFIRM_BLOCK_HOST.revertToDefault();
SwingUiSettings.WARN_DOWNLOAD_DANGEROUS.revertToDefault();
SwingUiSettings.WARN_DOWNLOAD_SCAN_FAILED.revertToDefault();
SwingUiSettings.WARN_DOWNLOAD_THREAT_FOUND.revertToDefault();
}
}