/******************************************************************************* * Copyright (c) 2013, 2015 Red Hat, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat Inc. - initial API and implementation * Marc Khouzam (Ericsson) - Update for remote debugging support (bug 450080) *******************************************************************************/ package org.eclipse.cdt.debug.application; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.util.Util; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction; import org.eclipse.ui.actions.ContributionItemFactory; import org.eclipse.ui.application.ActionBarAdvisor; import org.eclipse.ui.application.IActionBarConfigurer; import org.eclipse.ui.ide.IDEActionFactory; import org.eclipse.ui.internal.IWorkbenchHelpContextIds; import org.eclipse.ui.internal.actions.CommandAction; import org.eclipse.ui.internal.handlers.IActionCommandMappingService; import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages; import org.eclipse.ui.menus.CommandContributionItem; import org.eclipse.ui.menus.CommandContributionItemParameter; @SuppressWarnings("restriction") public class ApplicationActionBarAdvisor extends ActionBarAdvisor { public static String COREFILE_COMMAND_ID = "org.eclipse.cdt.debug.application.command.debugCore"; //$NON-NLS-1$ public static String NEW_EXECUTABLE_COMMAND_ID = "org.eclipse.cdt.debug.application.command.debugNewExecutable"; //$NON-NLS-1$ public static String ATTACH_EXECUTABLE_COMMAND_ID = "org.eclipse.cdt.debug.application.command.debugAttachedExecutable"; //$NON-NLS-1$ public static String REMOTE_EXECUTABLE_COMMAND_ID = "org.eclipse.cdt.debug.application.command.debugRemoteExecutable"; //$NON-NLS-1$ private final IWorkbenchWindow window; private IWorkbenchAction corefileAction; private IWorkbenchAction newExecutableAction; private IWorkbenchAction remoteExecutableAction; private IWorkbenchAction attachExecutableAction; private IWorkbenchAction quitAction; private IWorkbenchAction openPreferencesAction; private IWorkbenchAction editActionSetAction; private IWorkbenchAction helpContentsAction; private IWorkbenchAction helpSearchAction; private IWorkbenchAction dynamicHelpAction; private IWorkbenchAction aboutAction; private IWorkbenchAction undoAction; private IWorkbenchAction redoAction; private IWorkbenchAction refreshAction; public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) { super(configurer); window = configurer.getWindowConfigurer().getWindow(); } /** * Returns the window to which this action builder is contributing. */ private IWorkbenchWindow getWindow() { return window; } @Override protected void makeActions(IWorkbenchWindow window) { quitAction = ActionFactory.QUIT.create(window); register(quitAction); newExecutableAction = NEW_EXECUTABLE.create(window); register(newExecutableAction); attachExecutableAction = ATTACH_EXECUTABLE.create(window); register(attachExecutableAction); remoteExecutableAction = REMOTE_EXECUTABLE.create(window); register(remoteExecutableAction); corefileAction = COREFILE.create(window); register(corefileAction); editActionSetAction = ActionFactory.EDIT_ACTION_SETS .create(window); register(editActionSetAction); helpContentsAction = ActionFactory.HELP_CONTENTS.create(window); register(helpContentsAction); helpSearchAction = ActionFactory.HELP_SEARCH.create(window); register(helpSearchAction); dynamicHelpAction = ActionFactory.DYNAMIC_HELP.create(window); register(dynamicHelpAction); undoAction = ActionFactory.UNDO.create(window); register(undoAction); redoAction = ActionFactory.REDO.create(window); register(redoAction); refreshAction = ActionFactory.REFRESH.create(window); register(refreshAction); aboutAction = ActionFactory.ABOUT.create(window); aboutAction .setImageDescriptor(IDEInternalWorkbenchImages .getImageDescriptor(IDEInternalWorkbenchImages.IMG_OBJS_DEFAULT_PROD)); register(aboutAction); openPreferencesAction = ActionFactory.PREFERENCES.create(window); register(openPreferencesAction); } @Override protected void fillMenuBar(IMenuManager menuBar) { menuBar.add(createFileMenu()); menuBar.add(createEditMenu()); menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); menuBar.add(createWindowMenu()); menuBar.add(createHelpMenu()); } /** * Creates and returns the File menu. */ private MenuManager createFileMenu() { MenuManager menu = new MenuManager(Messages.FileMenuName, IWorkbenchActionConstants.M_FILE); menu.add(new GroupMarker(IWorkbenchActionConstants.FILE_START)); ActionContributionItem newExecutableItem = new ActionContributionItem(newExecutableAction); menu.add(newExecutableItem); ActionContributionItem remoteExecutableItem = new ActionContributionItem(remoteExecutableAction); menu.add(remoteExecutableItem); ActionContributionItem attachExecutableItem = new ActionContributionItem(attachExecutableAction); menu.add(attachExecutableItem); ActionContributionItem corefileItem = new ActionContributionItem(corefileAction); menu.add(corefileItem); menu.add(new Separator()); // This is to make sure "Open File" gets added before Exit menu.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT)); ActionContributionItem refreshExecutableItem = new ActionContributionItem(refreshAction); menu.add(refreshExecutableItem); // This is to make sure "Convert line delimiters" gets added before Exit menu.add(new GroupMarker(IWorkbenchActionConstants.SAVE_EXT)); // If we're on OS X we shouldn't show this command in the File menu. It // should be invisible to the user. However, we should not remove it - // the carbon UI code will do a search through our menu structure // looking for it when Cmd-Q is invoked (or Quit is chosen from the // application menu. ActionContributionItem quitItem = new ActionContributionItem(quitAction); quitItem.setVisible(!Util.isMac()); menu.add(new Separator()); menu.add(quitItem); menu.add(new GroupMarker(IWorkbenchActionConstants.FILE_END)); return menu; } /** * Creates and returns the Edit menu. */ private MenuManager createEditMenu() { MenuManager menu = new MenuManager(Messages.EditMenuName, IWorkbenchActionConstants.M_EDIT); menu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_START)); menu.add(undoAction); menu.add(redoAction); menu.add(new GroupMarker(IWorkbenchActionConstants.UNDO_EXT)); menu.add(new Separator()); menu.add(getCutItem()); menu.add(getCopyItem()); menu.add(getPasteItem()); menu.add(new GroupMarker(IWorkbenchActionConstants.CUT_EXT)); menu.add(new Separator()); menu.add(getDeleteItem()); menu.add(getSelectAllItem()); menu.add(new Separator()); menu.add(getFindItem()); menu.add(new GroupMarker(IWorkbenchActionConstants.FIND_EXT)); menu.add(new Separator()); menu.add(getBookmarkItem()); menu.add(getTaskItem()); menu.add(new GroupMarker(IWorkbenchActionConstants.ADD_EXT)); menu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_END)); menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); return menu; } /** * Creates and returns the Window menu. */ private MenuManager createWindowMenu() { MenuManager menu = new MenuManager( Messages.WindowMenuName, IWorkbenchActionConstants.M_WINDOW); addPerspectiveActions(menu); Separator sep = new Separator(IWorkbenchActionConstants.MB_ADDITIONS); sep.setVisible(!Util.isMac()); menu.add(sep); // See the comment for quit in createFileMenu ActionContributionItem openPreferencesItem = new ActionContributionItem(openPreferencesAction); openPreferencesItem.setVisible(!Util.isMac()); menu.add(openPreferencesItem); menu.add(ContributionItemFactory.OPEN_WINDOWS.create(getWindow())); return menu; } /** * Creates and returns the Help menu. */ private MenuManager createHelpMenu() { MenuManager menu = new MenuManager(Messages.HelpMenuName, IWorkbenchActionConstants.M_HELP); menu.add(new GroupMarker("group.intro.ext")); //$NON-NLS-1$ menu.add(new GroupMarker("group.main")); //$NON-NLS-1$ menu.add(helpContentsAction); menu.add(helpSearchAction); menu.add(dynamicHelpAction); menu.add(new GroupMarker("group.assist")); //$NON-NLS-1$ // HELP_START should really be the first item, but it was after // quickStartAction and tipsAndTricksAction in 2.1. menu.add(new GroupMarker(IWorkbenchActionConstants.HELP_START)); menu.add(new GroupMarker("group.main.ext")); //$NON-NLS-1$ menu.add(new GroupMarker("group.tutorials")); //$NON-NLS-1$ menu.add(new GroupMarker("group.tools")); //$NON-NLS-1$ menu.add(new GroupMarker("group.updates")); //$NON-NLS-1$ menu.add(new GroupMarker(IWorkbenchActionConstants.HELP_END)); menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); // about should always be at the bottom menu.add(new Separator("group.about")); //$NON-NLS-1$ ActionContributionItem aboutItem = new ActionContributionItem(aboutAction); aboutItem.setVisible(!Util.isMac()); menu.add(aboutItem); menu.add(new GroupMarker("group.about.ext")); //$NON-NLS-1$ return menu; } /** * Adds the perspective actions to the specified menu. */ private void addPerspectiveActions(MenuManager menu) { { MenuManager showViewMenuMgr = new MenuManager(Messages.ShowViewMenuName, "showView"); //$NON-NLS-1$ IContributionItem showViewMenu = ContributionItemFactory.VIEWS_SHORTLIST .create(getWindow()); showViewMenuMgr.add(showViewMenu); menu.add(showViewMenuMgr); } menu.add(new Separator()); menu.add(editActionSetAction); menu.add(getResetPerspectiveItem()); } private IContributionItem getItem(String actionId, String commandId, String image, String disabledImage, String label, String tooltip, String helpContextId) { ISharedImages sharedImages = getWindow().getWorkbench() .getSharedImages(); IActionCommandMappingService acms = getWindow() .getService(IActionCommandMappingService.class); acms.map(actionId, commandId); CommandContributionItemParameter commandParm = new CommandContributionItemParameter( getWindow(), actionId, commandId, null, sharedImages .getImageDescriptor(image), sharedImages .getImageDescriptor(disabledImage), null, label, null, tooltip, CommandContributionItem.STYLE_PUSH, null, false); return new CommandContributionItem(commandParm); } private IContributionItem getResetPerspectiveItem() { return getItem( ActionFactory.RESET_PERSPECTIVE.getId(), ActionFactory.RESET_PERSPECTIVE.getCommandId(), null, null, Messages.ResetPerspective_text, Messages.ResetPerspective_toolTip, IWorkbenchHelpContextIds.RESET_PERSPECTIVE_ACTION); } private IContributionItem getCutItem() { return getItem( ActionFactory.CUT.getId(), ActionFactory.CUT.getCommandId(), ISharedImages.IMG_TOOL_CUT, ISharedImages.IMG_TOOL_CUT_DISABLED, Messages.Workbench_cut, Messages.Workbench_cutToolTip, null); } private IContributionItem getCopyItem() { return getItem( ActionFactory.COPY.getId(), ActionFactory.COPY.getCommandId(), ISharedImages.IMG_TOOL_COPY, ISharedImages.IMG_TOOL_COPY_DISABLED, Messages.Workbench_copy, Messages.Workbench_copyToolTip, null); } private IContributionItem getPasteItem() { return getItem( ActionFactory.PASTE.getId(), ActionFactory.PASTE.getCommandId(), ISharedImages.IMG_TOOL_PASTE, ISharedImages.IMG_TOOL_PASTE_DISABLED, Messages.Workbench_paste, Messages.Workbench_pasteToolTip, null); } private IContributionItem getSelectAllItem() { return getItem( ActionFactory.SELECT_ALL.getId(), ActionFactory.SELECT_ALL.getCommandId(), null, null, Messages.Workbench_selectAll, Messages.Workbench_selectAllToolTip, null); } private IContributionItem getFindItem() { return getItem( ActionFactory.FIND.getId(), ActionFactory.FIND.getCommandId(), null, null, Messages.Workbench_findReplace, Messages.Workbench_findReplaceToolTip, null); } private IContributionItem getBookmarkItem() { return getItem( IDEActionFactory.BOOKMARK.getId(), IDEActionFactory.BOOKMARK.getCommandId(), null, null, Messages.Workbench_addBookmark, Messages.Workbench_addBookmarkToolTip, null); } private IContributionItem getTaskItem() { return getItem( IDEActionFactory.ADD_TASK.getId(), IDEActionFactory.ADD_TASK.getCommandId(), null, null, Messages.Workbench_addTask, Messages.Workbench_addTaskToolTip, null); } private IContributionItem getDeleteItem() { return getItem(ActionFactory.DELETE.getId(), ActionFactory.DELETE.getCommandId(), ISharedImages.IMG_TOOL_DELETE, ISharedImages.IMG_TOOL_DELETE_DISABLED, Messages.Workbench_delete, Messages.Workbench_deleteToolTip, IWorkbenchHelpContextIds.DELETE_RETARGET_ACTION); } private static class WorkbenchCommandAction extends CommandAction implements IWorkbenchAction { /** * @param commandIdIn * @param window */ public WorkbenchCommandAction(String commandIdIn, IWorkbenchWindow window) { super(window, commandIdIn); } } /** * Workbench action (id: "corefile", commandId: "org.eclipse.cdt.debug.application.command.debugCore"): * Debug an executable with a core file. This action maintains its enablement state. */ private static final ActionFactory COREFILE = new ActionFactory("corefile", //$NON-NLS-1$ COREFILE_COMMAND_ID) { /* (non-Javadoc) * @see org.eclipse.ui.actions.ActionFactory#create(org.eclipse.ui.IWorkbenchWindow) */ @Override public IWorkbenchAction create(IWorkbenchWindow window) { if (window == null) { throw new IllegalArgumentException(); } WorkbenchCommandAction action = new WorkbenchCommandAction( getCommandId(), window); action.setId(getId()); action.setText(Messages.CoreFileMenuName); action.setToolTipText(Messages.CoreFile_toolTip); return action; } }; /** * Workbench action (id: "newexecutable", commandId: "org.eclipse.cdt.debug.application.command.debugNewExecutable"): * Debug an executable. This action maintains its enablement state. */ private static final ActionFactory NEW_EXECUTABLE = new ActionFactory("newexecutable", //$NON-NLS-1$ NEW_EXECUTABLE_COMMAND_ID) { /* (non-Javadoc) * @see org.eclipse.ui.actions.ActionFactory#create(org.eclipse.ui.IWorkbenchWindow) */ @Override public IWorkbenchAction create(IWorkbenchWindow window) { if (window == null) { throw new IllegalArgumentException(); } WorkbenchCommandAction action = new WorkbenchCommandAction( getCommandId(), window); action.setId(getId()); action.setText(Messages.NewExecutableMenuName); action.setToolTipText(Messages.NewExecutable_toolTip); return action; } }; /** * Workbench action (id: "remoteexecutable", commandId: "org.eclipse.cdt.debug.application.command.debugRemoteExecutable"): * Debug a remote executable. This action maintains its enablement state. */ private static final ActionFactory REMOTE_EXECUTABLE = new ActionFactory("remoteexecutable", //$NON-NLS-1$ REMOTE_EXECUTABLE_COMMAND_ID) { /* (non-Javadoc) * @see org.eclipse.ui.actions.ActionFactory#create(org.eclipse.ui.IWorkbenchWindow) */ @Override public IWorkbenchAction create(IWorkbenchWindow window) { if (window == null) { throw new IllegalArgumentException(); } WorkbenchCommandAction action = new WorkbenchCommandAction( getCommandId(), window); action.setId(getId()); action.setText(Messages.RemoteExecutableMenuName); action.setToolTipText(Messages.RemoteExecutable_toolTip); return action; } }; /** * Workbench action (id: "attachexecutable", commandId: "org.eclipse.cdt.debug.application.command.debugAttachedExecutable"): * Attach and debug an existing executable. This action maintains its enablement state. */ private static final ActionFactory ATTACH_EXECUTABLE = new ActionFactory("attachexecutable", //$NON-NLS-1$ ATTACH_EXECUTABLE_COMMAND_ID) { /* (non-Javadoc) * @see org.eclipse.ui.actions.ActionFactory#create(org.eclipse.ui.IWorkbenchWindow) */ @Override public IWorkbenchAction create(IWorkbenchWindow window) { if (window == null) { throw new IllegalArgumentException(); } WorkbenchCommandAction action = new WorkbenchCommandAction( getCommandId(), window); action.setId(getId()); action.setText(Messages.AttachedExecutableMenuName); action.setToolTipText(Messages.AttachedExecutable_toolTip); return action; } }; }