blob: 1b3cfab7d54983bc7c987ea10f45155a70e2e451 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2007 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.navigator.resources.actions;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorPlugin;
import org.eclipse.ui.internal.navigator.workingsets.WorkingSetsContentProvider;
import org.eclipse.ui.navigator.IExtensionStateModel;
/**
* @since 3.2
*
*/
public class WorkingSetRootModeActionGroup extends ActionGroup {
private IExtensionStateModel stateModel;
private StructuredViewer structuredViewer;
private boolean hasContributedToViewMenu = false;
private IAction workingSetsAction = null;
private IAction projectsAction = null;
private IAction[] actions;
private int currentSelection;
private MenuItem[] items;
private class TopLevelContentAction extends Action implements IAction {
private final boolean groupWorkingSets;
/**
* Construct an Action that represents a toggle-able state between
* Showing top level Working Sets and Projects.
*
* @param toGroupWorkingSets
*/
public TopLevelContentAction(boolean toGroupWorkingSets) {
super("", AS_RADIO_BUTTON); //$NON-NLS-1$
groupWorkingSets = toGroupWorkingSets;
}
/*
* @see org.eclipse.jface.action.IAction#run()
*/
public void run() {
if (stateModel
.getBooleanProperty(WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS) != groupWorkingSets) {
stateModel.setBooleanProperty(
WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS,
groupWorkingSets);
structuredViewer.getControl().setRedraw(false);
try {
structuredViewer.refresh();
} finally {
structuredViewer.getControl().setRedraw(true);
}
}
}
}
/**
* Create an action group that will listen to the stateModel and update the
* structuredViewer when necessary.
*
* @param structuredViewer
* @param stateModel
*/
public WorkingSetRootModeActionGroup(StructuredViewer aStructuredViewer,
IExtensionStateModel aStateModel) {
super();
structuredViewer = aStructuredViewer;
stateModel = aStateModel;
}
/*
* (non-Javadoc)
*
* @see ActionGroup#fillActionBars(IActionBars)
*/
public void fillActionBars(IActionBars actionBars) {
synchronized (this) {
if (!hasContributedToViewMenu) {
contributeToViewMenu(actionBars.getMenuManager());
hasContributedToViewMenu = true;
}
}
}
private void contributeToViewMenu(IMenuManager viewMenu) {
IMenuManager topLevelSubMenu = new MenuManager(
WorkbenchNavigatorMessages.WorkingSetRootModeActionGroup_Top_Level_Element_);
addActions(topLevelSubMenu);
viewMenu.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS,
topLevelSubMenu);
}
/**
* Adds the actions to the given menu manager.
*/
protected void addActions(IMenuManager viewMenu) {
viewMenu.add(new Separator());
items = new MenuItem[actions.length];
for (int i = 0; i < actions.length; i++) {
final int j = i;
viewMenu.add(new ContributionItem() {
public void fill(Menu menu, int index) {
int style = SWT.CHECK;
if ((actions[j].getStyle() & IAction.AS_RADIO_BUTTON) != 0)
style = SWT.RADIO;
final MenuItem mi = new MenuItem(menu, style, index);
items[j] = mi;
mi.setText(actions[j].getText());
mi.setSelection(currentSelection == j);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (currentSelection == j) {
items[currentSelection].setSelection(true);
return;
}
actions[j].run();
// Update checked state
items[currentSelection].setSelection(false);
currentSelection = j;
items[currentSelection].setSelection(true);
}
});
}
public boolean isDynamic() {
return false;
}
});
}
}
private IAction[] createActions() {
ISharedImages sharedImages = PlatformUI.getWorkbench()
.getSharedImages();
projectsAction = new TopLevelContentAction(false);
projectsAction
.setText(WorkbenchNavigatorMessages.WorkingSetRootModeActionGroup_Project_);
projectsAction.setImageDescriptor(sharedImages
.getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT));
workingSetsAction = new TopLevelContentAction(true);
workingSetsAction
.setText(WorkbenchNavigatorMessages.WorkingSetRootModeActionGroup_Working_Set_);
workingSetsAction.setImageDescriptor(WorkbenchNavigatorPlugin
.getDefault().getImageRegistry().getDescriptor(
"full/obj16/workingsets.gif")); //$NON-NLS-1$
return new IAction[] { projectsAction, workingSetsAction };
}
/**
* Toggle whether top level working sets should be displayed as a group or
* collapse to just show their contents.
*
* @param showTopLevelWorkingSets
*/
public void setShowTopLevelWorkingSets(boolean showTopLevelWorkingSets) {
if (actions == null) {
actions = createActions();
setActions(actions, showTopLevelWorkingSets ? 1 /*
* Show Top Level
* Working Sets
*/
: 0);
}
workingSetsAction.setChecked(showTopLevelWorkingSets);
projectsAction.setChecked(!showTopLevelWorkingSets);
if (items != null) {
for (int i = 0; i < items.length; i++) {
if(items[i] != null && actions[i] != null)
items[i].setSelection(actions[i].isChecked());
}
}
if (stateModel != null) {
stateModel.setBooleanProperty(
WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS,
showTopLevelWorkingSets);
}
}
/**
* Configure the actions that are displayed in the menu by this ActionGroup.
*
* @param theActions
* An array of possible actions.
* @param selected
* The index of the "enabled" action.
*/
private void setActions(IAction[] theActions, int selected) {
actions = theActions;
currentSelection = selected;
}
public void setStateModel(IExtensionStateModel sStateModel) {
stateModel = sStateModel;
}
}