package org.limewire.ui.swing.options; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.swing.SwingUtilities; import org.limewire.setting.Setting; import org.limewire.setting.evt.SettingEvent; import org.limewire.setting.evt.SettingListener; import com.google.inject.Inject; /** * Shared class to allow the options panel to use an {@link OptionPanel} * in multiple locations. * * TODO: an option panel should not be used in two places! */ public class OptionPanelStateManager { private final Map<Setting, Object> activeSettingMap; private final Map<Setting, SettingListener> settingListeners; private final Set<SettingChangedListener> listeners; @Inject public OptionPanelStateManager() { activeSettingMap = new HashMap<Setting, Object>(); settingListeners = new HashMap<Setting, SettingListener>(); listeners = new HashSet<SettingChangedListener>(); } public Object getValue(Setting setting) { Object value = activeSettingMap.get(setting); if (value != null) { return value; } else { return setting.get(); } } public void setValue(Setting setting, Object value) { Object savedValue = activeSettingMap.get(setting); if (savedValue == null || !savedValue.equals(value)) { activeSettingMap.put(setting, value); fireChanges(setting); } } @SuppressWarnings("unchecked") public void saveSettings() { for ( Setting key : activeSettingMap.keySet() ) { Object value = activeSettingMap.get(key); if(value != null) { key.set(value); } } } public boolean hasPendingChanges() { for ( Setting key : activeSettingMap.keySet() ) { Object savedValue = activeSettingMap.get(key); if (savedValue != null && !savedValue.equals(key.get())) { return true; } } return false; } private void fireChanges(Setting setting) { for ( SettingChangedListener listener : listeners ) { listener.settingChanged(setting); } } public void addSettingChangedListener(SettingChangedListener listener) { listeners.add(listener); } public void removeSettingChangedListener(SettingChangedListener listener) { listeners.remove(listener); } /** * Interface to report pending changes to a given setting. */ public static interface SettingChangedListener { public void settingChanged(Setting setting); } public void registerSettingListener(final Setting setting) { SettingListener settingListener = settingListeners.get(setting); if(settingListener == null) { settingListener = new SettingListener() { @Override public void settingChanged(final SettingEvent evt) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setValue(setting, setting.get()); } }); } }; setting.addSettingListener(settingListener); settingListeners.put(setting, settingListener); } } /** * Reinitializes the settings map. */ public void initOptions() { for(Setting setting : activeSettingMap.keySet()) { setValue(setting, setting.get()); } } }