/**
* <copyright>
*
* Copyright (c) 2010-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.setup;
import static org.eclipse.emf.diffmerge.ui.setup.ComparisonSetup.PROPERTY_COMPARISON_METHOD;
import org.eclipse.emf.diffmerge.api.Role;
import org.eclipse.emf.diffmerge.ui.EMFDiffMergeUIPlugin;
import org.eclipse.emf.diffmerge.ui.EMFDiffMergeUIPlugin.ImageID;
import org.eclipse.emf.diffmerge.ui.Messages;
import org.eclipse.emf.diffmerge.ui.specification.IComparisonMethod;
import org.eclipse.emf.diffmerge.ui.specification.IComparisonMethodFactory;
import org.eclipse.emf.diffmerge.ui.specification.IModelScopeDefinition;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* The wizard page for setting up a comparison.
* @author Olivier Constant
*/
public class ComparisonSetupWizardPage extends WizardPage {
/** The non-null data object for the wizard */
final protected ComparisonSetup _setup;
/**
* Constructor
* @param name_p the non-null name of the page
* @param setup_p a non-null data object for the wizard
*/
public ComparisonSetupWizardPage(String name_p, ComparisonSetup setup_p) {
super(name_p);
_setup = setup_p;
}
/**
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent_p) {
setTitle(Messages.ComparisonSetupWizardPage_Title);
setDescription(Messages.ComparisonSetupWizardPage_Description);
// Main composite
Composite composite = new Composite(parent_p, SWT.NONE);
setControl(composite);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
composite.setLayout(new GridLayout(1, false));
// Sections
createRolesSection(composite);
createComparisonMethodSection(composite);
// Init
_setup.swapScopeDefinitions(Role.TARGET, Role.TARGET);
Point size = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
((GridData)parent_p.getLayoutData()).heightHint = size.y + 5;
}
/**
* Create the section for selecting the comparison method
* @param parent_p a non-null composite
*/
protected void createComparisonMethodSection(Composite parent_p) {
// Group
Group group = new Group(parent_p, SWT.NONE);
group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
group.setLayout(new GridLayout(1, false));
group.setText(Messages.ComparisonSetupWizardPage_GroupMethod);
// Widgets and viewers
ComboViewer methodViewer = createComparisonMethodViewer(group);
createConfigureMethodButton(group);
// Init
methodViewer.setInput(_setup);
Object first = methodViewer.getElementAt(0);
IStructuredSelection viewerSelection;
if (first != null)
viewerSelection = new StructuredSelection(first);
else
viewerSelection = new StructuredSelection();
methodViewer.setSelection(viewerSelection);
}
/**
* Create and return a button for configuring the comparison method
* @param parent_p a non-null composite
* @return a non-null button
*/
protected Button createConfigureMethodButton(Composite parent_p) {
final Button result = new Button(parent_p, SWT.PUSH);
result.setText(Messages.ComparisonSetupWizardPage_ConfigureButton);
result.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
result.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e_p) {
IComparisonMethod method = _setup.getComparisonMethod();
if (method != null)
method.configure();
}
});
_setup.addPropertyChangeListener(new IPropertyChangeListener() {
/**
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event_p) {
if (PROPERTY_COMPARISON_METHOD.equals(event_p.getProperty())) {
IComparisonMethod method = _setup.getComparisonMethod();
result.setEnabled(method != null && method.isConfigurable());
}
}
});
return result;
}
/**
* Create and return a viewer for selecting the comparison method
* @param parent_p a non-null composite
* @return a non-null viewer
*/
protected ComboViewer createComparisonMethodViewer(Composite parent_p) {
final ComboViewer result = new ComboViewer(parent_p);
result.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
// Behavior
result.setContentProvider(new IStructuredContentProvider() {
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// Nothing to do
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
// Nothing to do
}
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement_p) {
Object[] localResult = new Object[0];
if (inputElement_p instanceof ComparisonSetup) {
ComparisonSetup selection =
(ComparisonSetup)inputElement_p;
localResult = selection.getApplicableComparisonMethodFactories().toArray();
}
return localResult;
}
});
result.setLabelProvider(new LabelProvider() {
/**
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element_p) {
String localResult;
if (element_p instanceof IComparisonMethodFactory) {
IComparisonMethodFactory factory = (IComparisonMethodFactory)element_p;
localResult = factory.getLabel();
} else {
localResult = super.getText(element_p);
}
return localResult;
}
});
result.setSorter(new ViewerSorter());
result.addSelectionChangedListener(new ISelectionChangedListener() {
/**
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event_p) {
ISelection selection = event_p.getSelection();
if (selection instanceof IStructuredSelection) {
Object selected = ((IStructuredSelection)selection).getFirstElement();
if (selected instanceof IComparisonMethodFactory)
_setup.setSelectedFactory((IComparisonMethodFactory)selected);
}
}
});
return result;
}
/**
* Create the subsection for setting the reference role in a two-way comparison
* @param parent_p a non-null composite
*/
protected void createReferenceRoleSubsection(Composite parent_p) {
if (!_setup.isThreeWay()) {
// Composite
Composite composite = new Composite(parent_p, SWT.NONE);
GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, true);
composite.setLayoutData(gridData);
GridLayout layout = new GridLayout(4, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.marginTop = 2;
composite.setLayout(layout);
// Label
Label label = new Label(composite, SWT.NONE);
label.setText(Messages.ComparisonSetupWizardPage_ReferenceRole);
label.setToolTipText(Messages.ComparisonSetupWizardPage_ReferenceRoleTooltip);
// None
final Button noneButton = new Button(composite, SWT.RADIO);
noneButton.setText(Messages.ComparisonSetupWizardPage_ReferenceNone);
noneButton.setSelection(_setup.getTwoWayReferenceRole() == null);
noneButton.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e_p) {
_setup.setTwoWayReferenceRole(null);
}
});
noneButton.setEnabled(noneButton.getSelection() || _setup.canChangeTwoWayReferenceRole());
// Left
final Button leftButton = new Button(composite, SWT.RADIO);
leftButton.setText(Messages.ComparisonSetupWizardPage_ReferenceLeft);
leftButton.setSelection(
_setup.getTwoWayReferenceRole() == EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole());
leftButton.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e_p) {
_setup.setTwoWayReferenceRole(
EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole());
}
});
leftButton.setEnabled(leftButton.getSelection() || _setup.canChangeTwoWayReferenceRole());
// Right
final Button rightButton = new Button(composite, SWT.RADIO);
rightButton.setText(Messages.ComparisonSetupWizardPage_ReferenceRight);
rightButton.setSelection(
_setup.getTwoWayReferenceRole() == EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole().opposite());
rightButton.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e_p) {
_setup.setTwoWayReferenceRole(
EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole().opposite());
}
});
rightButton.setEnabled(rightButton.getSelection() || _setup.canChangeTwoWayReferenceRole());
}
}
/**
* Create the section for selecting the roles
* @param parent_p a non-null composite
*/
protected void createRolesSection(Composite parent_p) {
// Group
Group group = new Group(parent_p, SWT.NONE);
group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
group.setLayout(new GridLayout(2, false));
group.setText(Messages.ComparisonSetupWizardPage_GroupRoles);
// Subsections
createRolesSubsection(group);
createSwapRolesSubsection(group);
createReferenceRoleSubsection(group);
}
/**
* Create the subsection for the given role
* @param parent_p a non-null composite
* @param role_p a non-null role
*/
protected void createRoleSubsection(Composite parent_p, final Role role_p) {
final boolean isAncestor = role_p == Role.ANCESTOR;
// Label
String labelText = (role_p == Role.ANCESTOR)? Messages.ComparisonSetupWizardPage_RoleAncestor:
(role_p == EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole())?
Messages.ComparisonSetupWizardPage_RoleLeft:
Messages.ComparisonSetupWizardPage_RoleRight;
new Label(parent_p, SWT.NONE).setText(labelText);
// Row composite
Composite composite = new Composite(parent_p, SWT.BORDER);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
composite.setLayout(layout);
// Text
final Text roleText = new Text(composite, SWT.READ_ONLY | SWT.NONE);
roleText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
_setup.addPropertyChangeListener(new IPropertyChangeListener() {
/**
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event_p) {
if (ComparisonSetup.PROPERTY_ROLES.equals(event_p.getProperty())) {
IModelScopeDefinition scope = _setup.getScopeDefinition(role_p);
roleText.setText(scope.getLabel());
}
}
});
// "Modifiable" button
final Button editableButton = new Button(composite, SWT.CHECK);
editableButton.setText(Messages.ComparisonSetupWizardPage_ModifiableScope);
editableButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
final IModelScopeDefinition scopeDef = _setup.getScopeDefinition(role_p);
editableButton.setEnabled(!isAncestor && scopeDef.isEditableSettable());
editableButton.setSelection(scopeDef.isEditable());
editableButton.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e_p) {
IModelScopeDefinition currentScopeDef = _setup.getScopeDefinition(role_p);
currentScopeDef.setEditable(!currentScopeDef.isEditable());
}
});
_setup.addPropertyChangeListener(new IPropertyChangeListener() {
/**
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event_p) {
if (ComparisonSetup.PROPERTY_ROLES.equals(event_p.getProperty())) {
IModelScopeDefinition currentScopeDef = _setup.getScopeDefinition(role_p);
editableButton.setEnabled(!isAncestor && currentScopeDef.isEditableSettable());
editableButton.setSelection(currentScopeDef.isEditable());
}
}
});
}
/**
* Create the subsection for choosing roles
* @param parent_p a non-null composite
*/
protected void createRolesSubsection(Composite parent_p) {
// Composite
Composite subsection = new Composite(parent_p, SWT.NONE);
subsection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
GridLayout rolesLayout = new GridLayout(2, false);
rolesLayout.marginHeight = 0;
rolesLayout.marginWidth = 0;
subsection.setLayout(rolesLayout);
// Role rows
createRoleSubsection(subsection, EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole());
createRoleSubsection(subsection, EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole().opposite());
if (_setup.isThreeWay())
createRoleSubsection(subsection, Role.ANCESTOR);
}
/**
* Create the subsection for swapping roles
* @param parent_p a non-null composite
*/
protected void createSwapRolesSubsection(Composite parent_p) {
// Composite
Composite buttonSubsection = new Composite(parent_p, SWT.NONE);
buttonSubsection.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false));
RowLayout buttonLayout = new RowLayout(SWT.VERTICAL);
buttonLayout.justify = true;
buttonSubsection.setLayout(buttonLayout);
if (_setup.canSwapScopeDefinitions()) {
// Left/right swap button
final Button leftRightSwap = new Button(buttonSubsection, SWT.PUSH);
leftRightSwap.setImage(EMFDiffMergeUIPlugin.getDefault().getImage(ImageID.SWAP));
leftRightSwap.setToolTipText(Messages.ComparisonSetupWizardPage_SwapLeftRight);
leftRightSwap.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent event_p) {
_setup.swapScopeDefinitions(
EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole(), Role.REFERENCE);
}
});
if (_setup.isThreeWay()) {
// Right/ancestor swap button
final Button rightAnSwap = new Button(buttonSubsection, SWT.PUSH);
rightAnSwap.setImage(EMFDiffMergeUIPlugin.getDefault().getImage(ImageID.SWAP));
rightAnSwap.setToolTipText(Messages.ComparisonSetupWizardPage_SwapRightAncestor);
rightAnSwap.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent event_p) {
_setup.swapScopeDefinitions(
EMFDiffMergeUIPlugin.getDefault().getDefaultLeftRole().opposite(), Role.ANCESTOR);
}
});
}
}
}
}