/*******************************************************************************
* 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.rcp.ui.internal.configuration.IEMFCompareConfiguration;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* A specific {@link AbstractMergeViewer} for the EMF Compare Editor.
*
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
* @since 4.0
*/
public abstract class AbstractStructuredMergeViewer extends AbstractMergeViewer {
/** The primary control associated with this viewer. */
private final Control fControl;
/** A listener which is notified when a viewer's selection changes. */
private final ISelectionChangedListener fForwardingSelectionListener;
/**
* Default constructor.
*
* @param parent
* the parent widget.
* @param side
* the side of the viewer.
* @param compareConfiguration
* the compare configuration object used by this viewer.
*/
public AbstractStructuredMergeViewer(Composite parent, MergeViewerSide side,
IEMFCompareConfiguration compareConfiguration) {
super(side, compareConfiguration);
fControl = createControl(parent);
hookControl(fControl);
fForwardingSelectionListener = new ForwardingViewerSelectionListener();
getStructuredViewer().addSelectionChangedListener(fForwardingSelectionListener);
}
/**
* Creates the primary control associated with this viewer.
*
* @param parent
* the parent widget of this viewer.
* @return the created primary control associated with this viewer.
*/
protected abstract Control createControl(Composite parent);
/**
* Returns the wrapped {@link StructuredViewer}.
*
* @return the wrapped {@link StructuredViewer}.
*/
protected abstract StructuredViewer getStructuredViewer();
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.Viewer#getControl()
*/
@Override
public Control getControl() {
return fControl;
}
@Override
protected void handleDispose(DisposeEvent event) {
getStructuredViewer().removeSelectionChangedListener(fForwardingSelectionListener);
hookDispose();
super.handleDispose(event);
}
protected abstract void hookDispose();
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
@Override
public ISelection getSelection() {
return getStructuredViewer().getSelection();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
*/
@Override
public void setSelection(ISelection selection, boolean reveal) {
getStructuredViewer().setSelection(selection, reveal);
}
/**
* {@inheritDoc}
*/
@Override
public void setContentProvider(IContentProvider contentProvider) {
super.setContentProvider(contentProvider);
getStructuredViewer().setContentProvider(contentProvider);
}
/**
* {@inheritDoc}
*/
@Override
public void setLabelProvider(IBaseLabelProvider labelProvider) {
super.setLabelProvider(labelProvider);
getStructuredViewer().setLabelProvider(labelProvider);
}
/**
* A specific implementation of {@link ISelectionChangedListener} for the AbstractStructuredMergeViewer.
*
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
* @since 4.0
*/
private class ForwardingViewerSelectionListener implements ISelectionChangedListener {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
fireSelectionChanged(
new SelectionChangedEvent(AbstractStructuredMergeViewer.this, event.getSelection()));
}
}
}