1 11 package org.eclipse.debug.ui.actions; 12 13 14 import java.util.ArrayList ; 15 import java.util.Collections ; 16 import java.util.Iterator ; 17 import java.util.List ; 18 import java.util.Set ; 19 20 import org.eclipse.core.expressions.EvaluationContext; 21 import org.eclipse.core.expressions.Expression; 22 import org.eclipse.core.expressions.IEvaluationContext; 23 import org.eclipse.core.runtime.CoreException; 24 import org.eclipse.debug.core.DebugPlugin; 25 import org.eclipse.debug.core.ILaunchConfiguration; 26 import org.eclipse.debug.core.ILaunchConfigurationType; 27 import org.eclipse.debug.core.ILaunchMode; 28 import org.eclipse.debug.internal.ui.DebugUIPlugin; 29 import org.eclipse.debug.internal.ui.actions.ActionMessages; 30 import org.eclipse.debug.internal.ui.actions.LaunchConfigurationAction; 31 import org.eclipse.debug.internal.ui.actions.LaunchShortcutAction; 32 import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager; 33 import org.eclipse.debug.internal.ui.launchConfigurations.LaunchShortcutExtension; 34 import org.eclipse.debug.ui.DebugUITools; 35 import org.eclipse.debug.ui.ILaunchGroup; 36 import org.eclipse.jface.action.Action; 37 import org.eclipse.jface.action.ActionContributionItem; 38 import org.eclipse.jface.action.IAction; 39 import org.eclipse.jface.action.IMenuCreator; 40 import org.eclipse.jface.viewers.ISelection; 41 import org.eclipse.jface.viewers.ISelectionProvider; 42 import org.eclipse.jface.viewers.IStructuredSelection; 43 import org.eclipse.swt.SWT; 44 import org.eclipse.swt.events.MenuAdapter; 45 import org.eclipse.swt.events.MenuEvent; 46 import org.eclipse.swt.widgets.Control; 47 import org.eclipse.swt.widgets.Menu; 48 import org.eclipse.swt.widgets.MenuItem; 49 import org.eclipse.ui.IEditorPart; 50 import org.eclipse.ui.IWorkbenchPage; 51 import org.eclipse.ui.IWorkbenchPart; 52 import org.eclipse.ui.IWorkbenchPartSite; 53 import org.eclipse.ui.IWorkbenchWindow; 54 import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2; 55 import org.eclipse.ui.PlatformUI; 56 import org.eclipse.ui.activities.WorkbenchActivityHelper; 57 58 71 public class LaunchShortcutsAction extends Action implements IMenuCreator, IWorkbenchWindowPulldownDelegate2 { 72 73 76 private Menu fCreatedMenu; 77 78 81 private ILaunchGroup fGroup; 82 83 86 private boolean fInitialized = false; 87 88 94 public LaunchShortcutsAction(String launchGroupIdentifier) { 95 super(); 96 fGroup = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(launchGroupIdentifier); 97 ILaunchMode mode = DebugPlugin.getDefault().getLaunchManager().getLaunchMode(fGroup.getMode()); 98 setText(mode.getLaunchAsLabel()); 99 setMenuCreator(this); 100 setEnabled(existsConfigTypesForMode()); 101 } 102 103 106 public void run() { 107 } 109 110 113 public void dispose() { 114 if (fCreatedMenu != null) { 115 fCreatedMenu.dispose(); 116 } 117 } 118 119 122 public Menu getMenu(Control parent) { 123 return null; 124 } 125 126 129 public Menu getMenu(Menu parent) { 130 if (fCreatedMenu != null) { 131 fCreatedMenu.dispose(); 132 } 133 fCreatedMenu = new Menu(parent); 134 initMenu(); 135 return fCreatedMenu; 136 } 137 138 141 private IEvaluationContext createContext() { 142 List list = null; 143 IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow(); 144 if (window != null) { 145 IWorkbenchPage page = window.getActivePage(); 146 if (page != null) { 147 IWorkbenchPart activePart = page.getActivePart(); 148 if (activePart instanceof IEditorPart) { 149 list = new ArrayList (); 150 list.add(((IEditorPart)activePart).getEditorInput()); 151 } else if (activePart != null) { 152 IWorkbenchPartSite site = activePart.getSite(); 153 if (site != null) { 154 ISelectionProvider selectionProvider = site.getSelectionProvider(); 155 if (selectionProvider != null) { 156 ISelection selection = selectionProvider.getSelection(); 157 if (selection instanceof IStructuredSelection) { 158 list = ((IStructuredSelection)selection).toList(); 159 } 160 } 161 } 162 } 163 } 164 } 165 if (list == null) { 168 list = Collections.EMPTY_LIST; 169 } 170 IEvaluationContext context = new EvaluationContext(null, list); 171 context.setAllowPluginActivation(true); 172 context.addVariable("selection", list); return context; 174 } 175 176 179 private void fillMenu() { 180 IEvaluationContext context = createContext(); 181 int accelerator = 1; 182 List allShortCuts = getLaunchConfigurationManager().getLaunchShortcuts(fGroup.getCategory()); 183 Iterator iter = allShortCuts.iterator(); 184 List filteredShortCuts = new ArrayList (10); 185 while (iter.hasNext()) { 186 LaunchShortcutExtension ext = (LaunchShortcutExtension) iter.next(); 187 try { 188 if (!WorkbenchActivityHelper.filterItem(ext) && isApplicable(ext, context)) { 189 filteredShortCuts.add(ext); 190 } 191 } catch (CoreException e) {} 192 } 193 try { 195 ILaunchConfiguration config = getLaunchConfigurationManager().isSharedConfig(getSelection(context)); 196 if(config != null && config.exists() && config.supportsMode(getMode())) { 197 IAction action = new LaunchConfigurationAction(config, getMode(), config.getName(), DebugUITools.getDefaultImageDescriptor(config), accelerator++); 198 ActionContributionItem item = new ActionContributionItem(action); 199 item.fill(fCreatedMenu, -1); 200 if(!filteredShortCuts.isEmpty()) { 201 new MenuItem(fCreatedMenu, SWT.SEPARATOR); 202 } 203 } 204 } 205 catch(CoreException ce) {DebugUIPlugin.log(ce);} 206 iter = filteredShortCuts.iterator(); 208 while (iter.hasNext()) { 209 LaunchShortcutExtension ext = (LaunchShortcutExtension) iter.next(); 210 Set modes = ext.getModes(); Iterator modeIter = modes.iterator(); 212 while (modeIter.hasNext()) { 213 String mode = (String ) modeIter.next(); 214 if (mode.equals(getMode())) { 215 populateMenuItem(mode, ext, fCreatedMenu, accelerator++); 216 } 217 } 218 } 219 if (accelerator == 1) { 220 IAction action= new Action(ActionMessages.LaunchShortcutsAction_1) {}; 222 action.setEnabled(false); 223 ActionContributionItem item= new ActionContributionItem(action); 224 item.fill(fCreatedMenu, -1); 225 } 226 } 227 228 234 private Object getSelection(IEvaluationContext context) { 235 List list = (List ) context.getVariable("selection"); return (list.isEmpty() ? null : list.get(0)); 237 } 238 239 242 private void populateMenuItem(String mode, LaunchShortcutExtension ext, Menu menu, int accelerator) { 243 LaunchShortcutAction action = new LaunchShortcutAction(mode, ext); 244 action.setActionDefinitionId(ext.getId() + "." + mode); String helpContextId = ext.getHelpContextId(); 246 if (helpContextId != null) { 247 PlatformUI.getWorkbench().getHelpSystem().setHelp(action, helpContextId); 248 } 249 StringBuffer label= new StringBuffer (); 250 if (accelerator >= 0 && accelerator < 10) { 251 label.append('&'); 253 label.append(accelerator); 254 label.append(' '); 255 } 256 String contextLabel= ext.getContextLabel(mode); 257 label.append((contextLabel != null) ? contextLabel : action.getText()); 259 action.setText(label.toString()); 260 ActionContributionItem item= new ActionContributionItem(action); 261 item.fill(menu, -1); 262 } 263 264 270 private boolean isApplicable(LaunchShortcutExtension ext, IEvaluationContext context) throws CoreException { 271 Expression expr = ext.getContextualLaunchEnablementExpression(); 272 return ext.evalEnablementExpression(context, expr); 273 } 274 275 278 private void initMenu() { 279 fCreatedMenu.addMenuListener(new MenuAdapter() { 282 public void menuShown(MenuEvent e) { 283 Menu m = (Menu)e.widget; 284 MenuItem[] items = m.getItems(); 285 for (int i=0; i < items.length; i++) { 286 items[i].dispose(); 287 } 288 fillMenu(); 289 } 290 }); 291 } 292 293 298 protected String getMode() { 299 return fGroup.getMode(); 300 } 301 302 307 private LaunchConfigurationManager getLaunchConfigurationManager() { 308 return DebugUIPlugin.getDefault().getLaunchConfigurationManager(); 309 } 310 311 314 public void init(IWorkbenchWindow window) {} 315 316 319 public void run(IAction action) { 320 } 322 323 326 public void selectionChanged(IAction action, ISelection selection) { 327 if (!fInitialized) { 328 action.setEnabled(existsConfigTypesForMode()); 329 fInitialized = true; 330 } 331 } 332 333 340 private boolean existsConfigTypesForMode() { 341 ILaunchConfigurationType[] configTypes = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes(); 342 for (int i = 0; i < configTypes.length; i++) { 343 ILaunchConfigurationType configType = configTypes[i]; 344 if (configType.supportsMode(getMode())) { 345 return true; 346 } 347 } 348 return false; 349 } 350 } 351 352 | Popular Tags |