import java.util.ArrayList;

// Element du circuit, classe abstraite
public abstract class CircuitElement {
	
	// Nom du composant
	protected String composantName = "Composant";
	public String getComposantName(){ return composantName; }
	// "Surnom" du composant
	protected String Name = composantName;
	public String getName(){ return Name; }
	public void setName(String newName){ Name = newName; }
	// Abreviation du nom du composant
	protected String charName = "?";
	public String getCharName(){ return charName; }
	
	// Liste des pins I/O
	public ArrayList<Pin> pin_in;	
	public ArrayList<Pin> pin_out;
	
	// Constructeur
	public CircuitElement(){
		pin_in 	= new ArrayList<Pin>();
		pin_out = new ArrayList<Pin>();
	}
	
	// Gestion de la destruction de l'element
	protected boolean isDisposed = false; // Deja detruit ou non
	public boolean isDisposed(){ return isDisposed; }
	public void finalize(){ Dispose(); } // Destructeur appel Dispose
	public void Dispose(){ // Destruction de l'element
		if(isDisposed) return;
		isDisposed = true;
		// Effacement des pins I/O
		pin_in.clear();
		pin_out.clear();
		// On previent ceux qui le veulent qu'on a ete detruit
		fireDisposed();
	}
	
	
	// Ecouteur de destruction de l'element
	public interface CircuitElementListener {
	    void disposed(CircuitElement circuitElement);
	}
	
	private ArrayList<CircuitElementListener> circuitElementListeners = new ArrayList<CircuitElementListener>();
	public void addCircuitElementListener(CircuitElementListener listener) {
		if(isDisposed) return;
		circuitElementListeners.add(listener);
    }    
    public void remCircuitElementListener(CircuitElementListener listener) {
    	if(isDisposed) return;
    	circuitElementListeners.remove(listener);
    }
    
    private void fireDisposed(){
    	for(CircuitElementListener circuitElementListener : circuitElementListeners)
    		circuitElementListener.disposed(this);
    }

}
