/******************************************************************************* * Copyright (c) 2003, 2015 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; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.commands.ActionHandler; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IMemento; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.actions.ActionGroup; import org.eclipse.ui.handlers.CollapseAllHandler; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.internal.navigator.actions.CollapseAllAction; import org.eclipse.ui.internal.navigator.actions.LinkEditorAction; import org.eclipse.ui.internal.navigator.filters.FilterActionGroup; import org.eclipse.ui.internal.navigator.framelist.BackAction; import org.eclipse.ui.internal.navigator.framelist.ForwardAction; import org.eclipse.ui.internal.navigator.framelist.FrameList; import org.eclipse.ui.internal.navigator.framelist.UpAction; import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.navigator.CommonViewer; import org.eclipse.ui.navigator.IMementoAware; import org.eclipse.ui.navigator.INavigatorViewerDescriptor; import org.eclipse.ui.navigator.LinkHelperService; /** * @since 3.2 */ public class CommonNavigatorActionGroup extends ActionGroup implements IMementoAware { private static final String FRAME_ACTION_SEPARATOR_ID= "FRAME_ACTION_SEPARATOR_ID"; //$NON-NLS-1$ private static final String FRAME_ACTION_GROUP_ID= "FRAME_ACTION_GROUP_ID"; //$NON-NLS-1$ private BackAction backAction; private ForwardAction forwardAction; private UpAction upAction; private LinkEditorAction toggleLinkingAction; private CollapseAllAction collapseAllAction; private FilterActionGroup filterGroup; private final CommonViewer commonViewer; private CommonNavigator commonNavigator; private final LinkHelperService linkHelperService; private CollapseAllHandler collapseAllHandler; private boolean frameActionsShown; /** * Create a action group the common navigator actions. * * @param aNavigator * The IViewPart for this action group * @param aViewer * The Viewer for this action group * @param linkHelperService the link service helper */ public CommonNavigatorActionGroup(CommonNavigator aNavigator, CommonViewer aViewer, LinkHelperService linkHelperService) { super(); commonNavigator = aNavigator; commonViewer = aViewer; this.linkHelperService = linkHelperService; makeActions(); } /** * Returns the image descriptor with the given relative path. */ protected final ImageDescriptor getImageDescriptor(String relativePath) { return NavigatorPlugin.getImageDescriptor("icons/full/" + relativePath); //$NON-NLS-1$ } /** * */ private void makeActions() { FrameList frameList = commonViewer.getFrameList(); backAction = new BackAction(frameList); forwardAction = new ForwardAction(frameList); upAction = new UpAction(frameList); frameList.addPropertyChangeListener(new IPropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(FrameList.P_RESET)) { upAction.setEnabled(false); backAction.setEnabled(false); forwardAction.setEnabled(false); } commonNavigator.updateTitle(); IActionBars actionBars= commonNavigator.getViewSite().getActionBars(); updateToolBar(actionBars.getToolBarManager()); } }); IHandlerService service = commonNavigator.getSite() .getService(IHandlerService.class); INavigatorViewerDescriptor viewerDescriptor = commonViewer .getNavigatorContentService().getViewerDescriptor(); boolean hideLinkWithEditorAction = viewerDescriptor .getBooleanConfigProperty(INavigatorViewerDescriptor.PROP_HIDE_LINK_WITH_EDITOR_ACTION); if (!hideLinkWithEditorAction) { toggleLinkingAction = new LinkEditorAction(commonNavigator, commonViewer, linkHelperService); ImageDescriptor syncIcon = getImageDescriptor("elcl16/synced.png"); //$NON-NLS-1$ toggleLinkingAction.setImageDescriptor(syncIcon); toggleLinkingAction.setHoverImageDescriptor(syncIcon); service.activateHandler(toggleLinkingAction.getActionDefinitionId(), new ActionHandler(toggleLinkingAction)); } boolean hideCollapseAllAction = viewerDescriptor .getBooleanConfigProperty(INavigatorViewerDescriptor.PROP_HIDE_COLLAPSE_ALL_ACTION); if (!hideCollapseAllAction) { collapseAllAction = new CollapseAllAction(commonViewer); ImageDescriptor collapseAllIcon = getImageDescriptor("elcl16/collapseall.png"); //$NON-NLS-1$ collapseAllAction.setImageDescriptor(collapseAllIcon); collapseAllAction.setHoverImageDescriptor(collapseAllIcon); collapseAllHandler = new CollapseAllHandler(commonViewer); service.activateHandler(CollapseAllHandler.COMMAND_ID, collapseAllHandler); } filterGroup = new FilterActionGroup(commonViewer); } @Override public void fillActionBars(IActionBars actionBars) { actionBars.setGlobalActionHandler(ActionFactory.BACK.getId(), backAction); actionBars.setGlobalActionHandler(ActionFactory.FORWARD.getId(), forwardAction); actionBars.setGlobalActionHandler(IWorkbenchActionConstants.UP, upAction); filterGroup.fillActionBars(actionBars); fillToolBar(actionBars.getToolBarManager()); fillViewMenu(actionBars.getMenuManager()); actionBars.updateActionBars(); } protected void fillToolBar(IToolBarManager toolBar) { if (backAction.isEnabled() || upAction.isEnabled() || forwardAction.isEnabled()) { toolBar.add(backAction); toolBar.add(forwardAction); toolBar.add(upAction); toolBar.add(new Separator(FRAME_ACTION_SEPARATOR_ID)); frameActionsShown= true; } toolBar.add(new GroupMarker(FRAME_ACTION_GROUP_ID)); if (collapseAllAction != null) { toolBar.add(collapseAllAction); } if (toggleLinkingAction != null) { toolBar.add(toggleLinkingAction); } } protected void fillViewMenu(IMenuManager menu) { menu.add(new Separator()); menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS+"-end"));//$NON-NLS-1$ if (toggleLinkingAction != null) { menu .insertAfter(IWorkbenchActionConstants.MB_ADDITIONS + "-end", toggleLinkingAction); //$NON-NLS-1$ } } private void updateToolBar(IToolBarManager toolBar) { boolean hasBeenFrameActionsShown= frameActionsShown; frameActionsShown= backAction.isEnabled() || upAction.isEnabled() || forwardAction.isEnabled(); if (frameActionsShown != hasBeenFrameActionsShown) { if (hasBeenFrameActionsShown) { toolBar.remove(backAction.getId()); toolBar.remove(forwardAction.getId()); toolBar.remove(upAction.getId()); toolBar.remove(FRAME_ACTION_SEPARATOR_ID); } else { toolBar.prependToGroup(FRAME_ACTION_GROUP_ID, new Separator(FRAME_ACTION_SEPARATOR_ID)); toolBar.prependToGroup(FRAME_ACTION_GROUP_ID, upAction); toolBar.prependToGroup(FRAME_ACTION_GROUP_ID, forwardAction); toolBar.prependToGroup(FRAME_ACTION_GROUP_ID, backAction); } toolBar.update(true); } } @Override public void dispose() { super.dispose(); backAction.dispose(); forwardAction.dispose(); upAction.dispose(); if (toggleLinkingAction != null) { toggleLinkingAction.dispose(); } if (collapseAllHandler!=null) { collapseAllHandler.dispose(); } } @Override public void restoreState(IMemento aMemento) { filterGroup.restoreState(aMemento); } @Override public void saveState(IMemento aMemento) { filterGroup.saveState(aMemento); } }