/******************************************************************************* * Copyright (c) 2012, 2014 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.impl; import org.eclipse.emf.compare.FeatureMapChange; import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.IStructuralFeatureAccessor; import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareRCPUIMessages; import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration; import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.impl.FeatureMapKeyChangeAccessorImpl; import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.impl.ResourceContentsAccessorImpl; import org.eclipse.emf.compare.rcp.ui.mergeviewer.ICompareColor; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.FeatureMap; import org.eclipse.jface.viewers.ContentViewer; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; 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.Label; /** * A concrete implementation of {@link AbstractTableOrTreeMergeViewer} for TableViewer. * * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a> * @since 4.0 */ public class TableMergeViewer extends AbstractTableOrTreeMergeViewer { /** The TableViewer. */ private TableViewer fTableViewer; /** The InfoViewer. */ private InfoViewer fInfoViewer; /** * Default constructor. * * @param parent * the parent widget of this viewer. * @param side * the side of this viewer. * @param colorProvider * the color provider to use with this viewer. * @param compareConfiguration * the compare configuration object to use with this viewer. */ public TableMergeViewer(Composite parent, MergeViewerSide side, ICompareColor.Provider colorProvider, IEMFCompareConfiguration compareConfiguration) { super(parent, side, colorProvider, compareConfiguration); } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.impl.AbstractMergeViewer#createControl(org.eclipse.swt.widgets.Composite) */ @Override protected Control createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, false); layout.marginLeft = -1; layout.marginRight = -1; layout.marginTop = -1; layout.marginBottom = 0; layout.horizontalSpacing = 0; layout.verticalSpacing = 0; layout.marginWidth = 0; layout.marginHeight = 0; composite.setLayout(layout); fInfoViewer = new InfoViewer(composite, getSide()); fInfoViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); fTableViewer = new TableViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); fTableViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); return composite; } public final int getVerticalOffset() { return fInfoViewer.getControl().getSize().y - 2; } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.rcp.ui.mergeviewer.impl.AbstractMergeViewer.ui.internal.contentmergeviewer.AbstractMergeViewer#getStructuredViewer() */ @Override public final TableViewer getStructuredViewer() { return fTableViewer; } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.impl.AbstractMergeViewer#setContentProvider(org.eclipse.jface.viewers.IContentProvider) */ @Override public void setContentProvider(IContentProvider contentProvider) { super.setContentProvider(contentProvider); fInfoViewer.setContentProvider(contentProvider); } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.impl.AbstractMergeViewer#setLabelProvider(org.eclipse.jface.viewers.IBaseLabelProvider) */ @Override public void setLabelProvider(IBaseLabelProvider labelProvider) { super.setLabelProvider(labelProvider); fInfoViewer.setLabelProvider(labelProvider); } @Override protected void hookDispose() { fTableViewer = null; fInfoViewer = null; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object, java.lang.Object) */ @Override protected void inputChanged(Object input, Object oldInput) { fTableViewer.setInput(input); fInfoViewer.setInput(input); ((Composite)getControl()).layout(true); } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.Viewer#refresh() */ @Override public void refresh() { fInfoViewer.refresh(); fTableViewer.refresh(); } /** * A content viewer is a model-based adapter on a widget which accesses its model by means of a content * provider and a label provider. This InfoViewer is the top part of the TableMergeViewer. It contains the * object an the feature concerned by the Diff. * * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a> * @since 4.0 */ private static class InfoViewer extends ContentViewer { /** The side of this viewer. */ private final MergeViewerSide fSide; /** The control associated with this viewer. */ private final Composite fControl; /** The Icon of the EObject concerned by the Diff. */ private final Label fEObjectIcon; /** The Label of the EObject concerned by the Diff. */ private final Label fEObjectLabel; /** The Icon of the feature concerned by the Diff. */ private final Label fFeatureIcon; /** The Label of the feature concerned by the Diff. */ private final Label fFeatureLabel; /** Stores the selection for this viewer. */ private ISelection fSelection; /** Stores the input of this viewer. */ private Object fInput; /** * Default constructor. * * @param parent * the parent widget of this viewer. * @param side * the side of this viewer. */ public InfoViewer(Composite parent, MergeViewerSide side) { this.fControl = new Composite(parent, SWT.BORDER); this.fSide = side; fControl.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); GridLayout layout = new GridLayout(3, false); layout.verticalSpacing = 0; layout.horizontalSpacing = 0; layout.marginLeft = 1; layout.marginHeight = 0; layout.marginWidth = 0; layout.marginBottom = 0; fControl.setLayout(layout); Composite eObjectComposite = new Composite(fControl, SWT.NONE); GridLayout eObjectCompositelayout = new GridLayout(2, false); eObjectCompositelayout.verticalSpacing = 0; eObjectCompositelayout.horizontalSpacing = 0; eObjectCompositelayout.marginLeft = 0; eObjectCompositelayout.marginHeight = 0; eObjectCompositelayout.marginWidth = 0; eObjectCompositelayout.marginBottom = 0; eObjectComposite.setLayout(eObjectCompositelayout); fEObjectIcon = new Label(eObjectComposite, SWT.NONE); fEObjectIcon.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); fEObjectLabel = new Label(eObjectComposite, SWT.NONE); fEObjectLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); eObjectComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 3, 1)); Label lblIn = new Label(fControl, SWT.NONE); lblIn.setText(" "); //$NON-NLS-1$ fFeatureIcon = new Label(fControl, SWT.NONE); fFeatureIcon.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); fFeatureLabel = new Label(fControl, SWT.NONE); fFeatureLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); hookControl(fControl); } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.Viewer#getControl() */ @Override public Control getControl() { return fControl; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object, java.lang.Object) */ @Override protected void inputChanged(Object input, Object oldInput) { fInput = input; fControl.setRedraw(false); try { refresh(); } finally { fControl.setRedraw(true); } } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.Viewer#getSelection() */ @Override public ISelection getSelection() { return fSelection; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.Viewer#refresh() */ @Override public void refresh() { if (fInput instanceof FeatureMapKeyChangeAccessorImpl) { FeatureMapKeyChangeAccessorImpl featureMapAccessor = (FeatureMapKeyChangeAccessorImpl)fInput; final FeatureMapChange diff = featureMapAccessor.getFeatureMapChange(); final FeatureMap.Entry entry = (FeatureMap.Entry)diff.getValue(); final Object entryValue = entry.getValue(); if (getLabelProvider() instanceof ILabelProvider) { ILabelProvider labelProvider = (ILabelProvider)getLabelProvider(); fFeatureLabel.setText( EMFCompareRCPUIMessages.getString("TableMergeViewer.featureMapEntryKeyLabel")); //$NON-NLS-1$ fEObjectIcon.setImage(labelProvider.getImage(entryValue)); fEObjectLabel.setText(labelProvider.getText(entryValue)); } fControl.layout(true); } else if (fInput instanceof IStructuralFeatureAccessor) { IStructuralFeatureAccessor featureAccessor = (IStructuralFeatureAccessor)fInput; EObject eObject = featureAccessor.getEObject(fSide); if (eObject == null) { if (fSide != MergeViewerSide.ANCESTOR) { eObject = featureAccessor.getEObject(MergeViewerSide.ANCESTOR); if (eObject == null) { eObject = featureAccessor.getEObject(fSide.opposite()); } } else { eObject = featureAccessor.getEObject(MergeViewerSide.LEFT); if (eObject == null) { eObject = featureAccessor.getEObject(MergeViewerSide.RIGHT); } } } EStructuralFeature structuralFeature = featureAccessor.getStructuralFeature(); if (getLabelProvider() instanceof ILabelProvider) { ILabelProvider labelProvider = (ILabelProvider)getLabelProvider(); fFeatureIcon.setImage(labelProvider.getImage(structuralFeature)); fFeatureLabel.setText(labelProvider.getText(structuralFeature)); fEObjectIcon.setImage(labelProvider.getImage(eObject)); fEObjectLabel.setText(labelProvider.getText(eObject)); } fControl.layout(true); } else if (fInput instanceof ResourceContentsAccessorImpl) { final ResourceContentsAccessorImpl resourceContentAccessor = (ResourceContentsAccessorImpl)fInput; final Resource resource = resourceContentAccessor.getResource(fSide); if (getLabelProvider() instanceof ILabelProvider) { ILabelProvider labelProvider = (ILabelProvider)getLabelProvider(); fFeatureLabel.setText(EMFCompareRCPUIMessages .getString("TableMergeViewer.directResourceContentsLabel")); //$NON-NLS-1$ fEObjectIcon.setImage(labelProvider.getImage(resource)); fEObjectLabel.setText(labelProvider.getText(resource)); } fControl.layout(true); } } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean) */ @Override public void setSelection(ISelection selection, boolean reveal) { fSelection = selection; } } }