blob: 1db1c3c47fdc58d221854cff1caedfe7b5071314 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}