1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-05 23:35:48 +02:00

Bug 160788 fix and additional changes to make "open with->" occur as cancellable job

This commit is contained in:
David McKnight 2006-10-13 16:14:28 +00:00
parent 1cd962c374
commit 07421cba57
5 changed files with 131 additions and 16 deletions

View file

@ -29,9 +29,13 @@ import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.rse.core.SystemBasePlugin; import org.eclipse.rse.core.SystemBasePlugin;
import org.eclipse.rse.files.ui.FileResources; import org.eclipse.rse.files.ui.FileResources;
import org.eclipse.rse.files.ui.resources.SystemEditableRemoteFile; 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.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.IRemoteFile;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
import org.eclipse.rse.ui.RSEUIPlugin; import org.eclipse.rse.ui.RSEUIPlugin;
import org.eclipse.rse.ui.view.ISystemEditableRemoteObject;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Event; 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 else
{ {
editableFile.open(SystemBasePlugin.getActiveWorkbenchShell()); 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 <code>null</code> if none. * Get the local cache of the remote file, or <code>null</code> if none.
@ -224,8 +302,14 @@ protected IEditorDescriptor getDefaultEditor(IRemoteFile remoteFile)
if (localFile == null) { if (localFile == null) {
return registry.getDefaultEditor(remoteFile.getName()); return registry.getDefaultEditor(remoteFile.getName());
} }
else { else
return IDE.getDefaultEditor(localFile); {
IEditorDescriptor descriptor = IDE.getDefaultEditor(localFile);
if (descriptor == null)
{
descriptor = getDefaultTextEditor();
}
return descriptor;
} }
} }

View file

@ -98,7 +98,8 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
private Exception e; private Exception e;
private boolean completed = false; private boolean completed = false;
private boolean failed = false;
/** /**
* Constructor for InternalDownloadFileRunnable * Constructor for InternalDownloadFileRunnable
*/ */
@ -117,7 +118,8 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
try try
{ {
completed = SystemEditableRemoteFile.this.download(monitor); failed = !SystemEditableRemoteFile.this.download(monitor);
completed = true;
monitor.done(); monitor.done();
} }
catch (CoreException e) catch (CoreException e)
@ -145,6 +147,11 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
{ {
return completed; return completed;
} }
public boolean didFail()
{
return failed;
}
/** /**
* Get the exception that may have been thrown * Get the exception that may have been thrown
@ -467,7 +474,7 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
listener.removeIgnoreFile(localFile); listener.removeIgnoreFile(localFile);
downloadFileRunnable.throwException(); downloadFileRunnable.throwException();
return downloadFileRunnable.didComplete(); return !downloadFileRunnable.didFail();
} }
else else
{ {
@ -591,6 +598,10 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
} }
subsystem.downloadUTF8(remoteFile, localPath, monitor); subsystem.downloadUTF8(remoteFile, localPath, monitor);
if (monitor.isCanceled())
{
return false;
}
// get fresh remote file object // get fresh remote file object
remoteFile = subsystem.getRemoteFileObject(remoteFile.getAbsolutePath()); remoteFile = subsystem.getRemoteFileObject(remoteFile.getAbsolutePath());
@ -1493,7 +1504,7 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
/** /**
* Open the system editor * Open the system editor
*/ */
private void openSystemEditor() throws PartInitException public void openSystemEditor() throws PartInitException
{ {
IWorkbenchPage activePage = this.page; IWorkbenchPage activePage = this.page;
if (activePage == null) if (activePage == null)

View file

@ -21,6 +21,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job; 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.files.ui.resources.SystemUniversalTempFileListener;
import org.eclipse.rse.ui.view.ISystemEditableRemoteObject; import org.eclipse.rse.ui.view.ISystemEditableRemoteObject;
import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Display;
@ -30,9 +31,11 @@ public class DownloadJob extends Job
public static class OpenEditorRunnable implements Runnable public static class OpenEditorRunnable implements Runnable
{ {
private ISystemEditableRemoteObject _editable; private ISystemEditableRemoteObject _editable;
public OpenEditorRunnable(ISystemEditableRemoteObject editable) private boolean _systemEditor;
public OpenEditorRunnable(ISystemEditableRemoteObject editable, boolean systemEditor)
{ {
_editable = editable; _editable = editable;
_systemEditor = systemEditor;
} }
public void run() public void run()
@ -41,7 +44,14 @@ public class DownloadJob extends Job
{ {
_editable.addAsListener(); _editable.addAsListener();
_editable.setLocalResourceProperties(); _editable.setLocalResourceProperties();
_editable.openEditor(); if (_systemEditor)
{
((SystemEditableRemoteFile)_editable).openSystemEditor();
}
else
{
_editable.openEditor();
}
} }
catch (Exception e) catch (Exception e)
{ {
@ -52,10 +62,12 @@ public class DownloadJob extends Job
} }
private ISystemEditableRemoteObject _editable; private ISystemEditableRemoteObject _editable;
public DownloadJob(ISystemEditableRemoteObject editable) private boolean _systemEditor;
public DownloadJob(ISystemEditableRemoteObject editable, boolean systemEditor)
{ {
super("Download"); super("Download");
_editable = editable; _editable = editable;
_systemEditor = systemEditor;
} }
public IStatus run(IProgressMonitor monitor) public IStatus run(IProgressMonitor monitor)
@ -71,8 +83,11 @@ public class DownloadJob extends Job
catch (Exception e) catch (Exception e)
{ {
} }
OpenEditorRunnable oe = new OpenEditorRunnable(_editable); if (!monitor.isCanceled())
Display.getDefault().asyncExec(oe); {
OpenEditorRunnable oe = new OpenEditorRunnable(_editable, _systemEditor);
Display.getDefault().asyncExec(oe);
}
return Status.OK_STATUS; return Status.OK_STATUS;
} }

View file

@ -2738,7 +2738,7 @@ public class SystemViewRemoteFileAdapter
} }
else else
{ {
DownloadJob oJob = new DownloadJob(editable); DownloadJob oJob = new DownloadJob(editable, false);
oJob.schedule(); oJob.schedule();
} }
} }

View file

@ -454,6 +454,11 @@ public final class FileServiceSubSystem extends RemoteFileSubSystem implements I
SystemMessageDialog dlg = new SystemMessageDialog(getShell(), e.getSystemMessage()); SystemMessageDialog dlg = new SystemMessageDialog(getShell(), e.getSystemMessage());
dlg.open(); dlg.open();
} }
if (monitor.isCanceled())
{
localFile.delete();
}
} }
protected boolean isBinary(String localEncoding, String hostEncoding, String remotePath) protected boolean isBinary(String localEncoding, String hostEncoding, String remotePath)