/******************************************************************************* * 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; /** *
* 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. *
* * @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() { public void selectionChanged(SelectionChangedEvent anEvent) { updateStatusBar(anEvent.getSelection()); } }; private class UpdateActionBarsJob extends UIJob { public UpdateActionBarsJob(String label) { super(label); } public IStatus runInUIThread(IProgressMonitor monitor) { SafeRunner.run(new NavigatorSafeRunnable() { 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; } } /** ** Adds listeners to aNavigator to listen for selection changes and respond * to mouse events. *
* * @param aNavigator * The CommonNavigator managed by this class. Requires a non-null * value. */ public CommonNavigatorManager(CommonNavigator aNavigator) { this(aNavigator, null); } /** ** Adds listeners to aNavigator to listen for selection changes and respond * to mouse events. *
* * @param aNavigator * The CommonNavigator managed by this class. Requires a non-null * value. * @param aMemento a memento for restoring state, ornull
*/
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()) {
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);
}
}
protected void linkToEditor(ISelection selection) {
// do nothing: this is handled by org.eclipse.ui.internal.navigator.actions.LinkEditorAction
}
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();
}
/**
* * 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) */ 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); } /** *
* Fills aMenuManager with menu contributions from the * {@link NavigatorActionService}. *
* * @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); } /** ** Initializes and registers the context menu. *
*/ protected void initContextMenu() { MenuManager menuMgr = new MenuManager(contentService .getViewerDescriptor().getPopupMenuId()); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { 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; } }