package com.laboki.eclipse.plugin.smartsave.main; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.ui.IEditorPart; import com.google.common.base.Optional; import com.google.common.eventbus.Subscribe; import com.laboki.eclipse.plugin.smartsave.contexts.EditorContext; import com.laboki.eclipse.plugin.smartsave.events.SaveEvent; import com.laboki.eclipse.plugin.smartsave.instance.Instance; import com.laboki.eclipse.plugin.smartsave.task.Task; public final class Saver extends WorkspaceJob implements Instance, Runnable { private static final String NAME = "+SaverWorkspaceJobName+"; private final Optional<IEditorPart> editor = EditorContext.getEditor(); public Saver() { super(Saver.NAME); this.setProperties(); } private void setProperties() { this.setPriority(Job.DECORATE); this.setUser(false); this.setSystem(true); this.updateRule(); } private void updateRule() { final Optional<IFile> file = EditorContext.getFile(this.editor); if (file.isPresent()) this.setRule(file.get()); } @Override public Instance start() { EventBus.register(this); return this; } @Override public Instance stop() { EventBus.unregister(this); return this; } @Override public IStatus runInWorkspace(final IProgressMonitor monitor) throws CoreException { if (monitor.isCanceled()) return Status.CANCEL_STATUS; EditorContext.asyncExec(this); return Status.OK_STATUS; } @Override public void run() { EditorContext.savePart(this.editor); } @Override public boolean belongsTo(final Object family) { return family.equals(Scheduler.FAMILY); } @Subscribe public void eventHandler(final SaveEvent event) { new Task() { @Override public void execute() { Saver.this.schedule(Scheduler.DELAY); } }.setFamily(Scheduler.FAMILY) .setRule(Scheduler.RULE) .setDelay(Scheduler.DELAY) .start(); } }