package org.limewire.ui.swing.shell; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import org.limewire.setting.BooleanSetting; import org.limewire.ui.swing.components.YesNoCheckBoxDialog; import org.limewire.ui.swing.settings.SwingUiSettings; import org.limewire.ui.swing.util.I18n; /** * Stores all the LimeAssociationOptions that LimeWire is set to use. */ public class ShellAssociationManager { /** * Runs through all the associations that this manager is handling and * checks to see if they can be enabled. If they can't be enabled but should * be, it checks the users warning settings. If the user has been selected * to be notified the user will be prompted if they want their associations * to be fixed. * * @param frame frame for dialog to be relative to */ public void validateFileAssociations(final JFrame frame) { final LimeAssociationOption torrentAssociationOption = LimeAssociations .getTorrentAssociation(); applyAvailableAssociation(torrentAssociationOption, SwingUiSettings.HANDLE_TORRENTS); final LimeAssociationOption magnetAssociationOption = LimeAssociations .getMagnetAssociation(); applyAvailableAssociation(magnetAssociationOption, SwingUiSettings.HANDLE_MAGNETS); boolean torrentsStolen = isSettingStolen(torrentAssociationOption, SwingUiSettings.HANDLE_TORRENTS); boolean magnetsStolen = isSettingStolen(magnetAssociationOption, SwingUiSettings.HANDLE_MAGNETS); if (SwingUiSettings.WARN_FILE_ASSOCIATION_CHANGES.getValue() && (torrentsStolen || magnetsStolen)) { String message = getMessage(torrentsStolen, magnetsStolen); final YesNoCheckBoxDialog yesNoCheckBoxDialog = new YesNoCheckBoxDialog(message, I18n .tr("Warn me when other programs take LimeWire associations"), SwingUiSettings.WARN_FILE_ASSOCIATION_CHANGES.getValue()); yesNoCheckBoxDialog.setLocationRelativeTo(frame); yesNoCheckBoxDialog.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUiSettings.WARN_FILE_ASSOCIATION_CHANGES.setValue(yesNoCheckBoxDialog .isCheckBoxSelected()); boolean shouldReAssociate = YesNoCheckBoxDialog.YES_COMMAND.equals(e .getActionCommand()); if (shouldReAssociate) { fixAssociation(torrentAssociationOption, SwingUiSettings.HANDLE_TORRENTS); fixAssociation(magnetAssociationOption, SwingUiSettings.HANDLE_MAGNETS); } else { updateSettings(torrentAssociationOption, magnetAssociationOption); } } }); yesNoCheckBoxDialog.setVisible(true); } else { updateSettings(torrentAssociationOption, magnetAssociationOption); } } private String getMessage(boolean torrentsStolen, boolean magnetsStolen) { if (torrentsStolen && magnetsStolen) { return I18n .tr("Torrent files and magnet links are no longer associated with LimeWire. Would you like LimeWire to re-associate them?"); } else if (torrentsStolen) { return I18n .tr("Torrent files are no longer associated with LimeWire. Would you like LimeWire to re-associate them?"); } else { return I18n .tr("Magnet links are no longer associated with LimeWire. Would you like LimeWire to re-associate them?"); } } /** * Helper method to update the settings to relfect the actual file * association when needed. */ private void updateSettings(final LimeAssociationOption torrentAssociationOption, final LimeAssociationOption magnetAssociationOption) { updateSetting(torrentAssociationOption, SwingUiSettings.HANDLE_TORRENTS); updateSetting(magnetAssociationOption, SwingUiSettings.HANDLE_MAGNETS); } /** * Helper method to update a single setting to the value of its association. */ private void updateSetting(LimeAssociationOption associationOption, BooleanSetting handleType) { handleType.setValue(associationOption != null && associationOption.isEnabled()); } /** * Helper method to determine if a setting has been stolen by another * application. */ private boolean isSettingStolen(LimeAssociationOption associationOption, BooleanSetting handleType) { return associationOption != null && handleType.getValue() && !associationOption.isEnabled(); } /** * Updates an association based on the supplied BooleanSetting */ private void fixAssociation(LimeAssociationOption associationOption, BooleanSetting handleType) { if (associationOption != null) { associationOption.setEnabled(handleType.getValue()); } } /** * Enables an association if the supplied boolean setting is true and not * other application is using the association. */ private void applyAvailableAssociation(LimeAssociationOption associationOption, BooleanSetting handleType) { if (associationOption != null) { if (!associationOption.isEnabled() && handleType.getValue() && associationOption.isAvailable()) { associationOption.setEnabled(true); } } } }