/* AbstractPresetManager.java created 2007-10-24
*
*/
package org.signalml.app.config.preset.managers;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.event.EventListenerList;
import org.apache.log4j.Logger;
import org.signalml.app.config.AbstractXMLConfiguration;
import org.signalml.app.config.preset.Preset;
import org.signalml.app.config.preset.PresetManager;
import org.signalml.app.config.preset.PresetManagerEvent;
import org.signalml.app.config.preset.PresetManagerListener;
import org.signalml.app.util.XMLUtils;
/** AbstractPresetManager
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public abstract class AbstractPresetManager extends AbstractXMLConfiguration implements PresetManager, Serializable {
private static final long serialVersionUID = 1L;
protected static final Logger logger = Logger.getLogger(AbstractPresetManager.class);
protected ArrayList<Preset> presets = new ArrayList<Preset>();
protected Preset defaultPreset;
protected transient HashMap<String, Integer> presetsByName;
protected transient EventListenerList listenerList = new EventListenerList();
@Override
public Preset getPresetAt(int index) {
return presets.get(index);
}
@Override
public Preset getPresetByName(String name) {
if (presetsByName == null) {
remapNames();
}
Integer index = presetsByName.get(name);
if (index == null) {
return null;
}
return presets.get(index);
}
@Override
public int getPresetCount() {
return presets.size();
}
@Override
public Preset[] getPresets() {
Preset[] arr = new Preset[presets.size()];
presets.toArray(arr);
return arr;
}
@Override
public void removePresetAt(int index) {
Preset oldPreset = presets.remove(index);
presetsByName = null;
firePresetRemoved(this, oldPreset);
}
@Override
public boolean removePresetByName(String name) {
if (presetsByName == null) {
remapNames();
}
Integer index = presetsByName.get(name);
if (index == null) {
return false;
}
removePresetAt(index);
return true;
}
@Override
public int setPreset(Preset preset) {
if (presetsByName == null) {
remapNames();
}
Integer index = presetsByName.get(preset.getName());
if (index == null) {
index = presets.size();
presets.add(preset);
presetsByName.put(preset.getName(), index);
firePresetAdded(this, preset);
} else {
Preset oldPreset = presets.get(index.intValue());
if (oldPreset != preset) {
presets.set(index.intValue(), preset);
firePresetReplaced(this, oldPreset, preset);
}
}
return index;
}
@Override
public Preset getDefaultPreset() {
return defaultPreset;
}
@Override
public void setDefaultPreset(Preset defaultPreset) {
if (this.defaultPreset != defaultPreset) {
Preset oldDefault = this.defaultPreset;
this.defaultPreset = defaultPreset;
fireDefaultPresetChanged(this, oldDefault, defaultPreset);
}
}
@Override
public Preset readFromFile(File file) throws IOException {
logger.debug("Reading preset from file [" + file.getAbsolutePath() +"]");
Object obj = XMLUtils.newObjectFromFile(file, streamer);
if (!getPresetClass().isInstance(obj)) {
throw new IOException("error.badPresetClass");
}
return (Preset) obj;
}
@Override
public void writeToFile(File file, Preset preset) throws IOException {
logger.debug("Writing ["+preset.getClass().getSimpleName() + "] to file [" + file.getAbsolutePath() +"]");
XMLUtils.objectToFile(preset, file, streamer);
}
private void remapNames() {
presetsByName = new HashMap<String, Integer>();
int cnt = presets.size();
for (int i=0; i<cnt; i++) {
presetsByName.put(presets.get(i).getName(), i);
}
}
public void addPresetManagerListener(PresetManagerListener l) {
listenerList.add(PresetManagerListener.class, l);
}
public void removePresetManagerListener(PresetManagerListener l) {
listenerList.remove(PresetManagerListener.class, l);
}
protected void firePresetAdded(Object source, Preset newPreset) {
Object[] listeners = listenerList.getListenerList();
PresetManagerEvent e = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==PresetManagerListener.class) {
if (e == null) {
e = new PresetManagerEvent(source, null, newPreset);
}
((PresetManagerListener)listeners[i+1]).presetAdded(e);
}
}
}
protected void firePresetRemoved(Object source, Preset oldPreset) {
Object[] listeners = listenerList.getListenerList();
PresetManagerEvent e = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==PresetManagerListener.class) {
if (e == null) {
e = new PresetManagerEvent(source, oldPreset, null);
}
((PresetManagerListener)listeners[i+1]).presetRemoved(e);
}
}
}
protected void firePresetReplaced(Object source, Preset oldPreset, Preset newPreset) {
Object[] listeners = listenerList.getListenerList();
PresetManagerEvent e = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==PresetManagerListener.class) {
if (e == null) {
e = new PresetManagerEvent(source, oldPreset, newPreset);
}
((PresetManagerListener)listeners[i+1]).presetReplaced(e);
}
}
}
protected void fireDefaultPresetChanged(Object source, Preset oldPreset, Preset newPreset) {
Object[] listeners = listenerList.getListenerList();
PresetManagerEvent e = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==PresetManagerListener.class) {
if (e == null) {
e = new PresetManagerEvent(source, oldPreset, newPreset);
}
((PresetManagerListener)listeners[i+1]).defaultPresetChanged(e);
}
}
}
@Override
public void copyFrom(AbstractXMLConfiguration config) {
AbstractPresetManager otherPresetManager = (AbstractPresetManager) config;
this.presets.addAll(otherPresetManager.presets);
if (otherPresetManager.defaultPreset != null)
this.defaultPreset = otherPresetManager.defaultPreset;
}
}