/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Icy is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.type.collection.list; import icy.preferences.XMLPreferences; import icy.type.collection.list.RecentListEvent.RecentListEventType; import java.util.ArrayList; import javax.swing.event.EventListenerList; /** * @author stephane */ public abstract class RecentList { public final static String ID_ENTRY = "entry"; protected final XMLPreferences preferences; protected final int nbMaxEntry; protected final ArrayList<Object> list; private final EventListenerList listeners; public RecentList(XMLPreferences preferences, int nbMaxEntry) { super(); this.preferences = preferences; this.nbMaxEntry = nbMaxEntry; list = new ArrayList<Object>(); listeners = new EventListenerList(); // load the list from prefs load(); } public void clear() { synchronized (list) { list.clear(); } // save to pref save(); // inform about change changed(); } public void addEntry(Object entry) { synchronized (list) { // remove entry if already present list.remove(entry); // add entry at top list.add(0, entry); // remove last entries while (list.size() > nbMaxEntry) list.remove(list.size() - 1); } // save to pref save(); // inform about change changed(); } public int getSize() { return list.size(); } public int getMaxSize() { return nbMaxEntry; } public Object getEntry(int index) { return list.get(index); } protected void load() { synchronized (list) { list.clear(); for (int i = 0; i < nbMaxEntry; i++) { final Object value = loadEntry(ID_ENTRY + i); if (value != null) list.add(value); } } changed(); } protected abstract Object loadEntry(final String key); protected void save() { // clear all preferences.clear(); preferences.removeChildren(); preferences.clean(); synchronized (list) { // then save each entry for (int i = 0; i < nbMaxEntry; i++) { if (i < list.size()) saveEntry(ID_ENTRY + i, list.get(i)); else saveEntry(ID_ENTRY + i, null); } } } protected abstract void saveEntry(final String key, final Object value); /** * process on change */ protected void changed() { final RecentListEvent event = new RecentListEvent(this, RecentListEventType.CHANGED); // notify listeners we have changed fireEvent(event); } /** * Add a listener * * @param listener */ public void addListener(RecentListListener listener) { listeners.add(RecentListListener.class, listener); } /** * Remove a listener * * @param listener */ public void removeListener(RecentListListener listener) { listeners.remove(RecentListListener.class, listener); } /** * fire event * * @param e */ public void fireEvent(RecentListEvent e) { for (RecentListListener listener : listeners.getListeners(RecentListListener.class)) listener.RencentFileChanged(e); } }