package org.geogebra.common.main.settings;
import java.util.LinkedList;
/**
* Abstract base class for all setting objects. Provides functionality for
* setting listeners and batching.
*
* @author Florian Sonner
* @see "http://www.geogebra.org/trac/wiki/GuiRefactoring"
*/
public abstract class AbstractSettings {
/**
* Running in batch mode: Only at the end of the batch mode listeners are
* notified if settings changed.
*/
private int runningBatches;
/**
* Remember is settings changed. Used in batch mode.
*/
private boolean settingsChanged;
/**
* List with listeners.
*/
private LinkedList<SettingListener> listeners;
public AbstractSettings() {
listeners = new LinkedList<SettingListener>();
}
public AbstractSettings(LinkedList<SettingListener> listeners) {
this.listeners = listeners;
settingChanged();
}
public void setListeners(LinkedList<SettingListener> listeners) {
this.listeners = listeners;
}
/**
* Notify listeners about changed settings. This method has to be called by
* implementors of subclasses if a setting's value has been changed.
*/
protected void settingChanged() {
// batch mode: just set flag to inform listeners at the end
if (runningBatches > 0) {
settingsChanged = true;
}
// otherwise: inform listeners immediately
else {
for (SettingListener listener : listeners) {
listener.settingsChanged(this);
}
}
}
/**
* Begin batch mode.
*/
public final void beginBatch() {
runningBatches++;
// settingsChanged = false;
}
/**
* End batch mode.
*/
public final void endBatch() {
if (runningBatches <= 0) {
return;
}
// notify listeners
if (runningBatches == 1) {
if (settingsChanged) {
for (SettingListener listener : listeners) {
listener.settingsChanged(this);
}
}
}
runningBatches--;
}
/**
* Add a new setting listener to be informed about setting changes.
*
* @param listener
*/
public final void addListener(SettingListener listener) {
listeners.add(listener);
}
/**
* Remove a setting listener.
*
* @param listener
*/
public final void removeListener(SettingListener listener) {
listeners.remove(listener);
}
public LinkedList<SettingListener> getListeners() {
return listeners;
}
}