package org.radrails.rails.internal.ui.console; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IMenuCreator; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE.SharedImages; import org.radrails.rails.internal.core.RailsPlugin; import org.radrails.rails.ui.RailsUIPlugin; /** * RailsShellProjectSelectionAction */ public class RailsShellProjectSelectionAction extends Action implements IMenuCreator { private RailsShell console; private Menu fMenu; /** * @param console */ public RailsShellProjectSelectionAction(RailsShell console) { this.console = console; setEnabled(!RailsPlugin.getRailsProjects().isEmpty()); setToolTipText("Change active project for Rails Shell"); setImageDescriptor(RailsUIPlugin.getImageDescriptor("icons/rails_project.png")); setMenuCreator(this); ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() { public void resourceChanged(IResourceChangeEvent event) { IResource source = event.getResource(); if (source != null) return; IResourceDelta[] deltas = event.getDelta().getAffectedChildren( IResourceDelta.ADDED | IResourceDelta.CHANGED | IResourceDelta.REMOVED, IResource.PROJECT); if (deltas != null && deltas.length > 0) { // project changed Display.getDefault().asyncExec(new Runnable() { public void run() { if (fMenu != null) fMenu.dispose(); fMenu = null; setEnabled(!RailsPlugin.getRailsProjects().isEmpty()); } }); } } }, IResourceChangeEvent.POST_CHANGE); } /** * @see org.eclipse.jface.action.IMenuCreator#dispose() */ public void dispose() { } /** * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control) */ public Menu getMenu(Control parent) { if (fMenu != null) { fMenu.dispose(); } fMenu = new Menu(parent); int accel = 1; Set<IProject> projects = RailsPlugin.getRailsProjects(); for (IProject project : projects) { String label = project.getName(); ImageDescriptor image = null; addActionToMenu(fMenu, new RailsProjectAction(label, image, project), accel); accel++; } return fMenu; } private void addActionToMenu(Menu parent, Action action, int accelerator) { if (accelerator < 10) { StringBuffer label = new StringBuffer(); // add the numerical accelerator label.append('&'); label.append(accelerator); label.append(' '); label.append(action.getText()); action.setText(label.toString()); } ActionContributionItem item = new ActionContributionItem(action); item.fill(parent, -1); } /** * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu) */ public Menu getMenu(Menu parent) { return null; } private class RailsProjectAction extends Action { private IProject project; public RailsProjectAction(String label, ImageDescriptor image, IProject project) { setText(label); if (image != null) { setImageDescriptor(image); } this.project = project; } public void run() { console.setProject(project); } public void runWithEvent(Event event) { run(); } } }