| /******************************************************************************* |
| * Copyright (c) 2004 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 - Initial API and implementation |
| * hzhou@actuate.com - Fix for Bug 71695 - |
| * [WorkingSets]Removed Working Set is still shown under the menu item |
| * when it is the recently used working set |
| *******************************************************************************/ |
| package org.eclipse.ui.internal.ide.actions; |
| |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.jface.action.ActionContributionItem; |
| import org.eclipse.jface.action.ContributionItem; |
| import org.eclipse.jface.action.IAction; |
| 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.widgets.Menu; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.IWorkingSet; |
| import org.eclipse.ui.application.IActionBarConfigurer; |
| |
| /** |
| * Sub-menu off project menu for showing MRU list of working set builds. |
| * |
| * @since 3.0 |
| */ |
| public class BuildSetMenu extends ContributionItem { |
| private IActionBarConfigurer actionBars; |
| |
| boolean dirty = true; |
| |
| private IMenuListener menuListener = new IMenuListener() { |
| public void menuAboutToShow(IMenuManager manager) { |
| manager.markDirty(); |
| dirty = true; |
| } |
| }; |
| |
| private IAction selectBuildWorkingSetAction; |
| |
| private IWorkbenchWindow window; |
| |
| /** |
| * Create a new instance of the receiver. |
| * @param window |
| * @param actionBars |
| */ |
| public BuildSetMenu(IWorkbenchWindow window, IActionBarConfigurer actionBars) { |
| this.window = window; |
| this.actionBars = actionBars; |
| selectBuildWorkingSetAction = new SelectBuildWorkingSetAction(window, |
| actionBars); |
| } |
| |
| /** |
| * Adds a mnemonic accelerator to actions in the MRU list of |
| * recently built working sets. |
| * @param action the action to add |
| * @param index the index to add it at |
| */ |
| private void addMnemonic(BuildSetAction action, int index) { |
| StringBuffer label = new StringBuffer(); |
| //add the numerical accelerator |
| if (index < 9) { |
| label.append('&'); |
| label.append(index); |
| label.append(' '); |
| } |
| label.append(action.getWorkingSet().getLabel()); |
| action.setText(label.toString()); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.Menu, int) |
| */ |
| public void fill(Menu menu, int index) { |
| if (getParent() instanceof MenuManager) |
| ((MenuManager) getParent()).addMenuListener(menuListener); |
| if (!dirty) |
| return; |
| fillMenu(menu); |
| dirty = false; |
| } |
| |
| /** |
| * Fills the menu with Show View actions. |
| * @param menu The menu being filled. |
| */ |
| private void fillMenu(Menu menu) { |
| boolean isAutoBuilding = ResourcesPlugin.getWorkspace() |
| .isAutoBuilding(); |
| |
| //build MRU list of recently built working sets: |
| IWorkingSet[] sets = window.getWorkbench().getWorkingSetManager() |
| .getRecentWorkingSets(); |
| BuildSetAction last = BuildSetAction.lastBuilt; |
| IWorkingSet lastSet = null; |
| //add build action for the last working set that was built |
| int accel = 1; |
| if (last != null) { |
| // add it only if it has not been removed |
| boolean found = false; |
| for (int i = 0; i < sets.length; i++) { |
| if (sets[i].equals(last.getWorkingSet())){ |
| found = true; |
| break; |
| } |
| } |
| if (found) { |
| last.setChecked(true); |
| last.setEnabled(!isAutoBuilding); |
| last.setActionDefinitionId("org.eclipse.ui.project.buildLast"); //$NON-NLS-1$ |
| addMnemonic(last, accel++); |
| new ActionContributionItem(last).fill(menu, -1); |
| lastSet = last.getWorkingSet(); |
| } |
| else //Clear the last built if it is not there |
| BuildSetAction.lastBuilt = null; |
| } |
| //add build actions for the most recently used working sets |
| for (int i = 0; i < sets.length; i++) { |
| if (lastSet != null && lastSet.equals(sets[i])) |
| continue; |
| BuildSetAction action = new BuildSetAction(sets[i], window, |
| actionBars); |
| addMnemonic(action, accel++); |
| action.setEnabled(!isAutoBuilding); |
| new ActionContributionItem(action).fill(menu, -1); |
| } |
| //add the action to select a different working set |
| if (sets.length > 0) |
| new Separator().fill(menu, -1); |
| selectBuildWorkingSetAction.setEnabled(!isAutoBuilding); |
| new ActionContributionItem(selectBuildWorkingSetAction).fill(menu, -1); |
| } |
| |
| public boolean isDirty() { |
| return dirty; |
| } |
| |
| /** |
| * Overridden to always return true and force dynamic menu building. |
| */ |
| public boolean isDynamic() { |
| return true; |
| } |
| } |