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
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
;
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
;
75 * Allows us to know if the {@link #initToolbar(AbstractTreeViewer, INavigatable)} step has been executed.
77 private boolean doOnce
;
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
) {
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
);
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
144 toolbarManager
.add(filterActionMenu
);
145 filterActionMenu
.updateMenu(compareConfiguration
.getComparisonScope(), compareConfiguration
147 toolbarManager
.add(new Separator());
148 toolbarManager
.add(new SaveComparisonModelAction(compareConfiguration
));
150 toolbarManager
.update(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
);
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
);
172 public void dispose() {
173 toolbarManager
.removeAll();
174 compareConfiguration
.getEventBus().unregister(this);
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
);
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());
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
);
217 public void comparisonAndScopeChange(final IComparisonAndScopeChange event
) {
218 SWTUtil
.safeAsyncExec(new Runnable() {
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.
233 * Set to <code>true</code> to enable, <code>false</code> otherwise.
235 public void setEnabled(boolean enable
) {
236 toolbarManager
.getControl().setEnabled(enable
);