package org.netbeans.gradle.project.util;
import javax.swing.event.ChangeListener;
import org.jtrim.concurrent.GenericUpdateTaskExecutor;
import org.jtrim.concurrent.TaskExecutor;
import org.jtrim.concurrent.UpdateTaskExecutor;
import org.jtrim.swing.concurrent.SwingTaskExecutor;
import org.openide.util.ChangeSupport;
public final class LazyChangeSupport {
private final ChangeSupport changeSupport;
private final UpdateTaskExecutor eventExecutor;
private final Runnable eventDispatcher;
private LazyChangeSupport(Object source, TaskExecutor eventExecutor) {
this.changeSupport = new ChangeSupport(source);
this.eventExecutor = new GenericUpdateTaskExecutor(eventExecutor);
this.eventDispatcher = new EventDispatcher(changeSupport);
}
public static LazyChangeSupport createSwing(Source source) {
return create(source, SwingTaskExecutor.getStrictExecutor(true));
}
public static LazyChangeSupport create(Source source, TaskExecutor eventExecutor) {
LazyChangeSupport result = new LazyChangeSupport(source, eventExecutor);
source.init(result);
return result;
}
public void fireChange() {
eventExecutor.execute(eventDispatcher);
}
public void addChangeListener(ChangeListener listener) {
changeSupport.addChangeListener(listener);
}
public void removeChangeListener(ChangeListener listener) {
changeSupport.removeChangeListener(listener);
}
public interface Source {
public void init(LazyChangeSupport changes);
}
private static class EventDispatcher implements Runnable {
private final ChangeSupport changes;
public EventDispatcher(ChangeSupport changes) {
this.changes = changes;
}
@Override
public void run() {
changes.fireChange();
}
}
}