blob: ba7da425dfc7faf30d22beb857dc6b79cd6f5141 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2010 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.navigator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.OpenStrategy;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.OpenAndLinkWithEditorHelper;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.RetargetAction;
import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
import org.eclipse.ui.internal.navigator.NavigatorPlugin;
import org.eclipse.ui.internal.navigator.NavigatorSafeRunnable;
import org.eclipse.ui.progress.UIJob;
/**
* <p>
* Manages the non-viewer responsibilities of the Common Navigator View Part,
* including the display and population of the context menu and the registration
* of extensions for opening content.
* </p>
*
* @noinstantiate This class is not intended to be instantiated by clients.
* @since 3.4
*/
public final class CommonNavigatorManager implements ISelectionChangedListener {
private final CommonNavigator commonNavigator;
private final INavigatorContentService contentService;
private NavigatorActionService actionService;
private final IDescriptionProvider commonDescriptionProvider;
private final IStatusLineManager statusLineManager;
private final ILabelProvider labelProvider;
private UpdateActionBarsJob updateActionBars;
private ISelectionChangedListener statusBarListener = new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent anEvent) {
updateStatusBar(anEvent.getSelection());
}
};
private class UpdateActionBarsJob extends UIJob {
public UpdateActionBarsJob(String label) {
super(label);
}
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
SafeRunner.run(new NavigatorSafeRunnable() {
@Override
public void run() throws Exception {
if(commonNavigator.getCommonViewer().getInput() != null) {
IStructuredSelection selection = new StructuredSelection(commonNavigator.getCommonViewer().getInput());
actionService.setContext(new ActionContext(selection));
actionService.fillActionBars(commonNavigator.getViewSite().getActionBars());
}
}
});
return Status.OK_STATUS;
}
}
/**
* <p>
* Adds listeners to aNavigator to listen for selection changes and respond
* to mouse events.
* </p>
*
* @param aNavigator
* The CommonNavigator managed by this class. Requires a non-null
* value.
*/
public CommonNavigatorManager(CommonNavigator aNavigator) {
this(aNavigator, null);
}
/**
* <p>
* Adds listeners to aNavigator to listen for selection changes and respond
* to mouse events.
* </p>
*
* @param aNavigator
* The CommonNavigator managed by this class. Requires a non-null
* value.
* @param aMemento a memento for restoring state, or <code>null</code>
*/
public CommonNavigatorManager(CommonNavigator aNavigator, IMemento aMemento) {
super();
commonNavigator = aNavigator;
contentService = commonNavigator.getNavigatorContentService();
statusLineManager = commonNavigator.getViewSite().getActionBars()
.getStatusLineManager();
commonDescriptionProvider = contentService
.createCommonDescriptionProvider();
labelProvider = (ILabelProvider) commonNavigator.getCommonViewer()
.getLabelProvider();
init(aMemento);
}
private void init(IMemento memento) {
updateActionBars = new UpdateActionBarsJob(commonNavigator.getTitle());
CommonViewer commonViewer = commonNavigator.getCommonViewer();
commonViewer.addSelectionChangedListener(this);
commonViewer.addPostSelectionChangedListener(statusBarListener);
updateStatusBar(commonViewer.getSelection());
ICommonViewerSite commonViewerSite = CommonViewerSiteFactory
.createCommonViewerSite(commonNavigator.getViewSite());
actionService = new NavigatorActionService(commonViewerSite,
commonViewer, commonViewer.getNavigatorContentService());
final RetargetAction openAction = new RetargetAction(
ICommonActionConstants.OPEN,
CommonNavigatorMessages.Open_action_label);
commonNavigator.getViewSite().getPage().addPartListener(openAction);
openAction.setActionDefinitionId(ICommonActionConstants.OPEN);
new OpenAndLinkWithEditorHelper(commonNavigator.getCommonViewer()) {
@Override
protected void activate(ISelection selection) {
final int currentMode = OpenStrategy.getOpenMethod();
try {
/*
* XXX:
* Currently the only way to activate the editor because there is no API to
* get an editor input for a given object.
*/
OpenStrategy.setOpenMethod(OpenStrategy.DOUBLE_CLICK);
actionService.setContext(new ActionContext(commonNavigator.getCommonViewer().getSelection()));
actionService.fillActionBars(commonNavigator.getViewSite().getActionBars());
openAction.run();
} finally {
OpenStrategy.setOpenMethod(currentMode);
}
}
@Override
protected void linkToEditor(ISelection selection) {
// do nothing: this is handled by org.eclipse.ui.internal.navigator.actions.LinkEditorAction
}
@Override
protected void open(ISelection selection, boolean activate) {
actionService.setContext(new ActionContext(commonNavigator.getCommonViewer().getSelection()));
actionService.fillActionBars(commonNavigator.getViewSite().getActionBars());
openAction.run();
}
};
if(memento != null)
restoreState(memento);
initContextMenu();
initViewMenu();
}
/**
* <p>
* Called by {@link CommonNavigator} when the View Part is disposed.
*
*/
public void dispose() {
commonNavigator.getCommonViewer().removeSelectionChangedListener(this);
commonNavigator.getCommonViewer().removeSelectionChangedListener(statusBarListener);
actionService.dispose();
}
/**
*
* @param anEvent
* An event indicating the current selection of the
* {@link CommonViewer}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent anEvent) {
if (anEvent.getSelection() instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) anEvent
.getSelection();
actionService.setContext(new ActionContext(structuredSelection));
actionService.fillActionBars(commonNavigator.getViewSite()
.getActionBars());
}
}
/**
* @param aMemento
* Used to restore state of action extensions via the
* {@link NavigatorActionService}.
*/
public void restoreState(IMemento aMemento) {
actionService.restoreState(aMemento);
}
/**
* @param aMemento
* Used to save state of action extensions via the
* {@link NavigatorActionService}.
*/
public void saveState(IMemento aMemento) {
actionService.saveState(aMemento);
}
/**
* <p>
* Fills aMenuManager with menu contributions from the
* {@link NavigatorActionService}.
* </p>
*
* @param aMenuManager
* A popup menu
* @see NavigatorActionService#fillContextMenu(IMenuManager)
*
*/
protected void fillContextMenu(IMenuManager aMenuManager) {
ISelection selection = commonNavigator.getCommonViewer().getSelection();
actionService.setContext(new ActionContext(selection));
actionService.fillContextMenu(aMenuManager);
}
/**
* <p>
* Initializes and registers the context menu.
* </p>
*/
protected void initContextMenu() {
MenuManager menuMgr = new MenuManager(contentService
.getViewerDescriptor().getPopupMenuId());
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
TreeViewer commonViewer = commonNavigator.getCommonViewer();
Menu menu = menuMgr.createContextMenu(commonViewer.getTree());
commonViewer.getTree().setMenu(menu);
actionService.prepareMenuForPlatformContributions(menuMgr,
commonViewer, false);
}
protected void initViewMenu() {
IMenuManager viewMenu = commonNavigator.getViewSite().getActionBars()
.getMenuManager();
viewMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
viewMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
+ "-end"));//$NON-NLS-1$
updateActionBars.schedule(NavigatorPlugin.ACTION_BAR_DELAY);
}
/**
* @param aSelection
* The current selection from the {@link CommonViewer}
*/
protected void updateStatusBar(ISelection aSelection) {
Image img = null;
if (aSelection != null && !aSelection.isEmpty()
&& aSelection instanceof IStructuredSelection) {
img = labelProvider.getImage(((IStructuredSelection) aSelection)
.getFirstElement());
}
statusLineManager.setMessage(img, commonDescriptionProvider
.getDescription(aSelection));
}
/**
*
* @return The action service used by this manager
*/
public NavigatorActionService getNavigatorActionService() {
return actionService;
}
}