package org.limewire.setting; import java.util.ArrayList; import java.util.Collection; import org.limewire.setting.evt.SettingsGroupEvent; import org.limewire.setting.evt.SettingsGroupListener; import org.limewire.setting.evt.SettingsGroupEvent.EventType; /** * An abstract implementation of SettingsGroup. */ public abstract class AbstractSettingsGroup implements SettingsGroup { /** * List of {@link SettingsGroupListener}s. */ private Collection<SettingsGroupListener> listeners; /** * Value for whether or not settings should be saved to file. */ private volatile boolean shouldSave = true; /* (non-Javadoc) * @see org.limewire.setting.SettingsGroup#addSettingsGroupListener(org.limewire.setting.evt.SettingsGroupListener) */ public void addSettingsGroupListener(SettingsGroupListener l) { if (l == null) { throw new NullPointerException("SettingsGroupListener is null"); } synchronized (this) { if (listeners == null) { listeners = new ArrayList<SettingsGroupListener>(); } listeners.add(l); } } /* (non-Javadoc) * @see org.limewire.setting.SettingsGroup#removeSettingsGroupListener(org.limewire.setting.evt.SettingsGroupListener) */ public void removeSettingsGroupListener(SettingsGroupListener l) { if (l == null) { throw new NullPointerException("SettingsGroupListener is null"); } synchronized (this) { if (listeners != null) { listeners.remove(l); if (listeners.isEmpty()) { listeners = null; } } } } /** * Returns all {@link SettingsGroupListener}s or null if there are none. */ public SettingsGroupListener[] getSettingsGroupListeners() { synchronized (this) { if (listeners == null) { return null; } return listeners.toArray(new SettingsGroupListener[listeners.size()]); } } /* (non-Javadoc) * @see org.limewire.setting.SettingsGroup#setShouldSave(boolean) */ public void setShouldSave(boolean shouldSave) { if (this.shouldSave != shouldSave) { this.shouldSave = shouldSave; fireSettingsEvent(EventType.SHOULD_SAVE); } } /* (non-Javadoc) * @see org.limewire.setting.SettingsGroup#getShouldSave() */ public boolean getShouldSave() { return shouldSave; } /** * Fires a SettingsEvent. */ protected void fireSettingsEvent(EventType type) { fireSettingsEvent(new SettingsGroupEvent(type, this)); } /** * Fires a SettingsEvent. */ protected void fireSettingsEvent(final SettingsGroupEvent evt) { if (evt == null) { throw new NullPointerException("SettingsEvent is null"); } final SettingsGroupListener[] listeners = getSettingsGroupListeners(); if (listeners != null) { Runnable command = new Runnable() { public void run() { for (SettingsGroupListener l : listeners) { l.settingsGroupChanged(evt); } } }; SettingsGroupManager.instance().execute(command); } } }