package org.esa.snap.rcp.imgfilter.model; import com.thoughtworks.xstream.XStream; import java.util.ArrayList; import java.util.List; /** * @author Norman */ public class FilterSet implements Filter.Listener { String name; boolean editable; ArrayList<Filter> filters; transient List<Listener> listeners; public FilterSet() { this("", true); } public FilterSet(String name, boolean editable) { this.name = name; this.editable = editable; filters = new ArrayList<>(); listeners = new ArrayList<>(); } public String getName() { return name; } public boolean isEditable() { return editable; } public void setEditable(boolean editable) { this.editable = editable; } public int getFilterCount() { return filters.size(); } public Filter getFilter(int index) { return filters.get(index); } public List<Filter> getFilters() { return filters; } public boolean containsFilter(Filter filter) { return filters.contains(filter); } public int getFilterIndex(Filter filter) { return filters.indexOf(filter); } public void addFilter(String tag, Filter... filters) { for (Filter filter : filters) { filter.getTags().add(tag); addFilter(filter); } } public void addFilter(Filter filter) { filters.add(filter); filter.addListener(this); fireFilterAdded(filter); } public void removeFilter(Filter filter) { if (filters.remove(filter)) { filter.removeListener(this); fireFilterModelRemoved(filter); } } public static XStream createXStream() { final XStream xStream = Filter.createXStream(); xStream.alias("filterSet", FilterSet.class); return xStream; } @SuppressWarnings("UnusedDeclaration") private Object readResolve() { if (listeners == null) { listeners = new ArrayList<>(); } if (filters == null) { filters = new ArrayList<>(); } for (Filter filter : filters) { filter.removeListener(this); filter.addListener(this); } return this; } @Override public void filterChanged(Filter filter, String propertyName) { fireFilterChanged(filter, propertyName); } void fireFilterChanged(Filter filter, String propertyName) { for (Listener listener : listeners) { listener.filterChanged(this, filter, propertyName); } } void fireFilterAdded(Filter filter) { for (Listener listener : listeners) { listener.filterAdded(this, filter); } } void fireFilterModelRemoved(Filter filter) { for (Listener listener : listeners) { listener.filterRemoved(this, filter); } } public void addListener(Listener listener) { listeners.add(listener); } public void removeListener(Listener listener) { listeners.remove(listener); } public interface Listener { void filterAdded(FilterSet filterSet, Filter filter); void filterRemoved(FilterSet filterSet, Filter filter); void filterChanged(FilterSet filterSet, Filter filter, String propertyName); } }