1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-03 07:05:24 +02:00

[167620] delete now occuring in a job instead of directly on main thread from the view

This commit is contained in:
David McKnight 2007-05-16 18:33:17 +00:00
parent bb8fb50732
commit 938c4adb7f
2 changed files with 189 additions and 32 deletions

View file

@ -15,20 +15,36 @@
********************************************************************************/
package org.eclipse.rse.internal.ui.actions;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
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.dialogs.Dialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.rse.core.RSECorePlugin;
import org.eclipse.rse.core.events.ISystemRemoteChangeEvents;
import org.eclipse.rse.core.events.ISystemResourceChangeEvents;
import org.eclipse.rse.core.model.ISystemRegistry;
import org.eclipse.rse.core.subsystems.ISubSystem;
import org.eclipse.rse.internal.ui.SystemResources;
import org.eclipse.rse.ui.ISystemContextMenuConstants;
import org.eclipse.rse.ui.ISystemDeleteTarget;
import org.eclipse.rse.ui.RSEUIPlugin;
import org.eclipse.rse.ui.actions.SystemBaseDialogAction;
import org.eclipse.rse.ui.dialogs.SystemDeleteDialog;
import org.eclipse.rse.ui.model.SystemRemoteElementResourceSet;
import org.eclipse.rse.ui.view.ISystemRemoteElementAdapter;
import org.eclipse.rse.ui.view.ISystemViewElementAdapter;
import org.eclipse.rse.ui.view.SystemAdapterHelpers;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
@ -44,18 +60,111 @@ import org.eclipse.ui.PlatformUI;
* running the action, and then do your own delete.
* </ol>
* <p>
* If the input objects do not adapt to {@link org.eclipse.rse.ui.view.ISystemRemoteElementAdapter} or
* {@link org.eclipse.rse.ui.view.ISystemViewElementAdapter}, then you
* should call {@link #setNameValidator(org.eclipse.rse.core.ui.validators.ISystemValidator)} to
* specify a validator that is called to verify the typed new name is valid. Further, to show the type value
* of the input objects, they should implement {@link org.eclipse.rse.ui.dialogs.ISystemTypedObject}.
*
* @see org.eclipse.rse.ui.dialogs.SystemDeleteDialog
*/
public class SystemCommonDeleteAction
extends SystemBaseDialogAction
{
public class DeleteEventRunnable implements Runnable
{
private List _localDeletedResources;
private List _remoteDeletedResources;
public DeleteEventRunnable(List localDeletedResources, List remoteDeletedResources)
{
_localDeletedResources = localDeletedResources;
_remoteDeletedResources = remoteDeletedResources;
}
public void run()
{
ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
if (_remoteDeletedResources.size() > 0)
{
sr.fireRemoteResourceChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_DELETED, _remoteDeletedResources, null, null, null);
}
if (_localDeletedResources.size() > 0)
{
Object[] localDeleted = _localDeletedResources.toArray();
sr.fireEvent(new org.eclipse.rse.core.events.SystemResourceChangeEvent(localDeleted, ISystemResourceChangeEvents.EVENT_DELETE_MANY, null/*(getSelectedParent())*/));
}
}
}
public class DeleteJob extends Job
{
private List _localResources;
private List _remoteSets;
public DeleteJob(List localResources, List remoteSets)
{
super(SystemResources.ACTION_DELETE_LABEL);
_localResources = localResources;
_remoteSets = remoteSets;
}
public IStatus run(IProgressMonitor monitor)
{
boolean ok = true;
List localDeletedObjects = new ArrayList();
List remoteDeletedObjects = new ArrayList();
// local delete is pretty straight-forward
for (int l = 0; l < _localResources.size() && ok; l++)
{
Object element = _localResources.get(l);
ISystemViewElementAdapter adapter = getViewAdapter(element);
try
{
ok = adapter.doDelete(getShell(), element, monitor);
if (ok)
{
localDeletedObjects.add(element);
}
}
catch (Exception e)
{
}
}
// remote delete is not as straight-forward
for (int r = 0; r < _remoteSets.size() && ok; r++)
{
SystemRemoteElementResourceSet set = (SystemRemoteElementResourceSet)_remoteSets.get(r);
ISystemViewElementAdapter adapter = set.getViewAdapter();
try
{
ok = adapter.doDeleteBatch(getShell(), set.getResourceSet(), monitor);
if (ok)
{
for (int i = 0; i < set.size(); i++)
{
remoteDeletedObjects.add(set.get(i));
}
}
}
catch (Exception e)
{
}
}
// start a runnable to do the action refresh events
DeleteEventRunnable fireEvents = new DeleteEventRunnable(localDeletedObjects, remoteDeletedObjects);
Display.getDefault().asyncExec(fireEvents);
if (ok)
return Status.OK_STATUS;
else
return Status.CANCEL_STATUS;
}
}
private String promptLabel;
private List _setList;
/**
* Constructor for SystemDeleteAction when using a delete target
@ -72,6 +181,7 @@ public class SystemCommonDeleteAction
setProcessAllSelections(true);
setContextMenuGroup(ISystemContextMenuConstants.GROUP_REORGANIZE);
setHelp(RSEUIPlugin.HELPPREFIX+"actn0021"); //$NON-NLS-1$
_setList = new ArrayList();
}
/**
@ -103,6 +213,7 @@ public class SystemCommonDeleteAction
*/
public boolean updateSelection(IStructuredSelection selection)
{
_setList.clear();
ISystemDeleteTarget deleteTarget = getDeleteTarget();
if (deleteTarget == null)
return true;
@ -138,44 +249,69 @@ public class SystemCommonDeleteAction
return dlg;
}
public class DeleteRunnable implements IRunnableWithProgress
{
private ISystemDeleteTarget _target;
public DeleteRunnable(ISystemDeleteTarget target)
{
_target = target;
}
public void run(IProgressMonitor monitor)
{
_target.doDelete(monitor); // deletes all the currently selected items
}
}
/**
* Required by parent.
* In our case, we overload it to also perform the deletion, but only if using a delete target,
* else it is up to the caller to call wasCancelled() and if not true, do their own deletion.
* New method of doing delete where the physical deletion occurs in a job whereas the refresh is done in a runnable
*/
protected Object getDialogValue(Dialog dlg)
{
if (!((SystemDeleteDialog)dlg).wasCancelled() && (getDeleteTarget() != null))
{
ISystemDeleteTarget target = getDeleteTarget();
DeleteRunnable delRunnable = new DeleteRunnable(target);
IRunnableContext runnableContext = getRunnableContext(dlg.getShell());
try
{
runnableContext.run(false, true, delRunnable);
}
catch (Exception e)
ISelection selection = target.getSelection();
if (selection instanceof IStructuredSelection)
{
// keep track of the current set
List localSet = new ArrayList();
// divide up all objects to delete
IStructuredSelection ssel = (IStructuredSelection)selection;
Iterator iter = ssel.iterator();
while (iter.hasNext())
{
Object object = iter.next();
ISystemViewElementAdapter adapter = SystemAdapterHelpers.getViewAdapter(object, (Viewer)target);
if (getRemoteAdapter(object) != null)
{
ISubSystem subSystem = adapter.getSubSystem(object);
// a remote object so add to remote set
SystemRemoteElementResourceSet set = getSetFor(subSystem, adapter);
set.addResource(object);
}
else
{
localSet.add(object);
}
}
// do delete for each set
DeleteJob job = new DeleteJob(localSet, _setList);
job.schedule();
}
RSEUIPlugin.getTheSystemRegistryUI().clearRunnableContext();
setEnabled(target.canDelete());
}
return null;
}
protected SystemRemoteElementResourceSet getSetFor(ISubSystem subSystem, ISystemViewElementAdapter adapter) {
for (int i = 0; i < _setList.size(); i++) {
SystemRemoteElementResourceSet set = (SystemRemoteElementResourceSet) _setList.get(i);
if (set.getViewAdapter() == adapter && set.getSubSystem() == subSystem) {
return set;
}
}
// no existing set - create one
SystemRemoteElementResourceSet newSet = new SystemRemoteElementResourceSet(subSystem, adapter);
_setList.add(newSet);
return newSet;
}
protected IRunnableContext getRunnableContext(Shell shell)
{

View file

@ -859,6 +859,7 @@ public class SystemView extends SafeTreeViewer
GoIntoAction goIntoAction = getGoIntoAction();
boolean singleSelection = selection.size() == 1;
goIntoAction.setEnabled(singleSelection);
boolean selectionHasChildren = false;
if (singleSelection)
{
// dkm - first find out if the selection will have children
@ -869,6 +870,7 @@ public class SystemView extends SafeTreeViewer
{
if (adapter.hasChildren((IAdaptable)selectedObject))
{
selectionHasChildren = true;
menu.appendToGroup(ISystemContextMenuConstants.GROUP_GOTO, goIntoAction);
}
}
@ -1861,7 +1863,23 @@ public class SystemView extends SafeTreeViewer
close();
return Status.OK_STATUS;
}
parentItem = findItem(parent);
if (parent != null)
parentItem = findItem(parent);
else {
// find first parentItem for source
if (multiSource != null && multiSource.length > 0){
Widget sitem = findItem(multiSource[0]);
if (sitem instanceof TreeItem)
{
parentItem = ((TreeItem)sitem).getParentItem();
if (parentItem == null)
{
parentItem = ((TreeItem)sitem).getParent();
}
}
}
}
if (parentItem == null) return Status.OK_STATUS;
if ((parentItem instanceof Item) && !getExpanded((Item) parentItem))
refresh(parent); // flush memory
@ -4661,6 +4679,9 @@ public class SystemView extends SafeTreeViewer
/**
* Required method from ISystemDeleteTarget
*
* @deprecated all deletion should now occur independently of the view and the
* view should only deal with the handling of refresh events
*/
public boolean doDelete(IProgressMonitor monitor) {
ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();