package com.aptana.rdt.internal.ui.actions;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPart;
import com.aptana.rdt.core.gems.Gem;
import com.aptana.rdt.core.gems.IGemManager;
import com.aptana.rdt.ui.gems.GemsMessages;
import com.aptana.rdt.ui.gems.GemsView;
import com.aptana.rdt.ui.gems.RemoveGemDialog;
/**
* Uninstall a gem
*
* @author cwilliams
*/
// FIXME Combine common code from this and InstallGemActionDelegate into a superclass!
public class RemoveGemActionDelegate implements IObjectActionDelegate, IViewActionDelegate
{
private GemsView view;
private Gem selectedGem;
/**
* @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction,
* org.eclipse.ui.IWorkbenchPart)
*/
public void setActivePart(IAction action, IWorkbenchPart targetPart)
{
}
/**
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
public void run(IAction action)
{
if (selectedGem == null)
return;
boolean okay = MessageDialog.openConfirm(view.getViewSite().getShell(), null, GemsMessages.bind(
GemsMessages.RemoveGemDialog_msg, selectedGem.getName()));
if (!okay)
return;
Job job = null;
if (selectedGem.hasMultipleVersions())
{
final int[] result = new int[1];
final String[] version = new String[1];
Display.getDefault().syncExec(new Runnable()
{
public void run()
{
RemoveGemDialog dialog = new RemoveGemDialog(Display.getDefault().getActiveShell(), selectedGem
.versions());
result[0] = dialog.open();
version[0] = dialog.getVersion();
}
});
if (result[0] != RemoveGemDialog.OK)
return;
job = new Job("Removing gem...")
{
protected IStatus run(org.eclipse.core.runtime.IProgressMonitor monitor)
{
return getGemManager().removeGem(
new Gem(selectedGem.getName(), version[0], selectedGem.getDescription()), monitor);
}
};
}
else
{
job = new Job("Removing gem...")
{
@Override
protected IStatus run(IProgressMonitor monitor)
{
return getGemManager().removeGem(selectedGem, monitor);
}
};
}
if (job != null)
{
job.setUser(true);
job.schedule();
}
}
protected IGemManager getGemManager()
{
return view.getGemManager();
}
/**
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
* org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IAction action, ISelection selection)
{
if (selection == null || selection.isEmpty())
{
action.setEnabled(false);
return;
}
if (!(selection instanceof IStructuredSelection))
{
action.setEnabled(false);
return;
}
IStructuredSelection sel = (IStructuredSelection) selection;
Object element = sel.getFirstElement();
if (!(element instanceof Gem))
{
action.setEnabled(false);
return;
}
this.selectedGem = (Gem) element;
action.setEnabled(true);
}
/**
* @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
*/
public void init(IViewPart view)
{
this.view = (GemsView) view;
}
}