package be.msyben.vinylManager.gui.list.albumList;

import be.msyben.vinylManager.entities.Album;
import java.awt.Component;
import java.awt.Font;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Classe abstraite d'une liste d'albums.
 * <p/>
 * @author Mathieu Syben
 */
public abstract class AbstractAlbumList implements Serializable {

    /** Les listeners */
    private List<AlbumListListener> listListeners = new ArrayList<AlbumListListener>();

    /**
     * Met à jour liste des albums.
     * <p/>
     * @param albums les albums.
     */
    public abstract void updateList(List<Album> albums);

    /**
     * Sélectionne un album.
     * <p/>
     * @param album l'album à sélectionner.
     */
    public abstract void select(Album album);

    /**
     * Récupère l'album sélectionné.
     * <p/>
     * @return L'album sélectionné ou null si aucun.
     */
    public abstract Album getCurrentAlbum();

    /**
     * Récupère l'objet à afficher.
     * <p/>
     * @return l'objet à afficher.
     */
    public abstract Component getComponent();

    /**
     * Permet de définir si la liste est enabled ou non.
     * <p/>
     * @param enabled enabled ou pas.
     */
    public abstract void setEnabled(boolean enabled);

    /**
     * Ajoute un listener.
     * <p/>
     * @param listener le listener à ajouter.
     */
    public void addListListener(AlbumListListener listener) {
        listListeners.add(listener);
    }

    /**
     * Sélection d'un album.
     */
    protected void selection() {
        for (AlbumListListener listener : listListeners) {
            listener.selection();
        }
    }

    /**
     * Double Clic.
     */
    protected void doubleClic() {
        for (AlbumListListener listener : listListeners) {
            listener.doubleClic();
        }
    }

    /**
     * Met à jour la police de caractère.
     * <p/>
     * @param font La police à utiliser.
     */
    public abstract void setFont(Font font);
}
