Revert "DRAFT - Intermediate Proxies Resolution"
[EMFCompare2.git] / plugins / org.eclipse.emf.compare.ide.ui / src / org / eclipse / emf / compare / ide / ui / internal / structuremergeviewer / CompareToolBar.java
blobabc0c5892e807708233e96cfcd1ff4db3a387097
1 /*******************************************************************************
2 * Copyright (c) 2013, 2014 Obeo.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Obeo - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer;
13 import static com.google.common.base.Predicates.instanceOf;
14 import static com.google.common.collect.Iterables.any;
15 import static com.google.common.collect.Lists.newArrayListWithCapacity;
17 import com.google.common.eventbus.Subscribe;
19 import java.util.EnumSet;
20 import java.util.List;
22 import org.eclipse.compare.INavigatable;
23 import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
24 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.CollapseAllModelAction;
25 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.DropDownMergeMenuAction;
26 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.ExpandAllModelAction;
27 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.MergeAction;
28 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.MergeAllNonConflictingAction;
29 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SaveComparisonModelAction;
30 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SelectNextDiffAction;
31 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SelectPreviousDiffAction;
32 import org.eclipse.emf.compare.internal.merge.MergeMode;
33 import org.eclipse.emf.compare.merge.IMerger;
34 import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
35 import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
36 import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEditingDomainChange;
37 import org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange;
38 import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration;
39 import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.actions.FilterActionMenu;
40 import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.actions.GroupActionMenu;
41 import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter;
42 import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.CascadingDifferencesFilter;
43 import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.StructureMergeViewerGrouper;
44 import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
45 import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.IDifferenceFilterChange;
46 import org.eclipse.jface.action.Separator;
47 import org.eclipse.jface.action.ToolBarManager;
48 import org.eclipse.jface.viewers.AbstractTreeViewer;
49 import org.eclipse.jface.viewers.ISelectionChangedListener;
50 import org.eclipse.jface.viewers.SelectionChangedEvent;
51 import org.eclipse.swt.events.DisposeEvent;
52 import org.eclipse.swt.events.DisposeListener;
53 import org.eclipse.ui.PlatformUI;
54 import org.eclipse.ui.menus.IMenuService;
55 import org.eclipse.ui.services.IServiceLocator;
57 /**
58 * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
60 public class CompareToolBar implements ISelectionChangedListener {
62 private final GroupActionMenu groupActionMenu;
64 private final FilterActionMenu filterActionMenu;
66 private final List<MergeAction> mergeActions;
68 private final List<MergeAllNonConflictingAction> mergeAllNonConflictingActions;
70 private final EMFCompareConfiguration compareConfiguration;
72 private final ToolBarManager toolbarManager;
74 /**
75 * Allows us to know if the {@link #initToolbar(AbstractTreeViewer, INavigatable)} step has been executed.
77 private boolean doOnce;
79 /**
82 public CompareToolBar(ToolBarManager toolbarManager, StructureMergeViewerGrouper viewerGrouper,
83 StructureMergeViewerFilter viewerFilter, EMFCompareConfiguration compareConfiguration) {
84 this.toolbarManager = toolbarManager;
85 this.compareConfiguration = compareConfiguration;
86 mergeActions = newArrayListWithCapacity(2);
87 mergeAllNonConflictingActions = newArrayListWithCapacity(2);
89 groupActionMenu = new GroupActionMenu(viewerGrouper, EMFCompareRCPUIPlugin.getDefault()
90 .getDifferenceGroupProviderRegistry());
92 filterActionMenu = new FilterActionMenu(viewerFilter, EMFCompareRCPUIPlugin.getDefault()
93 .getDifferenceFilterRegistry());
96 public final void initToolbar(AbstractTreeViewer viewer, INavigatable nav) {
97 if (!this.doOnce) {
98 compareConfiguration.getEventBus().register(this);
100 // Add extension point contributions to the structure merge viewer toolbar
101 IServiceLocator workbench = PlatformUI.getWorkbench();
103 final IMenuService menuService = (IMenuService)workbench.getService(IMenuService.class);
104 if (menuService != null) {
105 menuService.populateContributionManager(toolbarManager,
106 "toolbar:org.eclipse.emf.compare.structuremergeviewer.toolbar"); //$NON-NLS-1$
107 toolbarManager.getControl().addDisposeListener(new DisposeListener() {
108 public void widgetDisposed(DisposeEvent e) {
109 menuService.releaseContributions(toolbarManager);
114 boolean leftEditable = compareConfiguration.isLeftEditable();
115 boolean rightEditable = compareConfiguration.isRightEditable();
117 final EnumSet<MergeMode> modes;
118 if (rightEditable && leftEditable) {
119 modes = EnumSet.of(MergeMode.RIGHT_TO_LEFT, MergeMode.LEFT_TO_RIGHT);
120 } else {
121 modes = EnumSet.of(MergeMode.ACCEPT, MergeMode.REJECT);
124 if (rightEditable || leftEditable) {
125 toolbarManager.add(new DropDownMergeMenuAction(compareConfiguration, modes));
126 for (MergeMode mode : modes) {
127 toolbarManager.add(createMergeAction(mode, compareConfiguration, nav));
129 for (MergeMode mode : modes) {
130 toolbarManager.add(createMergeAllNonConflictingAction(mode, compareConfiguration));
134 toolbarManager.add(new Separator());
135 toolbarManager.add(new SelectNextDiffAction(nav));
136 toolbarManager.add(new SelectPreviousDiffAction(nav));
137 toolbarManager.add(new Separator());
138 toolbarManager.add(new ExpandAllModelAction(viewer));
139 toolbarManager.add(new CollapseAllModelAction(viewer));
140 toolbarManager.add(new Separator());
141 toolbarManager.add(groupActionMenu);
142 groupActionMenu.updateMenu(compareConfiguration.getComparisonScope(), compareConfiguration
143 .getComparison());
144 toolbarManager.add(filterActionMenu);
145 filterActionMenu.updateMenu(compareConfiguration.getComparisonScope(), compareConfiguration
146 .getComparison());
147 toolbarManager.add(new Separator());
148 toolbarManager.add(new SaveComparisonModelAction(compareConfiguration));
150 toolbarManager.update(true);
152 this.doOnce = true;
156 private MergeAction createMergeAction(MergeMode mergeMode, EMFCompareConfiguration cc, INavigatable nav) {
157 IMerger.Registry mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry();
158 MergeAction mergeAction = new MergeAction(cc.getEditingDomain(), mergerRegistry, mergeMode, cc
159 .isLeftEditable(), cc.isRightEditable(), nav);
160 mergeActions.add(mergeAction);
161 return mergeAction;
164 private MergeAction createMergeAllNonConflictingAction(MergeMode mergeMode, IEMFCompareConfiguration cc) {
165 IMerger.Registry mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry();
166 MergeAllNonConflictingAction mergeAction = new MergeAllNonConflictingAction(cc.getEditingDomain(), cc
167 .getComparison(), mergerRegistry, mergeMode, cc.isLeftEditable(), cc.isRightEditable());
168 mergeAllNonConflictingActions.add(mergeAction);
169 return mergeAction;
172 public void dispose() {
173 toolbarManager.removeAll();
174 compareConfiguration.getEventBus().unregister(this);
175 this.doOnce = false;
179 * {@inheritDoc}
181 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
183 public void selectionChanged(SelectionChangedEvent event) {
184 // forward event to merge actions
186 for (MergeAction mergeAction : mergeActions) {
187 mergeAction.selectionChanged(event);
189 for (MergeAllNonConflictingAction mergeAllNonConflictingAction : mergeAllNonConflictingActions) {
190 mergeAllNonConflictingAction.selectionChanged(event);
194 @Subscribe
195 public void editingDomainChange(ICompareEditingDomainChange event) {
196 for (MergeAction mergeAction : mergeActions) {
197 mergeAction.setEditingDomain(event.getNewValue());
199 for (MergeAction mergeAction : mergeAllNonConflictingActions) {
200 mergeAction.setEditingDomain(event.getNewValue());
204 @Subscribe
205 public void selectedDifferenceFiltersChange(IDifferenceFilterChange event) {
206 final boolean enabled = any(event.getSelectedDifferenceFilters(),
207 instanceOf(CascadingDifferencesFilter.class));
208 for (MergeAction mergeAction : mergeActions) {
209 mergeAction.setCascadingDifferencesFilterEnabled(enabled);
211 for (MergeAction mergeAction : mergeAllNonConflictingActions) {
212 mergeAction.setCascadingDifferencesFilterEnabled(enabled);
216 @Subscribe
217 public void comparisonAndScopeChange(final IComparisonAndScopeChange event) {
218 SWTUtil.safeAsyncExec(new Runnable() {
219 public void run() {
220 filterActionMenu.updateMenu(event.getNewScope(), event.getNewComparison());
221 groupActionMenu.updateMenu(event.getNewScope(), event.getNewComparison());
224 for (MergeAllNonConflictingAction mergeAction : mergeAllNonConflictingActions) {
225 mergeAction.setComparison(event.getNewComparison());
230 * Enables or disables the toolbar.
232 * @param enable
233 * Set to <code>true</code> to enable, <code>false</code> otherwise.
235 public void setEnabled(boolean enable) {
236 toolbarManager.getControl().setEnabled(enable);