diff options
7 files changed, 297 insertions, 32 deletions
diff --git a/bundles/org.eclipse.team.ui/plugin.xml b/bundles/org.eclipse.team.ui/plugin.xml index 6462c3868..2f64c0d4f 100644 --- a/bundles/org.eclipse.team.ui/plugin.xml +++ b/bundles/org.eclipse.team.ui/plugin.xml @@ -364,14 +364,35 @@ <viewerContentBinding viewerId="org.eclipse.team.ui.navigatorViewer"> <includes> - <!-- <contentExtension - pattern="org.eclipse.team.ui.navigatorContent" - isRoot="true"/> --> <contentExtension pattern="org.eclipse.team.ui.resourceContent" isRoot="true"/> - </includes> - </viewerContentBinding> + </includes> + </viewerContentBinding> + <viewer + viewerId="org.eclipse.team.ui.navigatorViewer"> + <popupMenu + allowsPlatformContributions="true" + id="org.eclipse.team.ui.navigatorViewer#PopupMenu"> + <insertionPoint name="group.synchronize"/> + <insertionPoint + name="group.navigate" + separator="true"/> + <insertionPoint name="group.openWith"/> + <insertionPoint + name="group.merge" + separator="true"/> + <insertionPoint + name="group.other" + separator="true"/> + <insertionPoint + name="additions" + separator="true"/> + <insertionPoint + name="group.properties" + separator="true"/> + </popupMenu> + </viewer> </extension> <!-- *************** Synchronize View Participant **************** --> diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java index 20107b556..a8d9aaf72 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java @@ -12,19 +12,25 @@ package org.eclipse.team.internal.ui.mapping; import java.util.*; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TreeItem; +import org.eclipse.team.internal.ui.TeamUIPlugin; import org.eclipse.team.internal.ui.registry.TeamContentProviderManager; import org.eclipse.team.internal.ui.synchronize.AbstractTreeViewerAdvisor; import org.eclipse.team.ui.TeamUI; import org.eclipse.team.ui.mapping.SynchronizationStateTester; import org.eclipse.team.ui.operations.ModelSynchronizeParticipant; import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; +import org.eclipse.ui.*; +import org.eclipse.ui.actions.ActionContext; import org.eclipse.ui.navigator.*; import org.eclipse.ui.navigator.internal.CommonSorter; +import org.eclipse.ui.part.IPageSite; /** * Provides a Common Navigator based viewer for use by a {@link ModelSynchronizePage}. @@ -55,12 +61,12 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN } } - private static final String TEAM_NAVIGATOR_CONTENT = "org.eclipse.team.ui.navigatorViewer"; //$NON-NLS-1$ + public static final String TEAM_NAVIGATOR_CONTENT = "org.eclipse.team.ui.navigatorViewer"; //$NON-NLS-1$ - Set extensions = new HashSet(); - Map properties = new HashMap(); - - private ISynchronizePageConfiguration configuration; + private Set extensions = new HashSet(); + private Map properties = new HashMap(); + + private NavigatorActionService actionService; /** * Create a common viewer @@ -69,7 +75,7 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN * @return a newly created common viewer */ private static CommonViewer createViewer(Composite parent, ISynchronizePageConfiguration configuration) { - CommonViewer v = new NavigableCommonViewer(TEAM_NAVIGATOR_CONTENT, parent, SWT.NONE); + CommonViewer v = new NavigableCommonViewer(configuration.getViewerId(), parent, SWT.NONE); v.getNavigatorContentService().activateExtensions(TeamContentProviderManager.getInstance().getContentProviderIds(), true); configuration.getSite().setSelectionProvider(v); return v; @@ -81,7 +87,6 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN */ public CommonViewerAdvisor(Composite parent, ISynchronizePageConfiguration configuration) { super(configuration); - this.configuration = configuration; CommonViewer viewer = CommonViewerAdvisor.createViewer(parent, configuration); GridData data = new GridData(GridData.FILL_BOTH); viewer.getControl().setLayoutData(data); @@ -101,8 +106,43 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN viewer.setInput(getInitialInput()); } + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.StructuredViewerAdvisor#initializeViewer(org.eclipse.jface.viewers.StructuredViewer) + */ + public void initializeViewer(StructuredViewer viewer) { + createActionService((CommonViewer)viewer, getConfiguration()); + super.initializeViewer(viewer); + } + + private void createActionService(CommonViewer viewer, ISynchronizePageConfiguration configuration) { + ICommonViewerSite commonSite = createCommonViewerSite(viewer, configuration); + actionService = new NavigatorActionService(commonSite, viewer, viewer.getNavigatorContentService()); + } + + private ICommonViewerSite createCommonViewerSite(CommonViewer viewer, ISynchronizePageConfiguration configuration) { + IWorkbenchSite site = configuration.getSite().getWorkbenchSite(); + if (site instanceof IEditorSite) { + IEditorSite es = (IEditorSite) site; + return CommonViewerSiteFactory.createCommonViewerSite(es); + } + if (site instanceof IViewSite) { + IViewSite vs = (IViewSite) site; + return CommonViewerSiteFactory.createCommonViewerSite(vs); + } + if (site instanceof IPageSite) { + IPageSite ps = (IPageSite) site; + return CommonViewerSiteFactory.createCommonViewerSite(configuration.getViewerId(), ps); + } + return CommonViewerSiteFactory.createCommonViewerSite(configuration.getViewerId(), TeamUIPlugin.getActivePage(), new IMenuRegistration() { + public void registerContextMenu(String menuId, MenuManager menuManager, + ISelectionProvider selectionProvider) { + // Do nothing since dialogs can't have object contributions + } + }, viewer, configuration.getSite().getActionBars()); + } + private Object getInitialInput() { - return ((ModelSynchronizeParticipant)configuration.getParticipant()).getContext(); + return ((ModelSynchronizeParticipant)getConfiguration().getParticipant()).getContext(); } /* (non-Javadoc) @@ -141,5 +181,48 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN extension.getStateModel().setIntProperty(property, value); } } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.StructuredViewerAdvisor#getContextMenuId(org.eclipse.jface.viewers.StructuredViewer) + */ + protected String getContextMenuId(StructuredViewer viewer) { + return ((CommonViewer)viewer).getNavigatorContentService().getViewerDescriptor().getPopupMenuId(); + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.StructuredViewerAdvisor#registerContextMenu(org.eclipse.jface.viewers.StructuredViewer, org.eclipse.jface.action.MenuManager) + */ + protected void registerContextMenu(StructuredViewer viewer, MenuManager menuMgr) { + actionService.prepareMenuForPlatformContributions(menuMgr, + viewer, false); + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.StructuredViewerAdvisor#fillContextMenu(org.eclipse.jface.viewers.StructuredViewer, org.eclipse.jface.action.IMenuManager) + */ + protected void fillContextMenu(StructuredViewer viewer, IMenuManager manager) { + ISelection selection = getViewer().getSelection(); + actionService.setContext(new ActionContext(selection)); + actionService.fillContextMenu(manager); + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.StructuredViewerAdvisor#dispose() + */ + public void dispose() { + actionService.dispose(); + super.dispose(); + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.StructuredViewerAdvisor#updateActionBars(org.eclipse.jface.viewers.IStructuredSelection) + */ + protected void updateActionBars(IStructuredSelection selection) { + super.updateActionBars(selection); + if (!getConfiguration().getSite().isModal()) { + actionService.setContext(new ActionContext(selection)); + actionService.fillActionBars(getConfiguration().getSite().getActionBars()); + } + } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/StructuredViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/StructuredViewerAdvisor.java index 41862b9f0..3322c9c88 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/StructuredViewerAdvisor.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/StructuredViewerAdvisor.java @@ -212,12 +212,7 @@ public abstract class StructuredViewerAdvisor extends AbstractViewerAdvisor { } } - getActionGroup().fillActionBars(actionBars); - updateActionBars((IStructuredSelection) getViewer().getSelection()); - Object input = getViewer().getInput(); - if (input instanceof ISynchronizeModelElement) { - getActionGroup().modelChanged((ISynchronizeModelElement) input); - } + fillActionBars(actionBars); } } @@ -238,18 +233,11 @@ public abstract class StructuredViewerAdvisor extends AbstractViewerAdvisor { * @see fillContextMenu(StructuredViewer, IMenuManager) */ private void hookContextMenu(final StructuredViewer viewer) { - String targetID; - Object o = getConfiguration().getProperty(ISynchronizePageConfiguration.P_OBJECT_CONTRIBUTION_ID); - if (o instanceof String) { - targetID = (String)o; - } else { - targetID = null; - } + String targetID = getContextMenuId(viewer); final MenuManager menuMgr = new MenuManager(targetID); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { - public void menuAboutToShow(IMenuManager manager) { fillContextMenu(viewer, manager); } @@ -279,6 +267,16 @@ public abstract class StructuredViewerAdvisor extends AbstractViewerAdvisor { } }); viewer.getControl().setMenu(menu); + registerContextMenu(viewer, menuMgr); + } + + /** + * Register the context menu with the platform if apropriate. + * @param viewer the viewer + * @param menuMgr the context menu manager + */ + protected void registerContextMenu(final StructuredViewer viewer, MenuManager menuMgr) { + String targetID = getContextMenuId(viewer); if (targetID != null) { IWorkbenchSite workbenchSite = getConfiguration().getSite().getWorkbenchSite(); IWorkbenchPartSite ws = null; @@ -289,8 +287,24 @@ public abstract class StructuredViewerAdvisor extends AbstractViewerAdvisor { } } } + + /** + * Return the context menu id. + * @param viewer the viewer + * @return the context menu id + */ + protected String getContextMenuId(StructuredViewer viewer) { + String targetID; + Object o = getConfiguration().getProperty(ISynchronizePageConfiguration.P_OBJECT_CONTRIBUTION_ID); + if (o instanceof String) { + targetID = (String)o; + } else { + targetID = null; + } + return targetID; + } - /* + /** * Callback that is invoked when a context menu is about to be shown in the * viewer. Subsclasses must implement to contribute menus. Also, menus can * contributed by creating a viewer contribution with a <code>targetID</code> @@ -299,7 +313,7 @@ public abstract class StructuredViewerAdvisor extends AbstractViewerAdvisor { * @param viewer the viewer in which the context menu is being shown. * @param manager the menu manager to which actions can be added. */ - private void fillContextMenu(StructuredViewer viewer, final IMenuManager manager) { + protected void fillContextMenu(StructuredViewer viewer, final IMenuManager manager) { // Populate the menu with the configured groups Object o = getConfiguration().getProperty(ISynchronizePageConfiguration.P_CONTEXT_MENU); if (!(o instanceof String[])) { @@ -315,7 +329,25 @@ public abstract class StructuredViewerAdvisor extends AbstractViewerAdvisor { getActionGroup().fillContextMenu(manager); } - private void updateActionBars(IStructuredSelection selection) { + /** + * Invoked once when the action bars are set. + * @param actionBars the action bars + */ + protected void fillActionBars(IActionBars actionBars) { + getActionGroup().fillActionBars(actionBars); + updateActionBars((IStructuredSelection) getViewer().getSelection()); + Object input = getViewer().getInput(); + if (input instanceof ISynchronizeModelElement) { + getActionGroup().modelChanged((ISynchronizeModelElement) input); + } + } + + /** + * Invoked each time the selection in the view changes in order + * to update the ction bars. + * @param selection the selection from the viewer + */ + protected void updateActionBars(IStructuredSelection selection) { ActionGroup group = getActionGroup(); if (group != null) { group.setContext(new ActionContext(selection)); diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizePageConfiguration.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizePageConfiguration.java index cfb5f5543..343286b96 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizePageConfiguration.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizePageConfiguration.java @@ -21,6 +21,7 @@ import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.team.core.synchronize.SyncInfoSet; import org.eclipse.team.internal.ui.TeamUIPlugin; +import org.eclipse.team.internal.ui.mapping.CommonViewerAdvisor; import org.eclipse.team.internal.ui.synchronize.actions.DefaultSynchronizePageActions; import org.eclipse.team.ui.synchronize.*; import org.eclipse.ui.IActionBars; @@ -588,4 +589,9 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp public IRunnableContext getRunnableContext() { return context; } + + public String getViewerId() { + // TODO Should be a property + return CommonViewerAdvisor.TEAM_NAVIGATOR_CONTENT; + } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SynchronizationActionGroup.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SynchronizationActionGroup.java new file mode 100644 index 000000000..a39a5ac75 --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SynchronizationActionGroup.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2006 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.team.ui.mapping; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.commands.IHandler; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.team.ui.TeamUI; +import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.navigator.CommonActionProvider; +import org.eclipse.ui.navigator.CommonActionProviderConfig; + +/** + * An action group that can be used by models to contribute actions + * to a team synchronization viewer. + * <p> + * This class is not intended to be subclasses by clients + * <p> + * <strong>EXPERIMENTAL</strong>. This class or interface has been added as + * part of a work in progress. There is a guarantee neither that this API will + * work nor that it will remain the same. Please do not use this API without + * consulting with the Platform/Team team. + * </p> + * + * @since 3.2 + */ +public class SynchronizationActionGroup 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 CommonActionProviderConfig config; + private Map handlers = new HashMap(); + + /* (non-Javadoc) + * @see org.eclipse.ui.navigator.CommonActionProvider#init(org.eclipse.ui.navigator.CommonActionProviderConfig) + */ + public void init(CommonActionProviderConfig aConfig) { + config = aConfig; + } + + /** + * Return the configuration for the common viewer. + * @return the configuration from the common viewer + */ + public final CommonActionProviderConfig getCommonConfiguration() { + return config; + } + + /** + * Return the configuration from the synchronize page that contains + * the common viewer. + * @return the configuration from the synchronize page that contains + * the common viewer + */ + public final ISynchronizePageConfiguration getSynchronizePageConfiguration() { + return (ISynchronizePageConfiguration)config.getExtensionStateModel().getProperty(TeamUI.SYNCHRONIZATION_PAGE_CONFIGURATION); + } + + /** + * 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); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager) + */ + public void fillContextMenu(IMenuManager menu) { + super.fillContextMenu(menu); + // TODO: Register the handlers + } + + /* (non-Javadoc) + * @see org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars) + */ + public void fillActionBars(IActionBars actionBars) { + super.fillActionBars(actionBars); + // TODO: Register the handlers + } + + +} diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelSynchronizeParticipant.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelSynchronizeParticipant.java index 03371f188..3d67b5589 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelSynchronizeParticipant.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelSynchronizeParticipant.java @@ -46,13 +46,13 @@ public class ModelSynchronizeParticipant extends * The id of the merge action group that determines where the merge * actions (e.g. merge and overwrite) appear in the context menu or toolbar. */ - public static final String MERGE_ACTION_GROUP = "merge_action_group"; //$NON-NLS-1$ + public static final String MERGE_ACTION_GROUP = "merge"; //$NON-NLS-1$ /** * The id of the action group that determines where the other * actions (e.g. mark-as-mered) appear in the context menu. */ - public static final String OTHER_ACTION_GROUP = "other_action_group"; //$NON-NLS-1$ + public static final String OTHER_ACTION_GROUP = "other"; //$NON-NLS-1$ private ISynchronizationContext context; diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ISynchronizePageConfiguration.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ISynchronizePageConfiguration.java index f855fd7c4..0971a89fa 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ISynchronizePageConfiguration.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ISynchronizePageConfiguration.java @@ -389,4 +389,13 @@ public interface ISynchronizePageConfiguration { * @return a runnable context (or <code>null</code>) */ IRunnableContext getRunnableContext(); + + /** + * Return the id of the viewer to which this configuration is + * associated. + * @return the id of the viewer to which this configuration is + * associated + * @since 3.2 + */ + String getViewerId(); } |