/** * <copyright> * * Copyright (c) 2013-2014 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.util; import java.util.Collection; import org.eclipse.emf.diffmerge.api.IComparison; import org.eclipse.emf.diffmerge.api.Role; import org.eclipse.emf.diffmerge.ui.EMFDiffMergeUIPlugin; import org.eclipse.emf.diffmerge.ui.Messages; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; /** * A dialog for indicating the inconsistencies of a comparison. * @author Olivier Constant */ public class InconsistencyDialog extends MessageDialog { /** The non-null comparison */ protected final IComparison _comparison; /** * Constructor * @param shell_p a non-null shell * @param comparison_p a non-null comparison */ public InconsistencyDialog(Shell shell_p, IComparison comparison_p) { super(shell_p, EMFDiffMergeUIPlugin.LABEL, null, Messages.InconsistencyDialog_DuplicateIDs, MessageDialog.WARNING, new String[] { IDialogConstants.OK_LABEL }, 0); _comparison = comparison_p; setShellStyle(getShellStyle() | SWT.RESIZE); } /** * Copy the selection of the given viewer into the clipboard, as text * @param viewer_p a non-null viewer */ protected void copySelectionAsText(final StructuredViewer viewer_p) { ISelection selection = viewer_p.getSelection(); if (selection != null && selection instanceof IStructuredSelection && !selection.isEmpty()) { IBaseLabelProvider blp = viewer_p.getLabelProvider(); if (blp instanceof ILabelProvider) { ILabelProvider lp = (ILabelProvider)blp; StringBuilder builder = new StringBuilder(); boolean first = true; for (Object selected : ((IStructuredSelection)selection).toList()) { if (selected != null) { String label = lp.getText(selected); if (label != null) { if (first) first = false; else builder.append('\n'); builder.append(label); } } } copyTextToClipboard(builder.toString(), viewer_p.getControl().getDisplay()); } } } /** * Copy the given text into the clipboard for the given display * @param text_p a non-null string * @param display_p a non-null display */ protected void copyTextToClipboard(String text_p, Display display_p) { Clipboard clipboard = new Clipboard(display_p); Transfer[] transfers = new Transfer[]{TextTransfer.getInstance()}; Object[] data = new Object[] {text_p}; clipboard.setContents(data, transfers); clipboard.dispose(); } /** * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite) */ @Override protected Control createCustomArea(final Composite parent_p) { Composite result = new Composite(parent_p, SWT.NONE); result.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); result.setLayout(new GridLayout(1, false)); for (Role role : Role.values()) { Collection<Object> duplicates = _comparison.getDuplicateMatchIDs(role); if (!duplicates.isEmpty()) createDuplicateArea(result, role, duplicates); } return result; } /** * Create and return a menu item for copying the labels in the given viewer * @param viewer_p a non-null viewer * @return a non-null menu item */ protected MenuItem createCopyMenuItem(final StructuredViewer viewer_p) { Menu menu = new Menu(viewer_p.getControl()); final MenuItem result = new MenuItem(menu, SWT.PUSH); result.setText(Messages.InconsistencyDialog_CopyID); result.setImage(PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_TOOL_COPY)); viewer_p.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(); boolean enable = selection instanceof IStructuredSelection && !selection.isEmpty(); result.setEnabled(enable); } }); result.addSelectionListener(new SelectionAdapter() { /** * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e_p) { copySelectionAsText(viewer_p); } }); viewer_p.getControl().setMenu(menu); return result; } /** * Create and return the area where duplicates for the given role as provided in * the given collection are displayed * @param parent_p a non-null composite * @param role_p a non-null role * @param duplicates_p a non-null set of objects */ protected Control createDuplicateArea(Composite parent_p, Role role_p, Collection<Object> duplicates_p) { Group group = new Group(parent_p, SWT.NONE); group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); group.setLayout(new GridLayout(1, false)); String scopeName = (role_p == Role.ANCESTOR)? Messages.InconsistencyDialog_AncestorScope: (role_p == Role.REFERENCE)? Messages.InconsistencyDialog_ReferenceScope: Messages.InconsistencyDialog_TargetScope; group.setText(scopeName); StructuredViewer viewer = new ListViewer( group, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.MULTI); viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer.setContentProvider(new ArrayContentProvider()); viewer.setSorter(new ViewerSorter()); createCopyMenuItem(viewer); viewer.setInput(duplicates_p.toArray()); return group; } }