blob: b11408bd241061fcd15c58ccc8a099cc74550b69 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2014 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer;
import static com.google.common.base.Predicates.instanceOf;
import static com.google.common.collect.Iterables.any;
import static com.google.common.collect.Lists.newArrayListWithCapacity;
import com.google.common.eventbus.Subscribe;
import java.util.EnumSet;
import java.util.List;
import org.eclipse.compare.INavigatable;
import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.CollapseAllModelAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.DropDownMergeMenuAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.ExpandAllModelAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.MergeAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.MergeAllNonConflictingAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SaveComparisonModelAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SelectNextDiffAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SelectPreviousDiffAction;
import org.eclipse.emf.compare.internal.merge.MergeMode;
import org.eclipse.emf.compare.merge.IMerger;
import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEditingDomainChange;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.actions.FilterActionMenu;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.actions.GroupActionMenu;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.CascadingDifferencesFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.StructureMergeViewerGrouper;
import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.IDifferenceFilterChange;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.menus.IMenuService;
import org.eclipse.ui.services.IServiceLocator;
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
public class CompareToolBar implements ISelectionChangedListener {
private final GroupActionMenu groupActionMenu;
private final FilterActionMenu filterActionMenu;
private final List<MergeAction> mergeActions;
private final List<MergeAllNonConflictingAction> mergeAllNonConflictingActions;
private final EMFCompareConfiguration compareConfiguration;
private final ToolBarManager toolbarManager;
/**
* Allows us to know if the {@link #initToolbar(AbstractTreeViewer, INavigatable)} step has been executed.
*/
private boolean doOnce;
/**
*
*/
public CompareToolBar(ToolBarManager toolbarManager, StructureMergeViewerGrouper viewerGrouper,
StructureMergeViewerFilter viewerFilter, EMFCompareConfiguration compareConfiguration) {
this.toolbarManager = toolbarManager;
this.compareConfiguration = compareConfiguration;
this.doOnce = false;
mergeActions = newArrayListWithCapacity(2);
mergeAllNonConflictingActions = newArrayListWithCapacity(2);
groupActionMenu = new GroupActionMenu(viewerGrouper, EMFCompareRCPUIPlugin.getDefault()
.getDifferenceGroupProviderRegistry());
filterActionMenu = new FilterActionMenu(viewerFilter, EMFCompareRCPUIPlugin.getDefault()
.getDifferenceFilterRegistry());
}
public final void initToolbar(AbstractTreeViewer viewer, INavigatable nav) {
if (!this.doOnce) {
compareConfiguration.getEventBus().register(this);
// Add extension point contributions to the structure merge viewer toolbar
IServiceLocator workbench = PlatformUI.getWorkbench();
IMenuService menuService = (IMenuService)workbench.getService(IMenuService.class);
if (menuService != null) {
menuService.populateContributionManager(toolbarManager,
"toolbar:org.eclipse.emf.compare.structuremergeviewer.toolbar"); //$NON-NLS-1$
}
boolean leftEditable = compareConfiguration.isLeftEditable();
boolean rightEditable = compareConfiguration.isRightEditable();
final EnumSet<MergeMode> modes;
if (rightEditable && leftEditable) {
modes = EnumSet.of(MergeMode.RIGHT_TO_LEFT, MergeMode.LEFT_TO_RIGHT);
} else {
modes = EnumSet.of(MergeMode.ACCEPT, MergeMode.REJECT);
}
if (rightEditable || leftEditable) {
toolbarManager.add(new DropDownMergeMenuAction(compareConfiguration, modes));
for (MergeMode mode : modes) {
toolbarManager.add(createMergeAction(mode, compareConfiguration, nav));
}
for (MergeMode mode : modes) {
toolbarManager.add(createMergeAllNonConflictingAction(mode, compareConfiguration));
}
}
toolbarManager.add(new Separator());
toolbarManager.add(new SelectNextDiffAction(nav));
toolbarManager.add(new SelectPreviousDiffAction(nav));
toolbarManager.add(new Separator());
toolbarManager.add(new ExpandAllModelAction(viewer));
toolbarManager.add(new CollapseAllModelAction(viewer));
toolbarManager.add(new Separator());
toolbarManager.add(groupActionMenu);
groupActionMenu.updateMenu(compareConfiguration.getComparisonScope(), compareConfiguration
.getComparison());
toolbarManager.add(filterActionMenu);
filterActionMenu.updateMenu(compareConfiguration.getComparisonScope(), compareConfiguration
.getComparison());
toolbarManager.add(new Separator());
toolbarManager.add(new SaveComparisonModelAction(compareConfiguration));
toolbarManager.update(true);
this.doOnce = true;
}
}
private MergeAction createMergeAction(MergeMode mergeMode, EMFCompareConfiguration cc, INavigatable nav) {
IMerger.Registry mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry();
MergeAction mergeAction = new MergeAction(cc.getEditingDomain(), mergerRegistry, mergeMode, cc
.isLeftEditable(), cc.isRightEditable(), nav);
mergeActions.add(mergeAction);
return mergeAction;
}
private MergeAction createMergeAllNonConflictingAction(MergeMode mergeMode, IEMFCompareConfiguration cc) {
IMerger.Registry mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry();
MergeAllNonConflictingAction mergeAction = new MergeAllNonConflictingAction(cc.getEditingDomain(), cc
.getComparison(), mergerRegistry, mergeMode, cc.isLeftEditable(), cc.isRightEditable());
mergeAllNonConflictingActions.add(mergeAction);
return mergeAction;
}
public void dispose() {
toolbarManager.removeAll();
compareConfiguration.getEventBus().unregister(this);
this.doOnce = false;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
// forward event to merge actions
for (MergeAction mergeAction : mergeActions) {
mergeAction.selectionChanged(event);
}
for (MergeAllNonConflictingAction mergeAllNonConflictingAction : mergeAllNonConflictingActions) {
mergeAllNonConflictingAction.selectionChanged(event);
}
}
@Subscribe
public void editingDomainChange(ICompareEditingDomainChange event) {
for (MergeAction mergeAction : mergeActions) {
mergeAction.setEditingDomain(event.getNewValue());
}
for (MergeAction mergeAction : mergeAllNonConflictingActions) {
mergeAction.setEditingDomain(event.getNewValue());
}
}
@Subscribe
public void selectedDifferenceFiltersChange(IDifferenceFilterChange event) {
final boolean enabled = any(event.getSelectedDifferenceFilters(),
instanceOf(CascadingDifferencesFilter.class));
for (MergeAction mergeAction : mergeActions) {
mergeAction.setCascadingDifferencesFilterEnabled(enabled);
}
}
@Subscribe
public void comparisonAndScopeChange(final IComparisonAndScopeChange event) {
SWTUtil.safeAsyncExec(new Runnable() {
public void run() {
filterActionMenu.updateMenu(event.getNewScope(), event.getNewComparison());
groupActionMenu.updateMenu(event.getNewScope(), event.getNewComparison());
}
});
for (MergeAllNonConflictingAction mergeAction : mergeAllNonConflictingActions) {
mergeAction.setComparison(event.getNewComparison());
}
}
}