package com.yoursway.databinding.resources.internal; import static java.util.Collections.emptyList; import java.util.Set; import org.eclipse.core.databinding.observable.set.ObservableSet; import org.eclipse.core.databinding.observable.set.SetDiff; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.ResourcesPlugin; import com.yoursway.common.resources.ResourceUtils; import com.yoursway.databinding.commons.YourSwayRealm; import com.yoursway.databinding.resources.IContainerObservableSet; public class ShallowChildrenObservable extends ObservableSet implements IContainerObservableSet, IResourceChangeListener { final static Iterable<IResource> NO_RESOURCES = emptyList(); private final IContainer container; public ShallowChildrenObservable(YourSwayRealm realm, IContainer container) { super(realm, null, IResource.class); this.container = container; setWrappedSet(new ShallowChildrenSet(container)); ResourcesPlugin.getWorkspace().addResourceChangeListener(this); } @Override public synchronized void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); } public void resourceChanged(IResourceChangeEvent event) { final IResourceDelta delta = event.getDelta(); if (delta != null && ResourceUtils.changedInDelta(delta, container.getFullPath())) fire(); } private void fire() { getRealm().exec(new Runnable() { public void run() { fireSetChange(new SetDiff() { @Override public Set<?> getAdditions() { throw new UnsupportedOperationException(); } @Override public Set<?> getRemovals() { throw new UnsupportedOperationException(); } }); } }); } }