mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-08 09:35:23 +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.Shell;
|
||||
import org.eclipse.ui.PlatformUI;
|
||||
import org.eclipse.ui.actions.RenameResourceAction;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -1492,20 +1493,41 @@ public class UniversalFileTransferUtility
|
|||
|
||||
if (targetFileOrFolder != null && targetFileOrFolder.exists())
|
||||
{
|
||||
ValidatorFileUniqueName validator = null;
|
||||
SystemRenameSingleDialog dlg = new SystemRenameSingleDialog(shell, true, targetFileOrFolder, validator); // true => copy-collision-mode
|
||||
|
||||
dlg.open();
|
||||
if (!dlg.wasCancelled())
|
||||
newName = dlg.getNewName();
|
||||
else
|
||||
newName = null;
|
||||
RenameRunnable rr = new RenameRunnable(targetFileOrFolder);
|
||||
Display.getDefault().syncExec(rr);
|
||||
newName = rr.getNewName();
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
String newName = oldName;
|
||||
|
|
|
@ -1656,7 +1656,15 @@ public class SystemViewRemoteFileAdapter
|
|||
{
|
||||
if (fromSet instanceof SystemWorkspaceResourceSet)
|
||||
{
|
||||
|
||||
Shell shell = null;
|
||||
try
|
||||
{
|
||||
shell = getShell();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
}
|
||||
boolean doSuperTransferProperty = RSEUIPlugin.getDefault().getPreferenceStore().getBoolean(ISystemPreferencesConstants.DOSUPERTRANSFER);
|
||||
if (!doSuperTransferProperty)
|
||||
{
|
||||
|
@ -1669,11 +1677,11 @@ public class SystemViewRemoteFileAdapter
|
|||
monitor.beginTask(_uploadMessage.getLevelOneText(), size);
|
||||
}
|
||||
// back to hierarchy
|
||||
return UniversalFileTransferUtility.copyWorkspaceResourcesToRemote((SystemWorkspaceResourceSet)fromSet, targetFolder, monitor, getShell(), true);
|
||||
return UniversalFileTransferUtility.copyWorkspaceResourcesToRemote((SystemWorkspaceResourceSet)fromSet, targetFolder, monitor, shell, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
return UniversalFileTransferUtility.copyWorkspaceResourcesToRemote((SystemWorkspaceResourceSet)fromSet, targetFolder, monitor, getShell(), true);
|
||||
return UniversalFileTransferUtility.copyWorkspaceResourcesToRemote((SystemWorkspaceResourceSet)fromSet, targetFolder, monitor, shell, true);
|
||||
}
|
||||
}
|
||||
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;
|
||||
|
||||
|
@ -469,15 +469,17 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer
|
|||
|
||||
String str = MessageFormat.format(_percentMsg, new Object[] {totalSentBuf, totalBuf, percentBuf});
|
||||
monitor.subTask(str);
|
||||
|
||||
while (display.readAndDispatch())
|
||||
if (display != null)
|
||||
{
|
||||
while (display.readAndDispatch())
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
isCancelled = monitor.isCanceled();
|
||||
if (isCancelled)
|
||||
if (isCancelled && display != null)
|
||||
{
|
||||
while (display.readAndDispatch())
|
||||
{
|
||||
|
|
|
@ -62,7 +62,6 @@ public class SftpFileService extends AbstractFileService implements IFileService
|
|||
return "Access a remote file system via Ssh / Sftp protocol";
|
||||
}
|
||||
|
||||
//TODO specify Exception more clearly
|
||||
public void connect() throws Exception {
|
||||
Activator.trace("SftpFileService.connecting..."); //$NON-NLS-1$
|
||||
try {
|
||||
|
@ -78,7 +77,6 @@ public class SftpFileService extends AbstractFileService implements IFileService
|
|||
}
|
||||
}
|
||||
|
||||
//TODO specify Exception more clearly
|
||||
protected ChannelSftp getChannel(String task) throws Exception
|
||||
{
|
||||
Activator.trace(task);
|
||||
|
@ -243,7 +241,7 @@ public class SftpFileService extends AbstractFileService implements IFileService
|
|||
}
|
||||
public boolean count(long count){
|
||||
fMonitor.worked((int)count);
|
||||
while (Display.getCurrent().readAndDispatch());
|
||||
|
||||
return !(fMonitor.isCanceled());
|
||||
}
|
||||
public void end(){
|
||||
|
|
|
@ -24,11 +24,14 @@ import org.eclipse.core.runtime.IAdaptable;
|
|||
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.jface.viewers.TreeViewer;
|
||||
import org.eclipse.jface.viewers.Viewer;
|
||||
import org.eclipse.rse.core.RSECorePlugin;
|
||||
import org.eclipse.rse.core.SystemBasePlugin;
|
||||
import org.eclipse.rse.core.subsystems.ISubSystem;
|
||||
import org.eclipse.rse.core.subsystems.ISubSystemConfiguration;
|
||||
import org.eclipse.rse.core.subsystems.SubSystem;
|
||||
import org.eclipse.rse.filters.ISystemFilterReference;
|
||||
import org.eclipse.rse.model.IHost;
|
||||
import org.eclipse.rse.model.ISystemContainer;
|
||||
|
@ -50,7 +53,7 @@ import org.eclipse.ui.progress.UIJob;
|
|||
* 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;
|
||||
|
@ -492,7 +495,7 @@ public class SystemDNDTransferRunnable extends UIJob
|
|||
return true;
|
||||
}
|
||||
|
||||
public IStatus runInUIThread(IProgressMonitor monitor)
|
||||
public IStatus run(IProgressMonitor monitor)
|
||||
{
|
||||
|
||||
_ok = true;
|
||||
|
@ -541,45 +544,70 @@ public class SystemDNDTransferRunnable extends UIJob
|
|||
{
|
||||
monitor.done();
|
||||
}
|
||||
// always refresh
|
||||
ISystemRegistry registry = RSEUIPlugin.getTheSystemRegistry();
|
||||
|
||||
|
||||
if (target != null && target instanceof ISystemContainer)
|
||||
{
|
||||
((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;
|
||||
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)
|
||||
{
|
||||
TreeViewer viewer = (TreeViewer) _originatingViewer;
|
||||
viewer.setExpandedState(target, true);
|
||||
}
|
||||
|
||||
if (doRefresh)
|
||||
{
|
||||
registry.fireRemoteResourceChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_CREATED, _resultTgtObjects, target, targetSubSystem, null, _originatingViewer);
|
||||
}
|
||||
super("Refresh");
|
||||
_target = target;
|
||||
_targetSubSystem = targetSubSystem;
|
||||
}
|
||||
|
||||
registry.fireEvent(new SystemResourceChangeEvent(target, ISystemResourceChangeEvents.EVENT_REFRESH, target));
|
||||
return Status.OK_STATUS;
|
||||
public IStatus runInUIThread(IProgressMonitor monitor)
|
||||
{
|
||||
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)
|
||||
|
|
Loading…
Add table
Reference in a new issue