mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-08 17:45:24 +02:00
drag and drop transfer operations now use Worker jobs instead of UI jobs. Allows for better ui responsiveness and concurrent operations.
This commit is contained in:
parent
2951860b14
commit
6ed9345743
5 changed files with 108 additions and 50 deletions
|
@ -61,6 +61,7 @@ import org.eclipse.rse.ui.messages.SystemMessageDialog;
|
||||||
import org.eclipse.swt.widgets.Display;
|
import org.eclipse.swt.widgets.Display;
|
||||||
import org.eclipse.swt.widgets.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.ui.PlatformUI;
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
import org.eclipse.ui.actions.RenameResourceAction;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1492,20 +1493,41 @@ public class UniversalFileTransferUtility
|
||||||
|
|
||||||
if (targetFileOrFolder != null && targetFileOrFolder.exists())
|
if (targetFileOrFolder != null && targetFileOrFolder.exists())
|
||||||
{
|
{
|
||||||
ValidatorFileUniqueName validator = null;
|
RenameRunnable rr = new RenameRunnable(targetFileOrFolder);
|
||||||
SystemRenameSingleDialog dlg = new SystemRenameSingleDialog(shell, true, targetFileOrFolder, validator); // true => copy-collision-mode
|
Display.getDefault().syncExec(rr);
|
||||||
|
newName = rr.getNewName();
|
||||||
dlg.open();
|
|
||||||
if (!dlg.wasCancelled())
|
|
||||||
newName = dlg.getNewName();
|
|
||||||
else
|
|
||||||
newName = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return newName;
|
return newName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class RenameRunnable implements Runnable
|
||||||
|
{
|
||||||
|
private IRemoteFile _targetFileOrFolder;
|
||||||
|
private String _newName;
|
||||||
|
public RenameRunnable(IRemoteFile targetFileOrFolder)
|
||||||
|
{
|
||||||
|
_targetFileOrFolder = targetFileOrFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
ValidatorFileUniqueName validator = null;
|
||||||
|
SystemRenameSingleDialog dlg = new SystemRenameSingleDialog(null, true, _targetFileOrFolder, validator); // true => copy-collision-mode
|
||||||
|
|
||||||
|
dlg.open();
|
||||||
|
if (!dlg.wasCancelled())
|
||||||
|
_newName = dlg.getNewName();
|
||||||
|
else
|
||||||
|
_newName = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNewName()
|
||||||
|
{
|
||||||
|
return _newName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected static String checkForCollision(IRemoteFile targetFolder, String oldName)
|
protected static String checkForCollision(IRemoteFile targetFolder, String oldName)
|
||||||
{
|
{
|
||||||
String newName = oldName;
|
String newName = oldName;
|
||||||
|
|
|
@ -1656,7 +1656,15 @@ public class SystemViewRemoteFileAdapter
|
||||||
{
|
{
|
||||||
if (fromSet instanceof SystemWorkspaceResourceSet)
|
if (fromSet instanceof SystemWorkspaceResourceSet)
|
||||||
{
|
{
|
||||||
|
Shell shell = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
shell = getShell();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
boolean doSuperTransferProperty = RSEUIPlugin.getDefault().getPreferenceStore().getBoolean(ISystemPreferencesConstants.DOSUPERTRANSFER);
|
boolean doSuperTransferProperty = RSEUIPlugin.getDefault().getPreferenceStore().getBoolean(ISystemPreferencesConstants.DOSUPERTRANSFER);
|
||||||
if (!doSuperTransferProperty)
|
if (!doSuperTransferProperty)
|
||||||
{
|
{
|
||||||
|
@ -1669,11 +1677,11 @@ public class SystemViewRemoteFileAdapter
|
||||||
monitor.beginTask(_uploadMessage.getLevelOneText(), size);
|
monitor.beginTask(_uploadMessage.getLevelOneText(), size);
|
||||||
}
|
}
|
||||||
// back to hierarchy
|
// back to hierarchy
|
||||||
return UniversalFileTransferUtility.copyWorkspaceResourcesToRemote((SystemWorkspaceResourceSet)fromSet, targetFolder, monitor, getShell(), true);
|
return UniversalFileTransferUtility.copyWorkspaceResourcesToRemote((SystemWorkspaceResourceSet)fromSet, targetFolder, monitor, shell, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return UniversalFileTransferUtility.copyWorkspaceResourcesToRemote((SystemWorkspaceResourceSet)fromSet, targetFolder, monitor, getShell(), true);
|
return UniversalFileTransferUtility.copyWorkspaceResourcesToRemote((SystemWorkspaceResourceSet)fromSet, targetFolder, monitor, shell, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (fromSet instanceof SystemRemoteResourceSet)
|
else if (fromSet instanceof SystemRemoteResourceSet)
|
||||||
|
|
|
@ -448,7 +448,7 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (display != null && monitor != null)
|
if (/*display != null &&*/ monitor != null)
|
||||||
{
|
{
|
||||||
long percent = (totalSent * 100) / totalBytes;
|
long percent = (totalSent * 100) / totalBytes;
|
||||||
|
|
||||||
|
@ -469,15 +469,17 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer
|
||||||
|
|
||||||
String str = MessageFormat.format(_percentMsg, new Object[] {totalSentBuf, totalBuf, percentBuf});
|
String str = MessageFormat.format(_percentMsg, new Object[] {totalSentBuf, totalBuf, percentBuf});
|
||||||
monitor.subTask(str);
|
monitor.subTask(str);
|
||||||
|
if (display != null)
|
||||||
while (display.readAndDispatch())
|
|
||||||
{
|
{
|
||||||
|
while (display.readAndDispatch())
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
isCancelled = monitor.isCanceled();
|
isCancelled = monitor.isCanceled();
|
||||||
if (isCancelled)
|
if (isCancelled && display != null)
|
||||||
{
|
{
|
||||||
while (display.readAndDispatch())
|
while (display.readAndDispatch())
|
||||||
{
|
{
|
||||||
|
|
|
@ -62,7 +62,6 @@ public class SftpFileService extends AbstractFileService implements IFileService
|
||||||
return "Access a remote file system via Ssh / Sftp protocol";
|
return "Access a remote file system via Ssh / Sftp protocol";
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO specify Exception more clearly
|
|
||||||
public void connect() throws Exception {
|
public void connect() throws Exception {
|
||||||
Activator.trace("SftpFileService.connecting..."); //$NON-NLS-1$
|
Activator.trace("SftpFileService.connecting..."); //$NON-NLS-1$
|
||||||
try {
|
try {
|
||||||
|
@ -78,7 +77,6 @@ public class SftpFileService extends AbstractFileService implements IFileService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO specify Exception more clearly
|
|
||||||
protected ChannelSftp getChannel(String task) throws Exception
|
protected ChannelSftp getChannel(String task) throws Exception
|
||||||
{
|
{
|
||||||
Activator.trace(task);
|
Activator.trace(task);
|
||||||
|
@ -243,7 +241,7 @@ public class SftpFileService extends AbstractFileService implements IFileService
|
||||||
}
|
}
|
||||||
public boolean count(long count){
|
public boolean count(long count){
|
||||||
fMonitor.worked((int)count);
|
fMonitor.worked((int)count);
|
||||||
while (Display.getCurrent().readAndDispatch());
|
|
||||||
return !(fMonitor.isCanceled());
|
return !(fMonitor.isCanceled());
|
||||||
}
|
}
|
||||||
public void end(){
|
public void end(){
|
||||||
|
|
|
@ -24,11 +24,14 @@ import org.eclipse.core.runtime.IAdaptable;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
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.jface.viewers.TreeViewer;
|
import org.eclipse.jface.viewers.TreeViewer;
|
||||||
import org.eclipse.jface.viewers.Viewer;
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.rse.core.RSECorePlugin;
|
||||||
import org.eclipse.rse.core.SystemBasePlugin;
|
import org.eclipse.rse.core.SystemBasePlugin;
|
||||||
import org.eclipse.rse.core.subsystems.ISubSystem;
|
import org.eclipse.rse.core.subsystems.ISubSystem;
|
||||||
import org.eclipse.rse.core.subsystems.ISubSystemConfiguration;
|
import org.eclipse.rse.core.subsystems.ISubSystemConfiguration;
|
||||||
|
import org.eclipse.rse.core.subsystems.SubSystem;
|
||||||
import org.eclipse.rse.filters.ISystemFilterReference;
|
import org.eclipse.rse.filters.ISystemFilterReference;
|
||||||
import org.eclipse.rse.model.IHost;
|
import org.eclipse.rse.model.IHost;
|
||||||
import org.eclipse.rse.model.ISystemContainer;
|
import org.eclipse.rse.model.ISystemContainer;
|
||||||
|
@ -50,7 +53,7 @@ import org.eclipse.ui.progress.UIJob;
|
||||||
* Runnable to perform actual transfer operation.
|
* Runnable to perform actual transfer operation.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class SystemDNDTransferRunnable extends UIJob
|
public class SystemDNDTransferRunnable extends Job
|
||||||
{
|
{
|
||||||
|
|
||||||
public static final int SRC_TYPE_RSE_RESOURCE = 0;
|
public static final int SRC_TYPE_RSE_RESOURCE = 0;
|
||||||
|
@ -492,7 +495,7 @@ public class SystemDNDTransferRunnable extends UIJob
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IStatus runInUIThread(IProgressMonitor monitor)
|
public IStatus run(IProgressMonitor monitor)
|
||||||
{
|
{
|
||||||
|
|
||||||
_ok = true;
|
_ok = true;
|
||||||
|
@ -541,45 +544,70 @@ public class SystemDNDTransferRunnable extends UIJob
|
||||||
{
|
{
|
||||||
monitor.done();
|
monitor.done();
|
||||||
}
|
}
|
||||||
// always refresh
|
|
||||||
ISystemRegistry registry = RSEUIPlugin.getTheSystemRegistry();
|
|
||||||
|
|
||||||
if (target != null && target instanceof ISystemContainer)
|
if (target != null && target instanceof ISystemContainer)
|
||||||
{
|
{
|
||||||
((ISystemContainer)target).markStale(true);
|
((ISystemContainer)target).markStale(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_resultTgtObjects.size() > 0)
|
RefreshJob refresh = new RefreshJob(target, targetSubSystem);
|
||||||
|
refresh.schedule();
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RefreshJob extends UIJob
|
||||||
|
{
|
||||||
|
private Object _target;
|
||||||
|
private ISubSystem _targetSubSystem;
|
||||||
|
public RefreshJob(Object target, ISubSystem targetSubSystem)
|
||||||
{
|
{
|
||||||
boolean doRefresh = _ok;
|
super("Refresh");
|
||||||
for (int t = 0; t < _resultTgtObjects.size() && t < _resultSrcObjects.size(); t++)
|
_target = target;
|
||||||
{
|
_targetSubSystem = targetSubSystem;
|
||||||
Object tgt = _resultTgtObjects.get(t);
|
|
||||||
Object src = _resultSrcObjects.get(t);
|
|
||||||
if (tgt == src || tgt == null)
|
|
||||||
{
|
|
||||||
doRefresh = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
doRefresh = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_originatingViewer instanceof TreeViewer)
|
|
||||||
{
|
|
||||||
TreeViewer viewer = (TreeViewer) _originatingViewer;
|
|
||||||
viewer.setExpandedState(target, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doRefresh)
|
|
||||||
{
|
|
||||||
registry.fireRemoteResourceChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_CREATED, _resultTgtObjects, target, targetSubSystem, null, _originatingViewer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
registry.fireEvent(new SystemResourceChangeEvent(target, ISystemResourceChangeEvents.EVENT_REFRESH, target));
|
public IStatus runInUIThread(IProgressMonitor monitor)
|
||||||
return Status.OK_STATUS;
|
{
|
||||||
|
ISystemRegistry registry = RSEUIPlugin.getTheSystemRegistry();
|
||||||
|
if (_resultTgtObjects.size() > 0)
|
||||||
|
{
|
||||||
|
boolean doRefresh = _ok;
|
||||||
|
for (int t = 0; t < _resultTgtObjects.size() && t < _resultSrcObjects.size(); t++)
|
||||||
|
{
|
||||||
|
Object tgt = _resultTgtObjects.get(t);
|
||||||
|
Object src = _resultSrcObjects.get(t);
|
||||||
|
if (tgt == src || tgt == null)
|
||||||
|
{
|
||||||
|
doRefresh = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
doRefresh = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_originatingViewer instanceof TreeViewer)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
TreeViewer viewer = (TreeViewer) _originatingViewer;
|
||||||
|
viewer.setExpandedState(_target, true);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doRefresh)
|
||||||
|
{
|
||||||
|
registry.fireRemoteResourceChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_CREATED, _resultTgtObjects, _target, _targetSubSystem, null, _originatingViewer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
registry.fireEvent(new SystemResourceChangeEvent(_target, ISystemResourceChangeEvents.EVENT_REFRESH, _target));
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void operationFailed(IProgressMonitor monitor)
|
private void operationFailed(IProgressMonitor monitor)
|
||||||
|
|
Loading…
Add table
Reference in a new issue