diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/actions/SystemRemoteFileOpenWithMenu.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/actions/SystemRemoteFileOpenWithMenu.java index 89d6a082c3a..06ce9e29e49 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/actions/SystemRemoteFileOpenWithMenu.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/actions/SystemRemoteFileOpenWithMenu.java @@ -29,9 +29,13 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.rse.core.SystemBasePlugin; import org.eclipse.rse.files.ui.FileResources; import org.eclipse.rse.files.ui.resources.SystemEditableRemoteFile; +import org.eclipse.rse.files.ui.resources.SystemIFileProperties; import org.eclipse.rse.files.ui.resources.UniversalFileTransferUtility; +import org.eclipse.rse.files.ui.view.DownloadJob; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; +import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem; import org.eclipse.rse.ui.RSEUIPlugin; +import org.eclipse.rse.ui.view.ISystemEditableRemoteObject; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Event; @@ -173,19 +177,93 @@ protected void createMenuItem(Menu menu, final IEditorDescriptor descriptor, fin } -protected void openEditor(IRemoteFile file, IEditorDescriptor descriptor) +protected void openEditor(IRemoteFile remoteFile, IEditorDescriptor descriptor) { - SystemEditableRemoteFile editableFile = new SystemEditableRemoteFile(file, descriptor.getId()); - if (descriptor.getId().equals(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID)) + + SystemEditableRemoteFile editable = null; + if (descriptor == null) { - editableFile.openInSystemEditor(SystemBasePlugin.getActiveWorkbenchShell()); + editable = new SystemEditableRemoteFile(remoteFile); } + else + { + editable = new SystemEditableRemoteFile(remoteFile, descriptor.getId()); + } + boolean systemEditor = descriptor != null && descriptor.getId().equals(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID); + + + if (isFileCached(editable, remoteFile)) + { + try + { + if (systemEditor) + { + editable.openSystemEditor(); + } + else + { + editable.openEditor(); + } + } + catch (Exception e) + { + + } + } + else + { + DownloadJob oJob = new DownloadJob(editable, systemEditor); + oJob.schedule(); + } + +/* else { editableFile.open(SystemBasePlugin.getActiveWorkbenchShell()); } + */ + } +private boolean isFileCached(ISystemEditableRemoteObject editable, IRemoteFile remoteFile) +{ + // DY: check if the file exists and is read-only (because it was previously opened + // in the system editor) + IFile file = editable.getLocalResource(); + SystemIFileProperties properties = new SystemIFileProperties(file); + boolean newFile = !file.exists(); + + // detect whether there exists a temp copy already + if (!newFile && file.exists()) + { + // we have a local copy of this file, so we need to compare timestamps + + // get stored modification stamp + long storedModifiedStamp = properties.getRemoteFileTimeStamp(); + + // get updated remoteFile so we get the current remote timestamp + //remoteFile.markStale(true); + IRemoteFileSubSystem subsystem = remoteFile.getParentRemoteFileSubSystem(); + try + { + remoteFile = subsystem.getRemoteFileObject(remoteFile.getAbsolutePath()); + } + catch (Exception e) + { + + } + + // get the remote modified stamp + long remoteModifiedStamp = remoteFile.getLastModified(); + + // get dirty flag + boolean dirty = properties.getDirty(); + + boolean remoteNewer = (storedModifiedStamp != remoteModifiedStamp); + return (!dirty && !remoteNewer); + } + return false; +} /** * Get the local cache of the remote file, or null if none. @@ -224,8 +302,14 @@ protected IEditorDescriptor getDefaultEditor(IRemoteFile remoteFile) if (localFile == null) { return registry.getDefaultEditor(remoteFile.getName()); } - else { - return IDE.getDefaultEditor(localFile); + else + { + IEditorDescriptor descriptor = IDE.getDefaultEditor(localFile); + if (descriptor == null) + { + descriptor = getDefaultTextEditor(); + } + return descriptor; } } diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java index b90f211e107..798775a1fda 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java @@ -98,7 +98,8 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP private Exception e; private boolean completed = false; - + private boolean failed = false; + /** * Constructor for InternalDownloadFileRunnable */ @@ -117,7 +118,8 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP try { - completed = SystemEditableRemoteFile.this.download(monitor); + failed = !SystemEditableRemoteFile.this.download(monitor); + completed = true; monitor.done(); } catch (CoreException e) @@ -145,6 +147,11 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP { return completed; } + + public boolean didFail() + { + return failed; + } /** * Get the exception that may have been thrown @@ -467,7 +474,7 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP listener.removeIgnoreFile(localFile); downloadFileRunnable.throwException(); - return downloadFileRunnable.didComplete(); + return !downloadFileRunnable.didFail(); } else { @@ -591,6 +598,10 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP } subsystem.downloadUTF8(remoteFile, localPath, monitor); + if (monitor.isCanceled()) + { + return false; + } // get fresh remote file object remoteFile = subsystem.getRemoteFileObject(remoteFile.getAbsolutePath()); @@ -1493,7 +1504,7 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP /** * Open the system editor */ - private void openSystemEditor() throws PartInitException + public void openSystemEditor() throws PartInitException { IWorkbenchPage activePage = this.page; if (activePage == null) diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/DownloadJob.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/DownloadJob.java index 6a98add4c89..60ba5448f60 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/DownloadJob.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/DownloadJob.java @@ -21,6 +21,7 @@ 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.rse.files.ui.resources.SystemEditableRemoteFile; import org.eclipse.rse.files.ui.resources.SystemUniversalTempFileListener; import org.eclipse.rse.ui.view.ISystemEditableRemoteObject; import org.eclipse.swt.widgets.Display; @@ -30,9 +31,11 @@ public class DownloadJob extends Job public static class OpenEditorRunnable implements Runnable { private ISystemEditableRemoteObject _editable; - public OpenEditorRunnable(ISystemEditableRemoteObject editable) + private boolean _systemEditor; + public OpenEditorRunnable(ISystemEditableRemoteObject editable, boolean systemEditor) { _editable = editable; + _systemEditor = systemEditor; } public void run() @@ -41,7 +44,14 @@ public class DownloadJob extends Job { _editable.addAsListener(); _editable.setLocalResourceProperties(); - _editable.openEditor(); + if (_systemEditor) + { + ((SystemEditableRemoteFile)_editable).openSystemEditor(); + } + else + { + _editable.openEditor(); + } } catch (Exception e) { @@ -52,10 +62,12 @@ public class DownloadJob extends Job } private ISystemEditableRemoteObject _editable; - public DownloadJob(ISystemEditableRemoteObject editable) + private boolean _systemEditor; + public DownloadJob(ISystemEditableRemoteObject editable, boolean systemEditor) { super("Download"); _editable = editable; + _systemEditor = systemEditor; } public IStatus run(IProgressMonitor monitor) @@ -71,8 +83,11 @@ public class DownloadJob extends Job catch (Exception e) { } - OpenEditorRunnable oe = new OpenEditorRunnable(_editable); - Display.getDefault().asyncExec(oe); + if (!monitor.isCanceled()) + { + OpenEditorRunnable oe = new OpenEditorRunnable(_editable, _systemEditor); + Display.getDefault().asyncExec(oe); + } return Status.OK_STATUS; } diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/SystemViewRemoteFileAdapter.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/SystemViewRemoteFileAdapter.java index d58571cb8f7..e510a04ab0b 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/SystemViewRemoteFileAdapter.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/view/SystemViewRemoteFileAdapter.java @@ -2738,7 +2738,7 @@ public class SystemViewRemoteFileAdapter } else { - DownloadJob oJob = new DownloadJob(editable); + DownloadJob oJob = new DownloadJob(editable, false); oJob.schedule(); } } diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java index 0c3b9ebb0f8..7b0a15fcf82 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java @@ -454,6 +454,11 @@ public final class FileServiceSubSystem extends RemoteFileSubSystem implements I SystemMessageDialog dlg = new SystemMessageDialog(getShell(), e.getSystemMessage()); dlg.open(); } + + if (monitor.isCanceled()) + { + localFile.delete(); + } } protected boolean isBinary(String localEncoding, String hostEncoding, String remotePath)