package data.filters;
import data.*;
import data.events.*;
import util.*;
import java.util.*;
import java.beans.*;
public abstract class CatalogFilter extends Object implements Catalog,
CatalogChangeListener,
ListenableCatalog,
HelpableListener {
protected Catalog m_cOrg;
protected ListenerHelper m_lhListeners = new ListenerHelper (this);
public CatalogFilter (Catalog cOrg) {
super();
m_cOrg = cOrg;
}
public int compareTo (Object o) {
return m_cOrg.compareTo (o);
}
public NameContext detachNC() {
return m_cOrg.detachNC();
}
public NameContext attach (NameContext nc) {
return m_cOrg.attach (nc);
}
public String getName() {
return m_cOrg.getName();
}
public void setName (String sName, DataBasket db) throws NameContextException {
m_cOrg.setName (sName, db);
}
public Value getValue() {
return m_cOrg.getValue();
}
public void addPropertyChangeListener (PropertyChangeListener pcl) {
m_cOrg.addPropertyChangeListener (pcl);
}
public void removePropertyChangeListener (PropertyChangeListener pcl) {
m_cOrg.removePropertyChangeListener (pcl);
}
public void addNameListener (PropertyChangeListener pcl) {
m_cOrg.addNameListener (pcl);
}
public void removeNameListener (PropertyChangeListener pcl) {
m_cOrg.removeNameListener (pcl);
}
public void addValueListener (PropertyChangeListener pcl) {
m_cOrg.addValueListener (pcl);
}
public void removeValueListener (PropertyChangeListener pcl) {
m_cOrg.removeValueListener (pcl);
}
public Catalog getCatalog() {
return m_cOrg.getCatalog();
}
public void add (CatalogItem ci, DataBasket db) {
m_cOrg.add (ci, db);
}
public CatalogItem remove (CatalogItem ci, DataBasket db)
throws VetoException {
if (match (ci)) {
return m_cOrg.remove (ci, db);
}
else {
return null;
}
}
public CatalogItem remove (String sKey, DataBasket db)
throws VetoException {
if (get (sKey, db, false) != null) {
return m_cOrg.remove (sKey, db);
}
else {
return null;
}
}
public CatalogItem get (String sKey, DataBasket db, boolean fForEdit)
throws VetoException {
CatalogItem ci = m_cOrg.get (sKey, db, fForEdit);
if (match (ci)) {
return ci;
}
else {
return null;
}
}
public boolean contains (String sKey, DataBasket db) {
if (m_cOrg.contains (sKey, db)) {
try {
CatalogItem ci = get (sKey, db, false);
return (ci != null);
}
catch (VetoException e) {
return false;
}
}
else {
return false;
}
}
private class FilteredIterator implements Iterator {
private Iterator m_i;
private Object m_oCurrent;
public FilteredIterator (Iterator i) {
m_i = i;
}
public boolean hasNext() {
return findNext();
}
public Object next() {
if (!findNext()) {
throw new NoSuchElementException();
}
Object oReturn = m_oCurrent;
m_oCurrent = null;
return oReturn;
}
public void remove() {
m_i.remove();
}
private boolean findNext() {
if (m_oCurrent != null) {
return true;
}
while (m_i.hasNext()) {
m_oCurrent = m_i.next();
if (match ((CatalogItem) m_oCurrent)) {
return true;
}
}
m_oCurrent = null;
return false;
}
}
public Iterator iterator (DataBasket db, boolean fForEdit) {
return new FilteredIterator (m_cOrg.iterator (db, fForEdit));
}
public Set keySet (final DataBasket db) {
class S extends AbstractSet {
public Iterator iterator() {
return new FilteredIterator (m_cOrg.iterator (db, false)) {
public Object next() {
CatalogItem ci = (CatalogItem) super.next();
return ci.getName();
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public int size() {
return CatalogFilter.this.size (db);
}
}
return new S();
}
public int size (DataBasket db) {
if (m_cOrg.size (db) > 0) {
int nReturn = 0;
for (Iterator i = m_cOrg.iterator (db, false); i.hasNext();) {
if (match ((CatalogItem) i.next())) {
nReturn++;
}
}
return nReturn;
}
else {
return 0;
}
}
protected abstract boolean match (CatalogItem ci);
public void addedCatalogItem (CatalogChangeEvent e) {
fireCatalogItemAdded (e.getAffectedItem(), e.getBasket());
}
public void commitedAddCatalogItem (CatalogChangeEvent e) {
fireCatalogItemAddCommit (e.getAffectedItem(), e.getBasket());
}
public void rolledbackAddCatalogItem (CatalogChangeEvent e) {
fireCatalogItemAddRollback (e.getAffectedItem(), e.getBasket());
}
public void canRemoveCatalogItem (CatalogChangeEvent e) throws VetoException {
fireCanRemoveCatalogItem (e.getAffectedItem(), e.getBasket());
}
public void noRemoveCatalogItem (CatalogChangeEvent e) {
fireNoRemoveCatalogItem (e.getAffectedItem(), e.getBasket());
}
public void removedCatalogItem (CatalogChangeEvent e) {
fireCatalogItemRemoved (e.getAffectedItem(), e.getBasket());
}
public void commitedRemoveCatalogItem (CatalogChangeEvent e) {
fireCatalogItemRemoveCommit (e.getAffectedItem(), e.getBasket());
}
public void rolledbackRemoveCatalogItem (CatalogChangeEvent e) {
fireCatalogItemRemoveRollback (e.getAffectedItem(), e.getBasket());
}
public void canEditCatalogItem (CatalogChangeEvent e) throws VetoException {
fireCanEditCatalogItem (e.getAffectedItem(), e.getBasket());
}
public void noEditCatalogItem (CatalogChangeEvent e) {
fireNoEditCatalogItem (e.getAffectedItem(), e.getBasket());
}
public void editingCatalogItem (CatalogChangeEvent e) {
fireEditingCatalogItem (e.getAffectedItem(), e.getBasket());
}
public void commitEditCatalogItem (CatalogChangeEvent e) {
fireCommitEditCatalogItem (e.getAffectedItem(), e.getBasket());
}
public void rollbackEditCatalogItem (CatalogChangeEvent e) {
fireRollbackEditCatalogItem (e.getAffectedItem(), e.getBasket());
}
public void addCatalogChangeListener (CatalogChangeListener ccl) {
m_lhListeners.add (CatalogChangeListener.class, ccl);
}
public void removeCatalogChangeListener (CatalogChangeListener ccl) {
m_lhListeners.remove (CatalogChangeListener.class, ccl);
}
protected void fireCatalogItemAdded (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).addedCatalogItem (cce);
}
}
}
protected void fireCatalogItemAddCommit (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).commitedAddCatalogItem (cce);
}
}
}
protected void fireCatalogItemAddRollback (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).rolledbackAddCatalogItem (cce);
}
}
}
protected void fireCatalogItemRemoved (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).removedCatalogItem (cce);
}
}
}
protected void fireCatalogItemRemoveCommit (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).commitedRemoveCatalogItem (cce);
}
}
}
protected void fireCatalogItemRemoveRollback (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).rolledbackRemoveCatalogItem (cce);
}
}
}
protected void fireCanRemoveCatalogItem (CatalogItem ci, DataBasket db)
throws VetoException {
Object[] temp = m_lhListeners.getListenerList();
Object[] listeners = new Object[temp.length];
System.arraycopy (temp, 0, listeners, 0, temp.length);
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).canRemoveCatalogItem (cce);
}
}
}
protected void fireNoRemoveCatalogItem (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).noRemoveCatalogItem (cce);
}
}
}
protected void fireCanEditCatalogItem (CatalogItem ci, DataBasket db)
throws VetoException {
Object[] temp = m_lhListeners.getListenerList();
Object[] listeners = new Object[temp.length];
System.arraycopy (temp, 0, listeners, 0, temp.length);
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).canEditCatalogItem (cce);
}
}
}
protected void fireNoEditCatalogItem (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).noEditCatalogItem (cce);
}
}
}
protected void fireEditingCatalogItem (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).editingCatalogItem (cce);
}
}
}
protected void fireCommitEditCatalogItem (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).commitEditCatalogItem (cce);
}
}
}
protected void fireRollbackEditCatalogItem (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).rollbackEditCatalogItem (cce);
}
}
}
public void subscribe() {
if (m_cOrg instanceof ListenableCatalog) {
((ListenableCatalog) m_cOrg).addCatalogChangeListener (this);
}
}
public void unsubscribe() {
if (m_cOrg instanceof ListenableCatalog) {
((ListenableCatalog) m_cOrg).removeCatalogChangeListener (this);
}
}
public void updateModel() {}
}