blob: 1bd5790ba01c043ae17f67b1dc060223aafd3da6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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
* Sebastian Davids <sdavids@gmx.de> - Collapse all action (25826)
* Sebastian Davids <sdavids@gmx.de> - Images for menu items (27481)
*******************************************************************************/
package org.eclipse.ui.views.navigator;
import java.util.List;
import org.eclipse.core.commands.operations.IUndoContext;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.AddBookmarkAction;
import org.eclipse.ui.actions.AddTaskAction;
import org.eclipse.ui.actions.ExportResourcesAction;
import org.eclipse.ui.actions.ImportResourcesAction;
import org.eclipse.ui.actions.NewWizardMenu;
import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
import org.eclipse.ui.dialogs.PropertyDialogAction;
import org.eclipse.ui.ide.IDEActionFactory;
import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
import org.eclipse.ui.operations.UndoRedoActionGroup;
/**
* The main action group for the navigator.
* This contains a few actions and several subgroups.
*/
public class MainActionGroup extends ResourceNavigatorActionGroup {
protected AddBookmarkAction addBookmarkAction;
protected AddTaskAction addTaskAction;
protected PropertyDialogAction propertyDialogAction;
protected ImportResourcesAction importAction;
protected ExportResourcesAction exportAction;
protected CollapseAllAction collapseAllAction;
protected ToggleLinkingAction toggleLinkingAction;
protected GotoActionGroup gotoGroup;
protected OpenActionGroup openGroup;
protected RefactorActionGroup refactorGroup;
protected WorkingSetFilterActionGroup workingSetGroup;
protected SortAndFilterActionGroup sortAndFilterGroup;
protected UndoRedoActionGroup undoRedoGroup;
protected WorkspaceActionGroup workspaceGroup;
private IResourceChangeListener resourceChangeListener;
private NewWizardMenu newWizardMenu;
/**
* Constructs the main action group.
*
* @param navigator the navigator view
*/
public MainActionGroup(IResourceNavigator navigator) {
super(navigator);
resourceChangeListener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
handleResourceChanged(event);
}
};
ResourcesPlugin.getWorkspace().addResourceChangeListener(
resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
makeSubGroups();
}
/**
* Handles a resource changed event by updating the enablement
* if one of the selected projects is opened or closed.
*/
protected void handleResourceChanged(IResourceChangeEvent event) {
ActionContext context = getContext();
if (context == null) {
return;
}
final IStructuredSelection selection = (IStructuredSelection) context
.getSelection();
if (ResourceSelectionUtil.allResourcesAreOfType(selection,
IResource.PROJECT) == false) {
return;
}
List sel = selection.toList();
IResourceDelta delta = event.getDelta();
if (delta == null) {
return;
}
IResourceDelta[] projDeltas = delta
.getAffectedChildren(IResourceDelta.CHANGED);
for (int i = 0; i < projDeltas.length; ++i) {
IResourceDelta projDelta = projDeltas[i];
if ((projDelta.getFlags() & IResourceDelta.OPEN) != 0) {
if (sel.contains(projDelta.getResource())) {
getNavigator().getSite().getShell().getDisplay().syncExec(
new Runnable() {
public void run() {
addTaskAction.selectionChanged(selection);
gotoGroup.updateActionBars();
refactorGroup.updateActionBars();
workspaceGroup.updateActionBars();
}
});
}
}
}
}
/**
* Makes the actions contained directly in this action group.
*/
protected void makeActions() {
Shell shell = navigator.getSite().getShell();
newWizardMenu = new NewWizardMenu(navigator.getSite().getWorkbenchWindow());
addBookmarkAction = new AddBookmarkAction(shell);
addTaskAction = new AddTaskAction(shell);
propertyDialogAction = new PropertyDialogAction(shell, navigator
.getViewer());
importAction = new ImportResourcesAction(navigator.getSite()
.getWorkbenchWindow());
importAction
.setDisabledImageDescriptor(getImageDescriptor("dtool16/import_wiz.gif")); //$NON-NLS-1$
importAction
.setImageDescriptor(getImageDescriptor("etool16/import_wiz.gif")); //$NON-NLS-1$
exportAction = new ExportResourcesAction(navigator.getSite()
.getWorkbenchWindow());
exportAction
.setDisabledImageDescriptor(getImageDescriptor("dtool16/export_wiz.gif")); //$NON-NLS-1$
exportAction
.setImageDescriptor(getImageDescriptor("etool16/export_wiz.gif")); //$NON-NLS-1$
collapseAllAction = new CollapseAllAction(navigator,
ResourceNavigatorMessages.CollapseAllAction_title);
collapseAllAction.setToolTipText(ResourceNavigatorMessages.CollapseAllAction_toolTip);
collapseAllAction
.setImageDescriptor(getImageDescriptor("elcl16/collapseall.gif")); //$NON-NLS-1$
toggleLinkingAction = new ToggleLinkingAction(navigator,
ResourceNavigatorMessages.ToggleLinkingAction_text);
toggleLinkingAction.setToolTipText(ResourceNavigatorMessages.ToggleLinkingAction_toolTip);
toggleLinkingAction
.setImageDescriptor(getImageDescriptor("elcl16/synced.gif"));//$NON-NLS-1$
}
/**
* Makes the sub action groups.
*/
protected void makeSubGroups() {
gotoGroup = new GotoActionGroup(navigator);
openGroup = new OpenActionGroup(navigator);
refactorGroup = new RefactorActionGroup(navigator);
IPropertyChangeListener workingSetUpdater = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
if (WorkingSetFilterActionGroup.CHANGE_WORKING_SET
.equals(property)) {
IResourceNavigator navigator = getNavigator();
Object newValue = event.getNewValue();
if (newValue instanceof IWorkingSet) {
navigator.setWorkingSet((IWorkingSet) newValue);
} else if (newValue == null) {
navigator.setWorkingSet(null);
}
}
}
};
TreeViewer treeView = navigator.getViewer();
Shell shell = treeView.getControl().getShell();
workingSetGroup = new WorkingSetFilterActionGroup(shell,
workingSetUpdater);
workingSetGroup.setWorkingSet(navigator.getWorkingSet());
sortAndFilterGroup = new SortAndFilterActionGroup(navigator);
workspaceGroup = new WorkspaceActionGroup(navigator);
IUndoContext workspaceContext= (IUndoContext)ResourcesPlugin.getWorkspace().getAdapter(IUndoContext.class);
undoRedoGroup= new UndoRedoActionGroup(getNavigator().getSite(), workspaceContext, true);
}
/**
* Extends the superclass implementation to set the context in the subgroups.
*/
public void setContext(ActionContext context) {
super.setContext(context);
gotoGroup.setContext(context);
openGroup.setContext(context);
refactorGroup.setContext(context);
sortAndFilterGroup.setContext(context);
workspaceGroup.setContext(context);
undoRedoGroup.setContext(context);
}
/**
* Fills the context menu with the actions contained in this group
* and its subgroups.
*
* @param menu the context menu
*/
public void fillContextMenu(IMenuManager menu) {
IStructuredSelection selection = (IStructuredSelection) getContext()
.getSelection();
MenuManager newMenu = new MenuManager(ResourceNavigatorMessages.ResourceNavigator_new);
menu.add(newMenu);
newMenu.add(newWizardMenu);
gotoGroup.fillContextMenu(menu);
openGroup.fillContextMenu(menu);
menu.add(new Separator());
refactorGroup.fillContextMenu(menu);
menu.add(new Separator());
menu.add(importAction);
menu.add(exportAction);
importAction.selectionChanged(selection);
exportAction.selectionChanged(selection);
menu.add(new Separator());
workspaceGroup.fillContextMenu(menu);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menu
.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
+ "-end")); //$NON-NLS-1$
menu.add(new Separator());
if (selection.size() == 1) {
propertyDialogAction.selectionChanged(selection);
menu.add(propertyDialogAction);
}
}
/**
* Adds the actions in this group and its subgroups to the action bars.
*/
public void fillActionBars(IActionBars actionBars) {
actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(),
propertyDialogAction);
actionBars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(),
addBookmarkAction);
actionBars.setGlobalActionHandler(IDEActionFactory.ADD_TASK.getId(),
addTaskAction);
gotoGroup.fillActionBars(actionBars);
openGroup.fillActionBars(actionBars);
refactorGroup.fillActionBars(actionBars);
workingSetGroup.fillActionBars(actionBars);
sortAndFilterGroup.fillActionBars(actionBars);
workspaceGroup.fillActionBars(actionBars);
undoRedoGroup.fillActionBars(actionBars);
IMenuManager menu = actionBars.getMenuManager();
menu.add(toggleLinkingAction);
IToolBarManager toolBar = actionBars.getToolBarManager();
toolBar.add(new Separator());
toolBar.add(collapseAllAction);
toolBar.add(toggleLinkingAction);
}
/**
* Updates the actions which were added to the action bars,
* delegating to the subgroups as necessary.
*/
public void updateActionBars() {
IStructuredSelection selection = (IStructuredSelection) getContext()
.getSelection();
propertyDialogAction.setEnabled(selection.size() == 1);
addBookmarkAction.selectionChanged(selection);
addTaskAction.selectionChanged(selection);
gotoGroup.updateActionBars();
openGroup.updateActionBars();
refactorGroup.updateActionBars();
workingSetGroup.updateActionBars();
sortAndFilterGroup.updateActionBars();
workspaceGroup.updateActionBars();
undoRedoGroup.updateActionBars();
}
/**
* Runs the default action (open file) by delegating the open group.
*/
public void runDefaultAction(IStructuredSelection selection) {
openGroup.runDefaultAction(selection);
}
/**
* Handles a key pressed event by invoking the appropriate action,
* delegating to the subgroups as necessary.
*/
public void handleKeyPressed(KeyEvent event) {
refactorGroup.handleKeyPressed(event);
workspaceGroup.handleKeyPressed(event);
}
/**
* Extends the superclass implementation to dispose the
* actions in this group and its subgroups.
*/
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(
resourceChangeListener);
newWizardMenu.dispose();
collapseAllAction.dispose();
importAction.dispose();
exportAction.dispose();
propertyDialogAction.dispose();
toggleLinkingAction.dispose();
gotoGroup.dispose();
openGroup.dispose();
refactorGroup.dispose();
sortAndFilterGroup.dispose();
workingSetGroup.dispose();
workspaceGroup.dispose();
undoRedoGroup.dispose();
super.dispose();
}
}