package org.limewire.ui.swing.options; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JRadioButton; import net.miginfocom.swing.MigLayout; import org.limewire.core.api.updates.UpdateStyle; import org.limewire.core.settings.UpdateSettings; import org.limewire.setting.BooleanSetting; import org.limewire.ui.swing.settings.BugSettings; import org.limewire.ui.swing.settings.StartupSettings; import org.limewire.ui.swing.settings.SwingUiSettings; import org.limewire.ui.swing.shell.LimeAssociationOption; import org.limewire.ui.swing.shell.LimeAssociations; import org.limewire.ui.swing.tray.TrayNotifier; import org.limewire.ui.swing.util.I18n; import org.limewire.ui.swing.util.MacOSXUtils; import org.limewire.ui.swing.util.WindowsUtils; import org.limewire.util.OSUtils; import com.google.inject.Inject; /** * System Option View. */ public class SystemOptionPanel extends OptionPanel { private final TrayNotifier trayNotifier; private FileAssociationPanel fileAssociationPanel; private StartupShutdownPanel startupShutdownPanel; private BugsPanel bugsPanel; private JCheckBox betaCheckBox; @Inject public SystemOptionPanel(TrayNotifier trayNotifier) { this.trayNotifier = trayNotifier; setLayout(new MigLayout("hidemode 2, insets 15 15 15 15, fillx, wrap", "", "")); setOpaque(false); betaCheckBox = new JCheckBox(I18n.tr("Tell me about Beta updates")); betaCheckBox.setContentAreaFilled(false); add(getFileAssociationPanel(), "pushx, growx"); add(getStartupShutdownPanel(), "pushx, growx"); add(getBugsPanel(), "pushx, growx"); add(betaCheckBox, "gapleft 15"); } private OptionPanel getFileAssociationPanel() { if (fileAssociationPanel == null) { fileAssociationPanel = new FileAssociationPanel(); } return fileAssociationPanel; } private OptionPanel getStartupShutdownPanel() { if (startupShutdownPanel == null) { startupShutdownPanel = new StartupShutdownPanel(); } return startupShutdownPanel; } private OptionPanel getBugsPanel() { if (bugsPanel == null) { bugsPanel = new BugsPanel(); } return bugsPanel; } @Override boolean applyOptions() { boolean restart = getFileAssociationPanel().applyOptions(); restart |= getStartupShutdownPanel().applyOptions(); restart |= getBugsPanel().applyOptions(); if(betaCheckBox.isSelected()) { UpdateSettings.UPDATE_STYLE.setValue(UpdateStyle.STYLE_BETA); } else { UpdateSettings.UPDATE_STYLE.setValue(UpdateStyle.STYLE_MINOR); } return restart; } @Override boolean hasChanged() { int expectedUpdateStyle = betaCheckBox.isSelected() ? UpdateStyle.STYLE_BETA : UpdateStyle.STYLE_MINOR; return getFileAssociationPanel().hasChanged() || getStartupShutdownPanel().hasChanged() || UpdateSettings.UPDATE_STYLE.getValue() == expectedUpdateStyle || getBugsPanel().hasChanged(); } @Override public void initOptions() { getFileAssociationPanel().initOptions(); getStartupShutdownPanel().initOptions(); getBugsPanel().initOptions(); betaCheckBox.setSelected(UpdateSettings.UPDATE_STYLE.getValue() == 0); } private class FileAssociationPanel extends OptionPanel { private JCheckBox magnetCheckBox; private JCheckBox torrentCheckBox; private JCheckBox warnCheckBox; public FileAssociationPanel() { super(I18n.tr("File Associations")); setLayout(new MigLayout("insets 0, gap 0")); magnetCheckBox = new JCheckBox(I18n.tr("\".magnet\" files")); magnetCheckBox.setContentAreaFilled(false); magnetCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateView(); } }); torrentCheckBox = new JCheckBox(I18n.tr("\".torrent\" files")); torrentCheckBox.setContentAreaFilled(false); torrentCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateView(); } }); warnCheckBox = new JCheckBox(I18n.tr("Warn me when other programs want to automatically open these types")); warnCheckBox.setContentAreaFilled(false); add(magnetCheckBox, "gapleft 5, gapbottom 5, wrap"); add(torrentCheckBox, "gapleft 5, push"); add(warnCheckBox); } @Override boolean applyOptions() { if (hasChanged(magnetCheckBox, SwingUiSettings.HANDLE_MAGNETS)) { applyOption(magnetCheckBox, SwingUiSettings.HANDLE_MAGNETS); LimeAssociationOption magnetAssociationOption = LimeAssociations .getMagnetAssociation(); if (magnetAssociationOption != null) { magnetAssociationOption.setEnabled(magnetCheckBox.isSelected()); } } if (hasChanged(torrentCheckBox, SwingUiSettings.HANDLE_TORRENTS)) { applyOption(torrentCheckBox, SwingUiSettings.HANDLE_TORRENTS); LimeAssociationOption torrentAssociationOption = LimeAssociations .getTorrentAssociation(); if (torrentAssociationOption != null) { torrentAssociationOption.setEnabled(torrentCheckBox.isSelected()); } } if (hasChanged(warnCheckBox, SwingUiSettings.WARN_FILE_ASSOCIATION_CHANGES)) { applyOption(warnCheckBox, SwingUiSettings.WARN_FILE_ASSOCIATION_CHANGES); } return false; } private void applyOption(JCheckBox checkBox, BooleanSetting booleanSetting) { booleanSetting.setValue(checkBox.isSelected()); } @Override boolean hasChanged() { return hasChanged(magnetCheckBox, SwingUiSettings.HANDLE_MAGNETS) || hasChanged(torrentCheckBox, SwingUiSettings.HANDLE_TORRENTS) || hasChanged(warnCheckBox, SwingUiSettings.WARN_FILE_ASSOCIATION_CHANGES); } private boolean hasChanged(JCheckBox checkBox, BooleanSetting booleanSetting) { return booleanSetting.getValue() != checkBox.isSelected(); } @Override public void initOptions() { initOption(magnetCheckBox, SwingUiSettings.HANDLE_MAGNETS.getValue() && LimeAssociations.isMagnetAssociationSupported() && LimeAssociations.getMagnetAssociation().isEnabled()); initOption(torrentCheckBox, SwingUiSettings.HANDLE_TORRENTS.getValue() && LimeAssociations.isTorrentAssociationSupported() && LimeAssociations.getTorrentAssociation().isEnabled()); initOption(warnCheckBox, SwingUiSettings.WARN_FILE_ASSOCIATION_CHANGES.getValue()); updateView(); } private void updateView() { boolean warnShouldBeVisible = magnetCheckBox.isSelected() || torrentCheckBox.isSelected(); warnCheckBox.setVisible(warnShouldBeVisible); boolean torrentShouldBeVisible = LimeAssociations.isTorrentAssociationSupported(); torrentCheckBox.setVisible(torrentShouldBeVisible); boolean magnetShouldBeVisible = LimeAssociations.isMagnetAssociationSupported(); magnetCheckBox.setVisible(magnetShouldBeVisible); setVisible(torrentShouldBeVisible || magnetShouldBeVisible); } private void initOption(JCheckBox checkBox, boolean value) { checkBox.setSelected(value); } } /** * When I press X is not shown for OSX, OSX automatically minimizes on an X * If Run at startup || minimize to try is selected, set System tray icon to * true */ /* TODO: revisit this and check */ private class StartupShutdownPanel extends OptionPanel { private JCheckBox runAtStartupCheckBox; private JRadioButton minimizeButton; private JRadioButton exitButton; private ButtonGroup buttonGroup; private boolean displaySystemTrayIcon = false; public StartupShutdownPanel() { super(I18n.tr("Startup and Shutdown")); setLayout(new MigLayout("insets 0, gap 0")); runAtStartupCheckBox = new JCheckBox(I18n.tr("Run LimeWire on System Startup")); runAtStartupCheckBox.setContentAreaFilled(false); minimizeButton = new JRadioButton(I18n.tr("Minimize to system tray")); minimizeButton.setContentAreaFilled(false); exitButton = new JRadioButton(I18n.tr("Exit program")); exitButton.setContentAreaFilled(false); buttonGroup = new ButtonGroup(); buttonGroup.add(minimizeButton); buttonGroup.add(exitButton); if(OSUtils.isWindows() || OSUtils.isMacOSX()) add(runAtStartupCheckBox, "split, gapleft 5, wrap"); if (trayNotifier.supportsSystemTray()) { add(new JLabel(I18n.tr("When I press X:")), "wrap, gapleft 5, gaptop 6"); add(minimizeButton, "gapleft 25, split, gapafter 20"); add(exitButton); } } @Override boolean applyOptions() { if (OSUtils.isMacOSX()) { MacOSXUtils.setLoginStatus(runAtStartupCheckBox.isSelected()); } else if (WindowsUtils.isLoginStatusAvailable()) { WindowsUtils.setLoginStatus(runAtStartupCheckBox.isSelected()); } StartupSettings.RUN_ON_STARTUP.setValue(runAtStartupCheckBox.isSelected()); SwingUiSettings.MINIMIZE_TO_TRAY.setValue(minimizeButton.isSelected()); if(SwingUiSettings.MINIMIZE_TO_TRAY.getValue()) { trayNotifier.showTrayIcon(); } else { trayNotifier.hideTrayIcon(); } return false; } @Override boolean hasChanged() { return StartupSettings.RUN_ON_STARTUP.getValue() != runAtStartupCheckBox.isSelected() || SwingUiSettings.MINIMIZE_TO_TRAY.getValue() != minimizeButton .isSelected() || isIconDisplayed(); } private boolean isIconDisplayed() { if ((runAtStartupCheckBox.isSelected() || minimizeButton.isSelected()) && OSUtils.supportsTray()) return displaySystemTrayIcon != true; else return displaySystemTrayIcon != false; } @Override public void initOptions() { runAtStartupCheckBox.setSelected(StartupSettings.RUN_ON_STARTUP.getValue()); minimizeButton.setSelected(SwingUiSettings.MINIMIZE_TO_TRAY.getValue()); exitButton.setSelected(!SwingUiSettings.MINIMIZE_TO_TRAY.getValue()); } } private static class BugsPanel extends OptionPanel { private JRadioButton showBugsBeforeSending; private JRadioButton alwaysSendBugs; private JRadioButton neverSendBugs; public BugsPanel() { super(I18n.tr("Bugs")); setLayout(new MigLayout("gap 0, insets 0")); showBugsBeforeSending = new JRadioButton(I18n.tr("Let me know about bugs before sending them")); showBugsBeforeSending.setContentAreaFilled(false); alwaysSendBugs = new JRadioButton(I18n.tr("Always send bugs to Lime Wire")); alwaysSendBugs.setContentAreaFilled(false); neverSendBugs = new JRadioButton(I18n.tr("Never send bugs to Lime Wire")); neverSendBugs.setContentAreaFilled(false); ButtonGroup bugsButtonGroup = new ButtonGroup(); bugsButtonGroup.add(showBugsBeforeSending); bugsButtonGroup.add(alwaysSendBugs); bugsButtonGroup.add(neverSendBugs); add(showBugsBeforeSending, "split, gapleft 5, wrap"); add(alwaysSendBugs, "split, gapleft 5, wrap"); add(neverSendBugs, "split, gapleft 5, wrap"); } @Override boolean applyOptions() { if (showBugsBeforeSending.isSelected()) { BugSettings.SHOW_BUGS.setValue(true); BugSettings.REPORT_BUGS.setValue(true); } else if (alwaysSendBugs.isSelected()) { BugSettings.SHOW_BUGS.setValue(false); BugSettings.REPORT_BUGS.setValue(true); } else { BugSettings.SHOW_BUGS.setValue(false); BugSettings.REPORT_BUGS.setValue(false); } return false; } @Override boolean hasChanged() { return hasChanged(alwaysSendBugs, BugSettings.REPORT_BUGS) || hasChanged(showBugsBeforeSending, BugSettings.SHOW_BUGS); } private boolean hasChanged(JRadioButton radioButton, BooleanSetting setting) { return setting.getValue() != radioButton.isSelected(); } @Override public void initOptions() { if (BugSettings.SHOW_BUGS.getValue()) { showBugsBeforeSending.setSelected(true); } else if (BugSettings.REPORT_BUGS.getValue()) { alwaysSendBugs.setSelected(true); } else { neverSendBugs.setSelected(true); } } } }