package com.aptana.rdt.ui.gems; 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.Event; import org.eclipse.swt.widgets.Menu; import org.rubypeople.rdt.ui.IHasImageDescriptor; import com.aptana.rdt.AptanaRDTPlugin; import com.aptana.rdt.core.gems.IGemManager; import com.aptana.rdt.ui.AptanaRDTUIPlugin; class GemManagerSelectionAction extends Action implements IMenuCreator { private Menu fMenu; private GemsView gemsView; GemManagerSelectionAction(GemsView gemsView) { this.gemsView = gemsView; setEnabled(getGemManagers().length > 0); setToolTipText("Select a gem repository"); setImageDescriptor(AptanaRDTUIPlugin.imageDescriptorFromPlugin(AptanaRDTUIPlugin.PLUGIN_ID, "icons/rubygems.png")); setMenuCreator(this); } private IGemManager[] getGemManagers() { return AptanaRDTPlugin.getDefault().getGemManagers(); } public void dispose() { } public Menu getMenu(Control parent) { if (fMenu != null && !fMenu.isDisposed()) { fMenu.dispose(); } fMenu = new Menu(parent); int accel = 1; IGemManager[] gemManagers = getGemManagers(); for (IGemManager gemManager : gemManagers) { String label = gemManager.getName(); ImageDescriptor image = null; if (gemManager instanceof IHasImageDescriptor) { image = ((IHasImageDescriptor) gemManager).getImageDescriptor(); } addActionToMenu(fMenu, new GemManagerAction(label, image, gemManager), accel); accel++; } return fMenu; } public Menu getMenu(Menu parent) { return null; } 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); } private class GemManagerAction extends Action { private IGemManager gemManager; /** * GemManagerAction * * @param label * @param image * @param gemManager */ public GemManagerAction(String label, ImageDescriptor image, IGemManager gemManager) { setText(label); if (image != null) { setImageDescriptor(image); } this.gemManager = gemManager; } /** * @see org.eclipse.jface.action.Action#run() */ public void run() { if (gemsView != null) { gemsView.setGemManager(gemManager); } } /** * @see org.eclipse.jface.action.Action#runWithEvent(org.eclipse.swt.widgets.Event) */ public void runWithEvent(Event event) { run(); } } }