/*******************************************************************************
* Copyright (c) 2013 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.ide.ui.internal.configuration;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.ICompareContainer;
import org.eclipse.compare.ICompareInputLabelProvider;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.graphics.Image;
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
public abstract class ForwardingCompareConfiguration extends CompareConfiguration {
private final ListenerList fListeners;
private final IPropertyChangeListener delegateProperyChangeListener;
public ForwardingCompareConfiguration() {
fListeners = new ListenerList();
// we have to listen to the delegate to avoid leaking the delegate through event.getSource in fired
// events.
delegateProperyChangeListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
fireChange(event.getProperty(), event.getOldValue(), event.getNewValue());
}
};
}
protected abstract CompareConfiguration delegate();
@Override
public IPreferenceStore getPreferenceStore() {
return delegate().getPreferenceStore();
}
@Override
public Image getImage(int kind) {
return delegate().getImage(kind);
}
@Override
public Image getImage(Image base, int kind) {
return delegate().getImage(base, kind);
}
@Override
public void dispose() {
delegate().removePropertyChangeListener(delegateProperyChangeListener);
delegate().dispose();
}
@Override
public void addPropertyChangeListener(IPropertyChangeListener listener) {
fListeners.add(listener);
}
@Override
public void removePropertyChangeListener(IPropertyChangeListener listener) {
fListeners.remove(listener);
}
/**
* Fires a <code>PropertyChangeEvent</code> to registered listeners.
*
* @param propertyName
* the name of the property that has changed
* @param oldValue
* the property's old value
* @param newValue
* the property's new value
*/
protected final void fireChange(String propertyName, Object oldValue, Object newValue) {
PropertyChangeEvent event = null;
Object[] listeners = fListeners.getListeners();
if (listeners != null) {
for (int i = 0; i < listeners.length; i++) {
IPropertyChangeListener l = (IPropertyChangeListener)listeners[i];
if (event == null) {
event = new PropertyChangeEvent(this, propertyName, oldValue, newValue);
}
l.propertyChange(event);
}
}
}
@Override
public void setProperty(String key, Object newValue) {
if (delegate() == null) {
// ignore the set of properties from super <init> as we are always delegating to #delegate().
} else {
delegate().setProperty(key, newValue);
}
}
@Override
public Object getProperty(String key) {
return delegate().getProperty(key);
}
@Override
public void setAncestorLabel(String label) {
delegate().setAncestorLabel(label);
}
@Override
public String getAncestorLabel(Object element) {
return delegate().getAncestorLabel(element);
}
@Override
public void setAncestorImage(Image image) {
delegate().setAncestorImage(image);
}
@Override
public Image getAncestorImage(Object element) {
return delegate().getAncestorImage(element);
}
@Override
public void setLeftEditable(boolean editable) {
delegate().setLeftEditable(editable);
}
@Override
public boolean isLeftEditable() {
return delegate().isLeftEditable();
}
@Override
public void setLeftLabel(String label) {
delegate().setLeftLabel(label);
}
@Override
public String getLeftLabel(Object element) {
return delegate().getLeftLabel(element);
}
@Override
public void setLeftImage(Image image) {
delegate().setLeftImage(image);
}
@Override
public Image getLeftImage(Object element) {
return delegate().getLeftImage(element);
}
@Override
public void setRightEditable(boolean editable) {
delegate().setRightEditable(editable);
}
@Override
public boolean isRightEditable() {
return delegate().isRightEditable();
}
@Override
public void setRightLabel(String label) {
delegate().setRightLabel(label);
}
@Override
public String getRightLabel(Object element) {
return delegate().getRightLabel(element);
}
@Override
public void setRightImage(Image image) {
delegate().setRightImage(image);
}
@Override
public Image getRightImage(Object element) {
return delegate().getRightImage(element);
}
@Override
public ICompareContainer getContainer() {
return delegate().getContainer();
}
@Override
public void setContainer(ICompareContainer container) {
delegate().setContainer(container);
}
@Override
public ICompareInputLabelProvider getLabelProvider() {
return delegate().getLabelProvider();
}
@Override
public void setLabelProvider(ICompareInput input, ICompareInputLabelProvider labelProvider) {
delegate().setLabelProvider(input, labelProvider);
}
@Override
public void setDefaultLabelProvider(ICompareInputLabelProvider labelProvider) {
delegate().setDefaultLabelProvider(labelProvider);
}
@Override
public void setChangeIgnored(int kind, boolean ignored) {
delegate().setChangeIgnored(kind, ignored);
}
@Override
public boolean isChangeIgnored(int kind) {
return delegate().isChangeIgnored(kind);
}
/**
* Facility to check for editability of a given side to facilitate implementation in classes that receive
* a boolean to indicate the side.
*
* @param left
* @return <code>true</code> if the given side is editable.
*/
public boolean isEditable(boolean left) {
if (left) {
return isLeftEditable();
}
return isRightEditable();
}
}