package org.xmind.cathy.internal.jobs;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.util.SafeRunnable;
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.CathyPlugin;
import org.xmind.cathy.internal.WorkbenchMessages;
import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.internal.dialogs.NewWorkbookWizardDialog;
import org.xmind.ui.internal.editor.MME;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.prefs.PrefConstants;
public class StartupJob extends Job {
private final IWorkbench workbench;
public StartupJob(IWorkbench workbench, boolean showProgress) {
super(WorkbenchMessages.StartupJob_jobName);
this.workbench = workbench;
setSystem(!showProgress);
}
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask(null, 3);
doStartup(monitor);
Display display = workbench.getDisplay();
if (display != null && !display.isDisposed()) {
display.asyncExec(new Runnable() {
public void run() {
System.setProperty(
"org.xmind.cathy.app.status", "workbenchReady"); //$NON-NLS-1$ //$NON-NLS-2$
}
});
}
monitor.done();
return Status.OK_STATUS;
}
protected void doStartup(IProgressMonitor monitor) {
checkAndRecoverFiles(monitor);
checkAndOpenFiles(monitor);
openStartupMap(monitor);
}
protected void openStartupMap(IProgressMonitor monitor) {
if (!hasOpenedEditors()) {
int action = CathyPlugin.getDefault().getPreferenceStore()
.getInt(CathyPlugin.STARTUP_ACTION);
if (action == CathyPlugin.STARTUP_ACTION_HOME) {
monitor.subTask(WorkbenchMessages.StartupJob_OpenHomeMap);
final String location = MindMapUIPlugin.getDefault()
.getPreferenceStore()
.getString(PrefConstants.HOME_MAP_LOCATION);
if (location == null || "".equals(location)) { //$NON-NLS-1$
// do nothing
} else {
SafeRunner.run(new SafeRunnable() {
public void run() throws Exception {
openEditor(MME.createFileEditorInput(location));
}
});
}
} else if (action == CathyPlugin.STARTUP_ACTION_BLANK) {
monitor.subTask(WorkbenchMessages.StartupJob_OpenBlankMap);
openBlankMap();
}
if (!hasOpenedEditors()) {
showStartupDialog();
}
}
monitor.worked(1);
}
private void showStartupDialog() {
workbench.getDisplay().syncExec(new Runnable() {
public void run() {
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
if (window != null) {
NewWorkbookWizardDialog.openWizard(window, true);
}
}
});
}
private boolean hasOpenedEditors() {
final boolean[] ret = new boolean[1];
ret[0] = false;
workbench.getDisplay().syncExec(new Runnable() {
public void run() {
for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
IWorkbenchPage page = window.getActivePage();
if (page != null) {
if (page.getEditorReferences().length > 0) {
ret[0] = true;
return;
}
}
}
}
});
return ret[0];
}
/**
* Check and recover files opened in the last workbench session. This method
* consumes 2 ticks from the given progress monitor.
*
* @param monitor
*/
protected void checkAndRecoverFiles(IProgressMonitor monitor) {
Job subJob = new CheckRecoverFilesJob(workbench);
subJob.setProgressGroup(monitor, 1);
subJob.schedule();
try {
subJob.join();
} catch (InterruptedException e) {
}
}
protected void checkAndOpenFiles(IProgressMonitor monitor) {
Job subJob = new CheckOpenFilesJob(workbench);
subJob.setProgressGroup(monitor, 1);
subJob.schedule();
try {
subJob.join();
} catch (InterruptedException e) {
}
}
private IEditorPart openBlankMap() {
return openEditor(MME.createNonExistingEditorInput());
}
private IEditorPart openEditor(final IEditorInput editorInput) {
final IEditorPart[] editor = new IEditorPart[1];
workbench.getDisplay().syncExec(new Runnable() {
public void run() {
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
if (window != null) {
final IWorkbenchPage page = window.getActivePage();
if (page != null) {
SafeRunner.run(new SafeRunnable() {
public void run() throws Exception {
editor[0] = page.openEditor(editorInput,
MindMapUI.MINDMAP_EDITOR_ID);
}
});
}
}
}
});
return editor[0];
}
}