blob: 9ecf1b83ed38a410a37f7314aedee1bb32df89c4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.ui.mapping;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.commands.IHandler;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.team.core.mapping.ISynchronizationContext;
import org.eclipse.team.internal.ui.mapping.CommonMenuManager;
import org.eclipse.team.internal.ui.synchronize.actions.OpenWithActionGroup;
import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonViewerSite;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
import org.eclipse.ui.navigator.IExtensionStateModel;
/**
* An action group that can be used by models to contribute actions
* to a team synchronization viewer. Subclasses should override the
* {@link #initialize()} method in order to register handlers for the
* following merge actions if they want custom merge behavior:
* <ul>
* <li>{@link #MERGE_ACTION_ID}
* <li>{@link #OVERWRITE_ACTION_ID}
* <li>{@link #OVERWRITE_ACTION_ID}
* </ul>
* They may also add other actions to the context menu or register action handlers
* in the {@link #fillActionBars(IActionBars)} method.
* <p>
* This class may be subclasses by clients.
*
* @see MergeActionHandler
* @since 3.2
*/
public class SynchronizationActionProvider extends CommonActionProvider {
/**
* Action id constant for the merge action.
* @see #registerHandler(String, IHandler)
*/
public static final String MERGE_ACTION_ID = "org.eclipse.team.ui.mergeAction"; //$NON-NLS-1$
/**
* Action id constant for the merge action.
* @see #registerHandler(String, IHandler)
*/
public static final String OVERWRITE_ACTION_ID = "org.eclipse.team.ui.overwriteAction"; //$NON-NLS-1$
/**
* Action id constant for the mark-as-merge action.
* @see #registerHandler(String, IHandler)
*/
public static final String MARK_AS_MERGE_ACTION_ID = "org.eclipse.team.ui.markAsMergeAction"; //$NON-NLS-1$
private Map<String, IHandler> handlers = new HashMap<>();
private OpenWithActionGroup openWithActions;
@Override
public void init(ICommonActionExtensionSite site) {
super.init(site);
initialize();
}
/**
* Method called during action provider initialization.
* It is invoked from the {@link #init(ICommonActionExtensionSite)}
* after after the configuration has been recorded. Subclasses
* may override. Subclasses that want to provide there own merge actions
* handlers can register them in this method.
* @see #registerHandler(String, IHandler)
* @see MergeActionHandler
*/
protected void initialize() {
initializeOpenActions();
}
/**
* Method called from {@link #initialize()} to initialize the Open/Open With
* actions. This method will add an Open item and Open With menu for single
* selections that adapt to IResource. Subclasses may override. They may
* still call this method, in which case they only need to handle providing
* open for non-files. Otherwise, if they do not call this method, they must
* provide all non-compare related open items.
*
*/
protected void initializeOpenActions() {
ICommonViewerSite cvs = getActionSite().getViewSite();
ISynchronizePageConfiguration configuration = getSynchronizePageConfiguration();
if (cvs instanceof ICommonViewerWorkbenchSite && configuration != null) {
ICommonViewerWorkbenchSite cvws = (ICommonViewerWorkbenchSite) cvs;
final IWorkbenchPartSite wps = cvws.getSite();
if (wps instanceof IViewSite) {
openWithActions = new OpenWithActionGroup(configuration, false);
}
}
}
/**
* Return the configuration from the synchronize page that contains
* the common viewer.
* @return the configuration from the synchronize page that contains
* the common viewer
*/
protected final ISynchronizePageConfiguration getSynchronizePageConfiguration() {
return (ISynchronizePageConfiguration)getExtensionStateModel().getProperty(ITeamContentProviderManager.P_SYNCHRONIZATION_PAGE_CONFIGURATION);
}
/**
* Return the extension state model for the content provider associated with
* action provider.
* @return the extension state model for the content provider associated with
* action provider
*/
protected final IExtensionStateModel getExtensionStateModel() {
return getActionSite().getExtensionStateModel();
}
/**
* Return the synchronization context to which the actions of this provider
* apply.
* @return the synchronization context to which the actions of this provider
* apply
*/
protected final ISynchronizationContext getSynchronizationContext() {
return (ISynchronizationContext)getExtensionStateModel().getProperty(ITeamContentProviderManager.P_SYNCHRONIZATION_CONTEXT);
}
/**
* Register the handler as the handler for the given action id when
* a merge action is performed on elements that match this groups
* enablement.
* @param actionId the id of the merge action
* @param handler the handler for elements of the model that provided this group
*/
protected void registerHandler(String actionId, IHandler handler) {
handlers.put(actionId, handler);
}
@Override
public void fillContextMenu(IMenuManager menu) {
super.fillContextMenu(menu);
if (menu instanceof CommonMenuManager) {
CommonMenuManager manager = (CommonMenuManager) menu;
for (Iterator iter = handlers.keySet().iterator(); iter.hasNext();) {
String actionId = (String) iter.next();
manager.registerHandler(actionId, handlers.get(actionId));
}
}
final IContributionItem fileGroup = menu.find(ISynchronizePageConfiguration.FILE_GROUP);
if (openWithActions != null && fileGroup != null) {
openWithActions.fillContextMenu(menu, fileGroup.getId());
}
}
@Override
public void fillActionBars(IActionBars actionBars) {
super.fillActionBars(actionBars);
if (openWithActions != null) openWithActions.fillActionBars(actionBars);
}
@Override
public void updateActionBars() {
super.updateActionBars();
if (openWithActions != null) openWithActions.updateActionBars();
}
@Override
public void setContext(ActionContext context) {
super.setContext(context);
if (openWithActions != null) openWithActions.setContext(context);
}
@Override
public void dispose() {
super.dispose();
if (openWithActions != null) openWithActions.dispose();
for (Iterator iter = handlers.values().iterator(); iter.hasNext();) {
IHandler handler = (IHandler) iter.next();
if (handler instanceof MergeActionHandler) {
MergeActionHandler mah = (MergeActionHandler) handler;
mah.dispose();
}
}
}
/**
* Return the extension site for this action provider.
* This method just calls {@link #getActionSite()}.
* @return the extension site for this action provider
*/
public ICommonActionExtensionSite getExtensionSite() {
return getActionSite();
}
}