package groovy.swt.impl;

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

import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;

/**
 * This implementation adds a ProgressListener to a browser widget
 * 
 * @author <a href="mailto:ckl@dacelo.nl">Christiaan ten Klooster </a>
 */
public class ProgressListenerImpl implements ProgressListener, ClosureSupport {

    private Closure closure;

    private String type;

    /**
     * @param type
     */
    public ProgressListenerImpl(String type)
    {
        this.type = type;
    }

    public Closure getClosure()
    {
        return closure;
    }

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

    /*
     * @see org.eclipse.swt.browser.ProgressListener#changed(org.eclipse.swt.browser.ProgressEvent)
     */
    public void changed(ProgressEvent event)
    {

        if (closure == null) { throw new NullPointerException(
                "No closure has been configured for this Listener"); }

        if ("changed".equals(type))
        {
            closure.setProperty("event", new CustomProgressEvent(event));
            closure.call(event);
        }

    }

    /*
     * @see org.eclipse.swt.browser.ProgressListener#completed(org.eclipse.swt.browser.ProgressEvent)
     */
    public void completed(ProgressEvent event)
    {
        if (closure == null) { throw new NullPointerException(
                "No closure has been configured for this Listener"); }

        if ("completed".equals(type))
        {
            closure.setProperty("event", new CustomProgressEvent(event));
            closure.call(event);
        }

    }

    public class CustomProgressEvent {

        private ProgressEvent event;

        public CustomProgressEvent(ProgressEvent event)
        {
            this.event = event;
        }

        public int getCurrent()
        {
            return event.current;
        }

        public int getTotal()
        {
            return event.total;
        }
    }

}
