/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.cathy.internal.jobs;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
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.SubProgressMonitor;
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.IWorkbench;
import org.xmind.cathy.internal.CathyPlugin;
import org.xmind.cathy.internal.WorkbenchMessages;
import org.xmind.core.Core;
import org.xmind.core.IWorkbook;
import org.xmind.core.command.Command;
import org.xmind.core.command.CommandJob;
import org.xmind.core.command.ICommand;
import org.xmind.core.util.FileUtils;
import org.xmind.ui.internal.MarkerImpExpUtils;
import org.xmind.ui.internal.imports.freemind.FreeMindImporter;
import org.xmind.ui.internal.imports.mm.MindManagerImporter;
import org.xmind.ui.internal.prefs.MarkerManagerPrefPage;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.PrefUtils;
import org.xmind.ui.wizards.MindMapImporter;
/**
* @author Frank Shaka
*
*/
public class OpenFilesJob extends AbstractCheckFilesJob {
private List<String> filesToOpen;
private boolean markersImported = false;
private List<String> commandFilesToOpen = new ArrayList<String>(1);
public OpenFilesJob(IWorkbench workbench, String jobName) {
super(workbench, jobName);
this.filesToOpen = new ArrayList<String>();
}
/**
*
*/
public OpenFilesJob(IWorkbench workbench, String jobName,
Collection<String> files) {
super(workbench, jobName);
this.filesToOpen = new ArrayList<String>(files);
}
@Override
protected void prepare() {
markersImported = false;
super.prepare();
}
@Override
protected void finish() {
filesToOpen.clear();
markersImported = false;
super.finish();
}
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask(null, getTotalSteps());
doCheckAndOpenFiles(monitor);
monitor.done();
return Status.OK_STATUS;
}
/**
* Number of ticks that this job is going to consume.
*
* @return
*/
protected int getTotalSteps() {
return 4;
}
/**
* Opens files.
*
* @param monitor
* the progress monitor
*/
protected void doCheckAndOpenFiles(IProgressMonitor monitor) {
filterFilesToOpen(filesToOpen, new SubProgressMonitor(monitor, 1));
if (filesToOpen.isEmpty()) {
monitor.worked(2);
} else {
addEditors(new SubProgressMonitor(monitor, 1));
openEditors(monitor,
WorkbenchMessages.CheckOpenFilesJob_OpenFiles_name, 1,
true);
}
onFilsOpened(new SubProgressMonitor(monitor, 1));
}
/**
*
*/
protected void onFilsOpened(IProgressMonitor monitor) {
monitor.beginTask(null, 1);
if (markersImported)
showMarkersPrefPage();
if (!commandFilesToOpen.isEmpty()) {
openXMindCommandFiles();
}
monitor.done();
}
/**
* Filters the files to open. Subclasses may add/remove files to/from the
* `filesToOpen` list.
*
* @param monitor
*/
protected void filterFilesToOpen(List<String> filesToOpen,
IProgressMonitor monitor) {
monitor.beginTask(null, 1);
monitor.done();
}
/**
* Add editors to open.
*
* @param monitor
*/
protected void addEditors(final IProgressMonitor monitor) {
monitor.beginTask(WorkbenchMessages.CheckOpenFilesJob_OpenFiles_name,
filesToOpen.size());
for (final String fileName : filesToOpen) {
SafeRunner.run(new SafeRunnable(NLS.bind(
WorkbenchMessages.CheckOpenFilesJob_FailsToOpen_message,
fileName)) {
public void run() throws Exception {
monitor.subTask(fileName);
IEditorInput input = createEditorInput(fileName, monitor);
if (input != null) {
addEditorToOpen(input);
}
monitor.worked(1);
}
});
}
monitor.done();
}
/**
* Create an editor input from the file, or do anything to open the file.
*
* @param fileName
* @param monitor
* @return
* @throws Exception
*/
protected IEditorInput createEditorInput(String fileName,
IProgressMonitor monitor) throws Exception {
final ICommand command = Command.parseURI(fileName);
if (command != null) {
new CommandJob(command, null).schedule();
return null;
}
final String path = fileName;
String extension = FileUtils.getExtension(path);
if (CathyPlugin.COMMAND_FILE_EXT.equalsIgnoreCase(extension)) {
return openXMindCommandFile(path);
} else if (MindMapUI.FILE_EXT_TEMPLATE.equalsIgnoreCase(extension)) {
return newFromTemplate(path, fileName);
} else if (".mmap".equalsIgnoreCase(extension)) { //$NON-NLS-1$
return importMindManagerFile(path, fileName);
} else if (".mm".equalsIgnoreCase(extension)) { //$NON-NLS-1$
return importFreeMindFile(path, fileName);
} else if (MindMapUI.FILE_EXT_MARKER_PACKAGE
.equalsIgnoreCase(extension)) {
return importMarkers(path);
} else if (new File(path).exists()) {
return MindMapUI.getEditorInputFactory()
.createEditorInputForFile(new File(path));
} else {
// assumes we're opening xmind files
IWorkbook workbook = Core.getWorkbookBuilder().loadFromPath(path);
return workbook == null ? null
: MindMapUI.getEditorInputFactory()
.createEditorInputForPreLoadedWorkbook(workbook,
fileName);
}
}
protected IEditorInput newFromTemplate(String path, String fileName)
throws Exception {
IWorkbook workbook = Core.getWorkbookBuilder().loadFromPath(path);
return workbook == null ? null
: MindMapUI.getEditorInputFactory()
.createEditorInputForPreLoadedWorkbook(workbook,
fileName);
}
protected IEditorInput importMindManagerFile(String path, String fileName)
throws Exception {
MindMapImporter importer = new MindManagerImporter(path);
importer.build();
IWorkbook workbook = importer.getTargetWorkbook();
return workbook == null ? null
: MindMapUI.getEditorInputFactory()
.createEditorInputForPreLoadedWorkbook(workbook,
fileName);
}
protected IEditorInput importFreeMindFile(String path, String fileName)
throws Exception {
FreeMindImporter importer = new FreeMindImporter(path);
importer.build();
IWorkbook workbook = importer.getTargetWorkbook();
return workbook == null ? null
: MindMapUI.getEditorInputFactory()
.createEditorInputForPreLoadedWorkbook(workbook,
fileName);
}
protected IEditorInput importMarkers(String path) throws Exception {
MarkerImpExpUtils.importMarkerPackage(path);
markersImported = true;
return null;
}
private void showMarkersPrefPage() {
Display display = getWorkbench().getDisplay();
if (display == null || display.isDisposed())
return;
display.asyncExec(new Runnable() {
public void run() {
PrefUtils.openPrefDialog(null, MarkerManagerPrefPage.ID);
}
});
}
private IEditorInput openXMindCommandFile(String path) {
commandFilesToOpen.add(path);
return null;
}
private void openXMindCommandFiles() {
for (String path : commandFilesToOpen) {
new OpenXMindCommandFileJob(path).schedule(500);
}
}
}