package org.xmind.ui.internal.editor;
import java.lang.reflect.InvocationTargetException;
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.IEditorInput;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.mindmap.IWorkbookRef;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.Logger;
/**
*
* @author Ren Siu
* @since 3.6.50
*/
public class BackgroundSaveWorkbook {
private static final BackgroundSaveWorkbook INSTANCE = new BackgroundSaveWorkbook();
private static boolean DEBUGGING = MindMapUIPlugin
.isDebugging("/debug/autosave"); //$NON-NLS-1$
private static class DaemonJob extends Job {
private int intervals;
/**
* @param name
*/
public DaemonJob(int intervals) {
super("Background Save Workbooks Daemon"); //$NON-NLS-1$
setSystem(true);
setPriority(LONG);
this.intervals = intervals;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.
* IProgressMonitor)
*/
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask(null, 1);
try {
do {
IStatus slept = sleep(monitor);
if (slept != null && !slept.isOK())
return slept;
if (DEBUGGING)
System.out.println("AutoSave starts now..."); //$NON-NLS-1$
IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
.getWorkbenchWindows();
for (IWorkbenchWindow ww : windows) {
IWorkbenchPage[] pages = ww.getPages();
for (IWorkbenchPage wp : pages) {
IEditorReference[] ers = wp.getEditorReferences();
for (IEditorReference er : ers) {
IEditorInput editorInput = er.getEditorInput();
if (editorInput == null)
continue;
IWorkbookRef workbookRef = editorInput
.getAdapter(IWorkbookRef.class);
save(monitor, workbookRef);
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
}
}
}
if (DEBUGGING)
System.out.println("AutoSave finishes."); //$NON-NLS-1$
} while (!monitor.isCanceled());
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
return Status.OK_STATUS;
} catch (Throwable e) {
if (e instanceof InterruptedException)
return Status.CANCEL_STATUS;
if (DEBUGGING) {
System.err.println("AutoSave error:"); //$NON-NLS-1$
e.printStackTrace();
}
String msg = "Background workbook saver daemon ended with unknown error"; //$NON-NLS-1$
Logger.log(e, msg);
return new Status(IStatus.WARNING, MindMapUI.PLUGIN_ID,
IStatus.ERROR, msg, e);
}
}
private IStatus sleep(IProgressMonitor monitor) {
int total = intervals;
try {
if (DEBUGGING && total > 5000) {
Thread.sleep(total - 5000);
System.out.println("AutoSave will start in 5 seconds..."); //$NON-NLS-1$
Thread.sleep(3000);
System.out.println("AutoSave will start in 2 seconds..."); //$NON-NLS-1$
Thread.sleep(2000);
} else {
if (DEBUGGING)
System.out.println("AutoSave will start in " //$NON-NLS-1$
+ (total / 1000) + " seconds..."); //$NON-NLS-1$
Thread.sleep(total);
}
} catch (InterruptedException e) {
return Status.CANCEL_STATUS;
}
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
return Status.OK_STATUS;
}
private void save(IProgressMonitor monitor, IWorkbookRef workbookRef)
throws InterruptedException, InvocationTargetException {
if (workbookRef.canSave() && workbookRef.isDirty()) {
workbookRef.save(monitor);
}
}
protected void canceling() {
super.canceling();
Thread t = getThread();
if (t != null)
t.interrupt();
}
}
private DaemonJob daemon = null;
public synchronized void reset(int intervals, boolean enabled) {
stopAll();
if (enabled) {
daemon = new DaemonJob(intervals);
daemon.schedule();
}
}
public synchronized boolean isRunning() {
return daemon != null;
}
/**
*
*/
public synchronized void stopAll() {
if (daemon != null) {
Thread thread = daemon.getThread();
daemon.cancel();
if (thread != null) {
thread.interrupt();
}
daemon = null;
}
}
public static BackgroundSaveWorkbook getInstance() {
return INSTANCE;
}
}