diff options
author | Paul Webster | 2010-03-02 20:12:32 +0000 |
---|---|---|
committer | Paul Webster | 2010-03-02 20:12:32 +0000 |
commit | 37848358f0b5f81a9ae0bbe264c50357e788f2f5 (patch) | |
tree | 14bf8a1dc13f855d77af2276935f10de7403ace1 /bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ShowViewMenu.java | |
parent | 11d46d6c88e8383d7970bf26aff954047343bbb9 (diff) | |
download | eclipse.platform.ui-37848358f0b5f81a9ae0bbe264c50357e788f2f5.tar.gz eclipse.platform.ui-37848358f0b5f81a9ae0bbe264c50357e788f2f5.tar.xz eclipse.platform.ui-37848358f0b5f81a9ae0bbe264c50357e788f2f5.zip |
Bug 299385 - [UI] clean up errors in compatibility workbenchI20100406-2156
Changes to support the extended compat layer
Diffstat (limited to 'bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ShowViewMenu.java')
-rw-r--r-- | bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ShowViewMenu.java | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ShowViewMenu.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ShowViewMenu.java new file mode 100644 index 00000000000..c3ae723d95d --- /dev/null +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ShowViewMenu.java @@ -0,0 +1,371 @@ +/******************************************************************************* + * Copyright (c) 2000, 2009 IBM Corporation and others. + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.ui.internal; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.commands.Command; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.IParameter; +import org.eclipse.core.commands.NotEnabledException; +import org.eclipse.core.commands.NotHandledException; +import org.eclipse.core.commands.Parameterization; +import org.eclipse.core.commands.ParameterizedCommand; +import org.eclipse.core.commands.common.NotDefinedException; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ContributionItem; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.ui.IPluginContribution; +import org.eclipse.ui.IWorkbenchCommandConstants; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.activities.WorkbenchActivityHelper; +import org.eclipse.ui.commands.ICommandService; +import org.eclipse.ui.handlers.IHandlerService; +import org.eclipse.ui.internal.intro.IIntroConstants; +import org.eclipse.ui.internal.registry.ViewDescriptor; +import org.eclipse.ui.menus.CommandContributionItem; +import org.eclipse.ui.menus.CommandContributionItemParameter; +import org.eclipse.ui.services.IServiceLocator; +import org.eclipse.ui.views.IViewDescriptor; +import org.eclipse.ui.views.IViewRegistry; + +import com.ibm.icu.text.Collator; + +/** + * A <code>ShowViewMenu</code> is used to populate a menu manager with Show + * View actions. The visible views are determined by user preference from the + * Perspective Customize dialog. + */ +public class ShowViewMenu extends ContributionItem { + /** + * @deprecated As of 3.5, replaced by {@link IWorkbenchCommandConstants#VIEWS_SHOW_VIEW} + */ + public static final String SHOW_VIEW_ID= IWorkbenchCommandConstants.VIEWS_SHOW_VIEW; + /** + * @deprecated As of 3.6, replaced by + * {@link IWorkbenchCommandConstants#VIEWS_SHOW_VIEW_PARM_ID} + */ + public static final String VIEW_ID_PARM = IWorkbenchCommandConstants.VIEWS_SHOW_VIEW_PARM_ID; + + private IWorkbenchWindow window; + + private static final String NO_TARGETS_MSG = WorkbenchMessages.Workbench_showInNoTargets; + + private Comparator actionComparator = new Comparator() { + public int compare(Object o1, Object o2) { + if (collator == null) { + collator = Collator.getInstance(); + } + CommandContributionItemParameter a1 = (CommandContributionItemParameter) o1; + CommandContributionItemParameter a2 = (CommandContributionItemParameter) o2; + return collator.compare(a1.label, a2.label); + } + }; + + private Action showDlgAction; + + private Map actions = new HashMap(21); + + // Maps pages to a list of opened views + private Map openedViews = new HashMap(); + + protected boolean dirty = true; + + private IMenuListener menuListener = new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + manager.markDirty(); + dirty = true; + } + }; + private boolean makeFast; + + private static Collator collator; + + + /** + * Creates a Show View menu. + * + * @param window + * the window containing the menu + * @param id + * the id + */ + public ShowViewMenu(IWorkbenchWindow window, String id) { + this(window, id, false); + } + + /** + * Creates a Show View menu. + * + * @param window + * the window containing the menu + * @param id + * the id + * @param makeFast use the fact view variant of the command + */ + public ShowViewMenu(IWorkbenchWindow window, String id, + final boolean makeFast) { + super(id); + this.window = window; + this.makeFast = makeFast; + final IHandlerService handlerService = (IHandlerService) window + .getService(IHandlerService.class); + final ICommandService commandService = (ICommandService) window + .getService(ICommandService.class); + final ParameterizedCommand cmd = getCommand(commandService, makeFast); + + showDlgAction = new Action(WorkbenchMessages.ShowView_title) { + public void run() { + try { + handlerService.executeCommand(cmd, null); + } catch (final ExecutionException e) { + // Do nothing. + } catch (NotDefinedException e) { + // Do nothing. + } catch (NotEnabledException e) { + // Do nothing. + } catch (NotHandledException e) { + // Do nothing. + } + } + }; + + window.getWorkbench().getHelpSystem().setHelp(showDlgAction, + IWorkbenchHelpContextIds.SHOW_VIEW_OTHER_ACTION); + // indicate that a show views submenu has been created + if (window instanceof WorkbenchWindow) { + ((WorkbenchWindow) window) + .addSubmenu(WorkbenchWindow.SHOW_VIEW_SUBMENU); + } + + showDlgAction.setActionDefinitionId(IWorkbenchCommandConstants.VIEWS_SHOW_VIEW); + + } + + public boolean isDirty() { + return dirty; + } + + /** + * Overridden to always return true and force dynamic menu building. + */ + public boolean isDynamic() { + return true; + } + + /** + * Fills the menu with Show View actions. + */ + private void fillMenu(IMenuManager innerMgr) { + // Remove all. + innerMgr.removeAll(); + + // If no page disable all. + IWorkbenchPage page = window.getActivePage(); + if (page == null) { + return; + } + + // If no active perspective disable all + if (page.getPerspective() == null) { + return; + } + + // Get visible actions. + List viewIds = Arrays.asList(page.getShowViewShortcuts()); + + // add all open views + viewIds = addOpenedViews(page, viewIds); + + List actions = new ArrayList(viewIds.size()); + for (Iterator i = viewIds.iterator(); i.hasNext();) { + String id = (String) i.next(); + if (id.equals(IIntroConstants.INTRO_VIEW_ID)) { + continue; + } + CommandContributionItemParameter item = getItem(id); + if (item != null) { + actions.add(item); + } + } + Collections.sort(actions, actionComparator); + for (Iterator i = actions.iterator(); i.hasNext();) { + CommandContributionItemParameter ccip = (CommandContributionItemParameter) i.next(); + if (WorkbenchActivityHelper.filterItem(ccip)) { + continue; + } + CommandContributionItem item = new CommandContributionItem(ccip); + innerMgr.add(item); + } + + // We only want to add the separator if there are show view shortcuts, + // otherwise, there will be a separator and then the 'Other...' entry + // and that looks weird as the separator is separating nothing + if (!innerMgr.isEmpty()) { + innerMgr.add(new Separator()); + } + + // Add Other... + innerMgr.add(showDlgAction); + } + + static class PluginCCIP extends CommandContributionItemParameter implements + IPluginContribution { + + private String localId; + private String pluginId; + + public PluginCCIP(IViewDescriptor v, IServiceLocator serviceLocator, + String id, String commandId, int style) { + super(serviceLocator, id, commandId, style); + localId = ((ViewDescriptor) v).getLocalId(); + pluginId = ((ViewDescriptor) v).getPluginId(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.IPluginContribution#getLocalId() + */ + public String getLocalId() { + return localId; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.IPluginContribution#getPluginId() + */ + public String getPluginId() { + return pluginId; + } + + } + + private CommandContributionItemParameter getItem(String viewId) { + IViewRegistry reg = WorkbenchPlugin.getDefault().getViewRegistry(); + IViewDescriptor desc = reg.find(viewId); + if (desc==null) { + return null; + } + String label = desc.getLabel(); + + CommandContributionItemParameter parms = new PluginCCIP(desc, + window, viewId, IWorkbenchCommandConstants.VIEWS_SHOW_VIEW, + CommandContributionItem.STYLE_PUSH); + parms.label = label; + parms.icon = desc.getImageDescriptor(); + parms.parameters = new HashMap(); + + parms.parameters.put(VIEW_ID_PARM, viewId); + if (makeFast) { + parms.parameters.put( + IWorkbenchCommandConstants.VIEWS_SHOW_VIEW_PARM_FASTVIEW, + "true"); //$NON-NLS-1$ + } + return parms; + } + + private List addOpenedViews(IWorkbenchPage page, List actions) { + ArrayList views = getParts(page); + ArrayList result = new ArrayList(views.size() + actions.size()); + + for (int i = 0; i < actions.size(); i++) { + Object element = actions.get(i); + if (result.indexOf(element) < 0) { + result.add(element); + } + } + for (int i = 0; i < views.size(); i++) { + Object element = views.get(i); + if (result.indexOf(element) < 0) { + result.add(element); + } + } + return result; + } + + private ArrayList getParts(IWorkbenchPage page) { + ArrayList parts = (ArrayList) openedViews.get(page); + if (parts == null) { + parts = new ArrayList(); + openedViews.put(page, parts); + } + return parts; + } + + public void fill(Menu menu, int index) { + if (getParent() instanceof MenuManager) { + ((MenuManager) getParent()).addMenuListener(menuListener); + } + + if (!dirty) { + return; + } + + MenuManager manager = new MenuManager(); + fillMenu(manager); + IContributionItem items[] = manager.getItems(); + if (items.length == 0) { + MenuItem item = new MenuItem(menu, SWT.NONE, index++); + item.setText(NO_TARGETS_MSG); + item.setEnabled(false); + } else { + for (int i = 0; i < items.length; i++) { + items[i].fill(menu, index++); + } + } + dirty = false; + } + + // for dynamic UI + protected void removeAction(String viewId) { + actions.remove(viewId); + } + + /** + * @param commandService + * @param makeFast + */ + private ParameterizedCommand getCommand(ICommandService commandService, + final boolean makeFast) { + Command c = commandService.getCommand(IWorkbenchCommandConstants.VIEWS_SHOW_VIEW); + Parameterization[] parms = null; + if (makeFast) { + try { + IParameter parmDef = c + .getParameter(IWorkbenchCommandConstants.VIEWS_SHOW_VIEW_PARM_FASTVIEW); + parms = new Parameterization[] { new Parameterization(parmDef, + "true") //$NON-NLS-1$ + }; + } catch (NotDefinedException e) { + // this should never happen + } + } + return new ParameterizedCommand(c, parms); + } +} |