package rhogenwizard;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.eclipse.core.internal.resources.ResourceException;
import org.eclipse.core.resources.IProject;
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 org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.IStartup;
import rhogenwizard.preferences.PreferenceInitializer;
import rhogenwizard.project.IRhomobileProject;
import rhogenwizard.project.ProjectFactory;
import rhogenwizard.project.RhodesProject;
import rhogenwizard.project.RhoelementsProject;
import rhogenwizard.project.extension.BadProjectTagException;
import rhogenwizard.project.extension.ProjectNotFoundException;
public class StartupImpl implements IStartup
{
private static class UpdateRhomobileProject
{
private static int refreshDelay = 1;
private static void deferredRefresh(final IProject project)
{
final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
Runnable task = new Runnable()
{
public void run()
{
UpdateRhomobileProject.update(project);
}
};
worker.schedule(task, refreshDelay, TimeUnit.SECONDS);
}
public static void update(IProject project)
{
try
{
if (RhodesProject.checkNature(project) || RhoelementsProject.checkNature(project))
{
IRhomobileProject rhoProject = ProjectFactory.getInstance().convertFromProject(project);
rhoProject.refreshProject();
}
}
catch (ResourceException e)
{
deferredRefresh(project);
}
catch (BadProjectTagException e)
{
e.printStackTrace();
}
catch (ProjectNotFoundException e)
{
e.printStackTrace();
}
catch (CoreException e)
{
e.printStackTrace();
}
}
}
private static class ResourceChangeListener implements IResourceChangeListener
{
@Override
public void resourceChanged(IResourceChangeEvent event)
{
if (event.getType() != IResourceChangeEvent.POST_CHANGE)
return;
IResourceDelta mainDelta = event.getDelta();
IResourceDelta[] resDeltas = mainDelta.getAffectedChildren(IResourceDelta.ADDED);
for (IResourceDelta resDelta : resDeltas)
{
IResource resource = resDelta.getResource();
if (resource instanceof IProject)
{
UpdateRhomobileProject.update((IProject) resource);
}
}
}
}
@Override
public void earlyStartup()
{
ResourcesPlugin.getWorkspace().addResourceChangeListener(new ResourceChangeListener(), IResourceChangeEvent.POST_CHANGE);
}
}