/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.tools.gui.breadcrumb; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; /** * DOCUMENT ME! * * @author thorsten * @version $Revision$, $Date$ */ public class DefaultBreadCrumbModel implements BreadCrumbModel { //~ Instance fields -------------------------------------------------------- private final transient Set<BreadCrumbModelListener> listeners; private final transient List<BreadCrumb> data; //~ Constructors ----------------------------------------------------------- /** * Creates a new DefaultBreadCrumbModel object. */ public DefaultBreadCrumbModel() { listeners = new HashSet<BreadCrumbModelListener>(); data = new ArrayList<BreadCrumb>(); } //~ Methods ---------------------------------------------------------------- @Override public void appendCrumb(final BreadCrumb bc) { appendCrumbSilently(bc); fireBreadCrumbAdded(new BreadCrumbEvent(this, bc)); } /** * DOCUMENT ME! * * @param bc DOCUMENT ME! */ private void appendCrumbSilently(final BreadCrumb bc) { data.add(bc); bc.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final BreadCrumbEvent bce = new BreadCrumbEvent(DefaultBreadCrumbModel.this, bc); fireBreadCrumbActionPerformed(bce); } }); } @Override public List<BreadCrumb> getAllCrumbs() { return new ArrayList<BreadCrumb>(data); } @Override public BreadCrumb getCrumbAt(final int position) { return data.get(position); } @Override public int getPositionOf(final BreadCrumb bc) { return data.indexOf(bc); } @Override public int getSize() { return data.size(); } @Override public BreadCrumb getLastCrumb() { if (data.isEmpty()) { return null; } else { return data.get(data.size() - 1); } } @Override public BreadCrumb getFirstCrumb() { if (data.isEmpty()) { return null; } else { return data.get(0); } } @Override public void clear() { data.clear(); fireBreadCrumbModelChanged(new BreadCrumbEvent(this)); } @Override public void removeTill(final BreadCrumb bc) { final int lastIndex = data.lastIndexOf(bc); if (lastIndex != -1) { for (int i = data.size() - 1; i > lastIndex; --i) { data.remove(i); } } fireBreadCrumbModelChanged(new BreadCrumbEvent(this)); } @Override public void startWithNewCrumb(final BreadCrumb bc) { data.clear(); appendCrumbSilently(bc); fireBreadCrumbModelChanged(new BreadCrumbEvent(this)); } @Override public void addBreadCrumbModelListener(final BreadCrumbModelListener bcListener) { synchronized (listeners) { listeners.add(bcListener); } } @Override public void removeBreadCrumbModelListener(final BreadCrumbModelListener bcListener) { synchronized (listeners) { listeners.remove(bcListener); } } /** * DOCUMENT ME! * * @param bce DOCUMENT ME! */ public void fireBreadCrumbModelChanged(final BreadCrumbEvent bce) { final Iterator<BreadCrumbModelListener> it; synchronized (listeners) { it = new HashSet<BreadCrumbModelListener>(listeners).iterator(); } while (it.hasNext()) { it.next().breadCrumbModelChanged(bce); } } /** * DOCUMENT ME! * * @param bce DOCUMENT ME! */ public void fireBreadCrumbAdded(final BreadCrumbEvent bce) { final Iterator<BreadCrumbModelListener> it; synchronized (listeners) { it = new HashSet<BreadCrumbModelListener>(listeners).iterator(); } while (it.hasNext()) { it.next().breadCrumbAdded(bce); } } /** * DOCUMENT ME! * * @param bce DOCUMENT ME! */ public void fireBreadCrumbActionPerformed(final BreadCrumbEvent bce) { final Iterator<BreadCrumbModelListener> it; synchronized (listeners) { it = new HashSet<BreadCrumbModelListener>(listeners).iterator(); } while (it.hasNext()) { it.next().breadCrumbActionPerformed(bce); } } }