package org.xmind.ui.internal.editor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
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.browser.IBrowserViewer;
import org.xmind.ui.browser.IBrowserViewerContribution;
import org.xmind.ui.browser.IBrowserViewerContribution2;
import org.xmind.ui.browser.IPropertyChangingListener;
import org.xmind.ui.browser.PropertyChangingEvent;
import org.xmind.ui.internal.dialogs.DialogMessages;
import org.xmind.ui.io.DownloadJob;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.Logger;
public class XMindFileBrowserContribution
implements IBrowserViewerContribution, IBrowserViewerContribution2 {
protected static class XMindFileListener
implements PropertyChangeListener, IPropertyChangingListener {
private IBrowserViewer viewer;
public XMindFileListener(IBrowserViewer viewer) {
this.viewer = viewer;
viewer.addPropertyChangeListener(IBrowserViewer.PROPERTY_LOCATION,
this);
}
/**
* @return the viewer
*/
public IBrowserViewer getViewer() {
return viewer;
}
/*
* (non-Javadoc)
*
* @seejava.beans.PropertyChangeListener#propertyChange(java.beans.
* PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt) {
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.ui.browser.IPropertyChangingListener#propertyChanging(org
* .xmind.ui.browser.PropertyChangingEvent)
*/
public void propertyChanging(PropertyChangingEvent event) {
if (!IBrowserViewer.PROPERTY_LOCATION
.equals(event.getPropertyName()))
return;
String location = (String) event.getNewValue();
if (location == null || "about:blank".equals(location)) //$NON-NLS-1$
return;
final ICommand command = Command.parseURI(location);
if (command != null) {
new CommandJob(command, null).schedule();
} else {
try {
URI uri = new URI(location);
String uriPath = uri.getPath();
if (uriPath != null
&& uriPath.endsWith(MindMapUI.FILE_EXT_XMIND)) {
downloadAndOpen(location,
FileUtils.getFileName(uriPath));
event.doit = false;
}
} catch (Throwable e) {
Logger.log(e);
}
}
}
/**
* @param location
* @param url
* @param connection
*/
private void downloadAndOpen(String location, String suggestedName) {
FileDialog dialog = new FileDialog(viewer.getControl().getShell(),
SWT.SAVE | SWT.SINGLE);
String ext = "*" + MindMapUI.FILE_EXT_XMIND; //$NON-NLS-1$
dialog.setFilterExtensions(new String[] { ext });
dialog.setFilterNames(new String[] { NLS.bind("{0} ({1})", //$NON-NLS-1$
DialogMessages.WorkbookFilterName, ext) });
dialog.setOverwrite(true);
dialog.setText(DialogMessages.Save_title);
dialog.setFileName(suggestedName);
final String path = dialog.open();
if (path == null)
return;
FileUtils.delete(new File(path));
File file = new File(path);
file.getParentFile().mkdirs();
final String tempPath = path + ".downloading"; //$NON-NLS-1$
DownloadJob job = new DownloadJob(file.getName(), location,
tempPath);
job.addJobChangeListener(new JobChangeAdapter() {
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.
* eclipse .core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void done(IJobChangeEvent event) {
if (event.getResult().isOK()) {
if (rename(tempPath, path)) {
openFile(path);
}
}
}
});
job.schedule();
}
private boolean rename(String tempPath, String path) {
File tempFile = new File(tempPath);
if (!tempFile.exists() || !tempFile.canRead())
return false;
return new File(tempPath).renameTo(new File(path));
}
private void openFile(String path) {
final File file = new File(path);
if (!file.exists() || !file.canRead())
return;
final IEditorInput[] input = new IEditorInput[1];
SafeRunner.run(new SafeRunnable() {
public void run() throws Exception {
input[0] = MindMapUI.getEditorInputFactory()
.createEditorInputForFile(file);
;
}
});
if (input[0] == null)
return;
final IWorkbench workbench = PlatformUI.getWorkbench();
if (workbench != null) {
Display display = workbench.getDisplay();
if (display != null && !display.isDisposed()) {
display.asyncExec(new Runnable() {
public void run() {
SafeRunner.run(new SafeRunnable() {
public void run() throws Exception {
openEditor(input[0], workbench);
}
});
}
});
}
}
// IWorkbook contents;
// try {
// contents = Core.getWorkbookBuilder().loadFromPath(path);
// final WorkbookEditorInput input = new WorkbookEditorInput(
// contents, path);
// final IWorkbench workbench = PlatformUI.getWorkbench();
// if (workbench != null) {
// workbench.getDisplay().asyncExec(new Runnable() {
// public void run() {
// openEditor(input, workbench);
// }
//
// });
// }
// } catch (Throwable e) {
// Logger.log(e);
// }
}
/**
* @param input
* @param workbench
*/
private void openEditor(final IEditorInput input,
final IWorkbench workbench) throws Exception {
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
if (window != null) {
IWorkbenchPage page = window.getActivePage();
if (page != null) {
page.openEditor(input, MindMapUI.MINDMAP_EDITOR_ID);
}
}
}
public void dispose() {
viewer.removePropertyChangeListener(this);
}
}
private Map<IBrowserViewer, XMindFileListener> map = new HashMap<IBrowserViewer, XMindFileListener>();
public void fillToolBar(IBrowserViewer viewer,
IContributionManager toolBar) {
}
public void installBrowserListeners(IBrowserViewer viewer) {
XMindFileListener listener = new XMindFileListener(viewer);
map.put(viewer, listener);
}
public void uninstallBrowserListeners(IBrowserViewer viewer) {
XMindFileListener listener = map.remove(viewer);
if (listener != null) {
listener.dispose();
}
}
}