/**
* <copyright>
*
* Copyright (c) 2013-2016 Thales Global Services S.A.S.
* 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:
* Thales Global Services S.A.S. - initial API and implementation
*
* </copyright>
*/
package org.eclipse.emf.diffmerge.ui.specification.ext;
import org.eclipse.emf.diffmerge.api.IDiffPolicy;
import org.eclipse.emf.diffmerge.api.IMatchPolicy;
import org.eclipse.emf.diffmerge.impl.policies.ConfigurableDiffPolicy;
import org.eclipse.emf.diffmerge.impl.policies.ConfigurableMatchPolicy;
import org.eclipse.emf.diffmerge.impl.policies.ConfigurableMatchPolicy.MatchCriterionKind;
import org.eclipse.emf.diffmerge.impl.policies.DefaultMatchPolicy;
import org.eclipse.emf.diffmerge.ui.specification.IModelScopeDefinition;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
/**
* A configurable multi-criteria comparison method.
* @author Olivier Constant
*/
public class ConfigurableComparisonMethod extends DefaultComparisonMethod {
/** The initially null last configuration for the comparison method */
protected static ConfigureComparisonDialog.ComparisonMethodConfigurationData __lastConfiguration = null;
/**
* Constructor
* @param leftScopeSpec_p a non-null scope specification
* @param rightScopeSpec_p a non-null scope specification
* @param ancestorScopeSpec_p an optional scope specification
*/
public ConfigurableComparisonMethod(IModelScopeDefinition leftScopeSpec_p,
IModelScopeDefinition rightScopeSpec_p, IModelScopeDefinition ancestorScopeSpec_p) {
super(leftScopeSpec_p, rightScopeSpec_p, ancestorScopeSpec_p);
update(__lastConfiguration);
}
/**
* @see org.eclipse.emf.diffmerge.ui.specification.ext.DefaultComparisonMethod#configure()
*/
@Override
public void configure() {
Shell shell = getShell();
if (shell != null) {
ConfigureComparisonDialog.ComparisonMethodConfigurationData data =
new ConfigureComparisonDialog.ComparisonMethodConfigurationData(this);
int confirmed = new ConfigureComparisonDialog(shell, data).open();
if (Window.OK == confirmed)
configurationConfirmed(data);
}
}
/**
* Handle the confirmation of the given configuration
* @param data_p a non-null object
*/
protected void configurationConfirmed(ConfigureComparisonDialog.ComparisonMethodConfigurationData data_p) {
update(data_p);
__lastConfiguration = data_p;
}
/**
* @see org.eclipse.emf.diffmerge.ui.specification.ext.DefaultComparisonMethod#createDiffPolicy()
*/
@Override
protected IDiffPolicy createDiffPolicy() {
return new ConfigurableDiffPolicy();
}
/**
* @see org.eclipse.emf.diffmerge.ui.specification.ext.DefaultComparisonMethod#createMatchPolicy()
*/
@Override
protected IMatchPolicy createMatchPolicy() {
return new ConfigurableMatchPolicy();
}
/**
* Return a shell if available
* @return a potentially null shell (always null if current thread is not the UI thread)
*/
public Shell getShell() {
Shell result;
try {
result = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
} catch (Exception e) {
result = null;
}
return result;
}
/**
* @see org.eclipse.emf.diffmerge.ui.specification.ext.DefaultComparisonMethod#isConfigurable()
*/
@Override
public boolean isConfigurable() {
return true;
}
/**
* Update this comparison method according to the given configuration
* @param data_p a potentially null configuration
*/
protected void update(ConfigureComparisonDialog.ComparisonMethodConfigurationData data_p) {
if (data_p == null) return;
// Match policy
IMatchPolicy matchPolicy = getMatchPolicy();
if (matchPolicy instanceof DefaultMatchPolicy)
((DefaultMatchPolicy)matchPolicy).setKeepMatchIDs(data_p.isKeepMatchIDs());
if (matchPolicy instanceof ConfigurableMatchPolicy) {
ConfigurableMatchPolicy cMatchPolicy = (ConfigurableMatchPolicy)matchPolicy;
for (MatchCriterionKind criterion : cMatchPolicy.getApplicableCriteria()) {
cMatchPolicy.setUseMatchCriterion(
criterion, data_p.useMatchCriterion(criterion));
}
}
// Diff Policy
IDiffPolicy diffPolicy = getDiffPolicy();
if (diffPolicy instanceof ConfigurableDiffPolicy) {
ConfigurableDiffPolicy cDiffPolicy = (ConfigurableDiffPolicy)diffPolicy;
cDiffPolicy.setIgnoreOrders(data_p.isIgnoreOrders());
}
}
}