/*
 * Created on Feb 28, 2004
 *
 */
package groovy.swt.impl;

import groovy.lang.Closure;
import groovy.swt.ClosureSupport;

import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.events.ExpansionListener;

/**
 * @author <a href:ckl at dacelo.nl">Christiaan ten Klooster </a>
 * @version $Revision$
 */
public class ExpansionListenerImpl implements ExpansionListener, ClosureSupport{
    private String type;
    private Closure closure;

    public ExpansionListenerImpl(String type) {
        this.type = type;
    }

    public Closure getClosure()
    {
        return closure;
    }

    public void setClosure(Closure closure)
    {
        this.closure = closure;
    }

    /*
     * @see org.eclipse.ui.forms.events.ExpansionListener#expansionStateChanging(org.eclipse.ui.forms.events.ExpansionEvent)
     */
    public void expansionStateChanging(ExpansionEvent event) {
        if (closure == null){
            throw new NullPointerException(
            "No closure has been configured for this Listener");
        }
        if ("expansionStateChanging".equals(type))
        {
            closure.call(event);
        }
    }

    /*
     * @see org.eclipse.ui.forms.events.ExpansionListener#expansionStateChanged(org.eclipse.ui.forms.events.ExpansionEvent)
     */
    public void expansionStateChanged(ExpansionEvent event) {
        if (closure == null){
            throw new NullPointerException(
            "No closure has been configured for this Listener");
        }
        if ("expansionStateChanged".equals(type))
        {
            closure.call(event);
        }
    }
}
