package com.aptana.rdt.internal.ui.actions; import java.text.MessageFormat; 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.Dialog; import org.eclipse.jface.viewers.ISelection; 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.GemListener; import com.aptana.rdt.core.gems.IGemManager; import com.aptana.rdt.ui.gems.GemsView; import com.aptana.rdt.ui.gems.InstallGemDialog; /** * Install a gem * * @author cwilliams */ public class InstallGemActionDelegate implements IObjectActionDelegate, IViewActionDelegate, GemListener { private IAction action; private GemsView gemsView; private IGemManager gemManager; public InstallGemActionDelegate() { } /** * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, * org.eclipse.ui.IWorkbenchPart) */ public void setActivePart(IAction action, IWorkbenchPart targetPart) { this.action = action; } /** * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) */ public void run(IAction action) { InstallGemDialog dialog = new InstallGemDialog(Display.getCurrent().getActiveShell()); if (dialog.open() != Dialog.OK) return; final Gem gem = dialog.getGem(); if (gem == null || gem.getName() == null || gem.getName().length() == 0 || !gem.isInstallable()) return; final String sourceURL = dialog.getSourceURL(); Job job = new Job(MessageFormat.format("Installing gem {0}", gem.getName())) { @Override public IStatus run(IProgressMonitor monitor) { return getGemManager().installGem(gem, sourceURL, monitor); } }; job.setUser(true); job.schedule(); } /** * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, * org.eclipse.jface.viewers.ISelection) */ public void selectionChanged(IAction action, ISelection selection) { this.action = action; if (getGemManager() != this.gemManager) { this.gemManager.removeGemListener(this); getGemManager().addGemListener(this); this.gemManager = getGemManager(); } action.setEnabled(isEnabled()); } private boolean isEnabled() { return getGemManager().isRubyGemsInstalled() && getGemManager().isInitialized(); } /** * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart) */ public void init(IViewPart view) { this.gemsView = (GemsView) view; this.gemManager = getGemManager(); getGemManager().addGemListener(this); } private IGemManager getGemManager() { return gemsView.getGemManager(); } public void gemAdded(Gem gem) { } public void gemRemoved(Gem gem) { } public void gemsRefreshed() { } public void gemUpdated(Gem gem) { } public void managerInitialized() { if (action == null) return; action.setEnabled(isEnabled()); } }