package org.xmind.cathy.internal.jobs; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.xmind.cathy.internal.WorkbenchMessages; import org.xmind.ui.mindmap.MindMapUI; public abstract class AbstractCheckFilesJob extends Job { private final IWorkbench workbench; private List<IEditorInput> editorsToOpen; public AbstractCheckFilesJob(IWorkbench workbench, String jobName) { super(jobName); this.workbench = workbench; addJobChangeListener(new JobChangeAdapter() { @Override public void aboutToRun(IJobChangeEvent event) { prepare(); } /* * (non-Javadoc) * * @see * org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse * .core.runtime.jobs.IJobChangeEvent) */ @Override public void done(IJobChangeEvent event) { finish(); } }); } protected void prepare() { editorsToOpen = null; } protected void finish() { editorsToOpen = null; } public IWorkbench getWorkbench() { return workbench; } protected void addEditorToOpen(IEditorInput input) { if (editorsToOpen == null) editorsToOpen = new ArrayList<IEditorInput>(); editorsToOpen.add(input); } protected void openEditors(IProgressMonitor monitor, String taskName, int ticks, boolean activate) { if (editorsToOpen != null && !editorsToOpen.isEmpty()) { monitor = new SubProgressMonitor(monitor, ticks); monitor.beginTask(taskName, editorsToOpen.size()); openEditors(monitor, editorsToOpen, activate); monitor.done(); } else { monitor.worked(ticks); } } protected void openEditors(IProgressMonitor monitor, List<IEditorInput> editorInputs, boolean activate) { for (final IEditorInput input : editorInputs) { monitor.subTask(input.getName()); IEditorPart editor = openEditor(input, activate); if (editor != null) activate = false; monitor.worked(1); } } protected IEditorPart openEditor(final IEditorInput input, final boolean activate) { if (input == null) return null; Display display = workbench.getDisplay(); if (display == null) return null; final IEditorPart[] result = new IEditorPart[1]; display.syncExec(new Runnable() { public void run() { IWorkbenchWindow window = getPrimaryWindow(); if (window == null) return; final IWorkbenchPage page = window.getActivePage(); if (page != null) { SafeRunner.run(new SafeRunnable( NLS.bind( WorkbenchMessages.CheckOpenFilesJob_FailsToOpen_message, input.getName())) { public void run() throws Exception { result[0] = page.openEditor(input, MindMapUI.MINDMAP_EDITOR_ID, activate); } }); } } }); return result[0]; } private IWorkbenchWindow getPrimaryWindow() { IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); if (window == null) { IWorkbenchWindow[] windows = workbench.getWorkbenchWindows(); if (windows != null && windows.length > 0) { window = windows[0]; } } return window; } }