package bndtools.views.repository;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPersistable;
import org.osgi.resource.Requirement;

public abstract class SearchPanel implements IPersistable {

    public static final String PROP_VALUE = "requirement";
    public final String PROP_ERROR = "error";

    private final PropertyChangeSupport propSupport = new PropertyChangeSupport(this);

    private String error;
    private Requirement requirement;

    public abstract Control createControl(Composite parent);

    public abstract void setFocus();

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propSupport.removePropertyChangeListener(listener);
    }

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        propSupport.addPropertyChangeListener(propertyName, listener);
    }

    public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        propSupport.removePropertyChangeListener(propertyName, listener);
    }

    public String getError() {
        return this.error;
    }

    protected void setError(String error) {
        String oldError = this.error;
        this.error = error;
        propSupport.firePropertyChange(PROP_ERROR, oldError, error);
    }

    public Requirement getRequirement() {
        return this.requirement;
    }

    protected void setRequirement(Requirement requirement) {
        Requirement oldRequiremenmt = this.requirement;
        this.requirement = requirement;
        propSupport.firePropertyChange(PROP_VALUE, oldRequiremenmt, requirement);
    }

    public Image createImage(@SuppressWarnings("unused") Device device) {
        return null;
    }

    public abstract void restoreState(IMemento memento);

}
