/*******************************************************************************
* Copyright (c) 2011 Google, Inc.
* 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:
* Google, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.wb.rcp.databinding;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.set.ISetChangeListener;
import org.eclipse.core.databinding.observable.set.SetChangeEvent;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.graphics.Image;
/**
* This class may be freely distributed as part of any application or plugin.
*
* @author lobas_av
*/
public class TreeObservableLabelProvider extends LabelProvider {
private final Class<?> m_beanClass;
private final Method m_getTextMethod;
private final Method m_getImageMethod;
////////////////////////////////////////////////////////////////////////////
//
// Constructor
//
////////////////////////////////////////////////////////////////////////////
public TreeObservableLabelProvider(IObservableSet allElementsObservable,
Class<?> beanClass,
String textProperty,
String imageProperty) {
m_observable = allElementsObservable;
m_beanClass = beanClass;
m_getTextMethod = Utils.getMethod(m_beanClass, textProperty);
m_getImageMethod = Utils.getMethod(m_beanClass, imageProperty);
List<String> properties = new ArrayList<String>();
if (m_getTextMethod != null) {
properties.add(textProperty);
}
if (m_getImageMethod != null) {
properties.add(imageProperty);
}
m_listenerSupport = new ListenerSupport(m_propertiesListener, properties);
m_observable.addSetChangeListener(m_setListener);
}
////////////////////////////////////////////////////////////////////////////
//
// LabelProvider
//
////////////////////////////////////////////////////////////////////////////
@Override
public String getText(Object element) {
Object text = Utils.invokeMethod(m_getTextMethod, m_beanClass, element);
return text == null ? null : text.toString();
}
@Override
public Image getImage(Object element) {
return (Image) Utils.invokeMethod(m_getImageMethod, m_beanClass, element);
}
////////////////////////////////////////////////////////////////////////////
//
// Update
//
////////////////////////////////////////////////////////////////////////////
private final IObservableSet m_observable;
private final ListenerSupport m_listenerSupport;
private final PropertyChangeListener m_propertiesListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
LabelProviderChangedEvent newEvent =
new LabelProviderChangedEvent(TreeObservableLabelProvider.this, event.getSource());
fireLabelProviderChanged(newEvent);
}
};
private final ISetChangeListener m_setListener = new ISetChangeListener() {
@Override
public void handleSetChange(SetChangeEvent event) {
for (Object removedElement : event.diff.getRemovals()) {
if (Utils.instanceOf(m_beanClass, removedElement)) {
m_listenerSupport.unhookListener(removedElement);
}
}
for (Object addedElement : event.diff.getAdditions()) {
if (Utils.instanceOf(m_beanClass, addedElement)) {
m_listenerSupport.hookListener(addedElement);
}
}
}
};
@Override
public void dispose() {
m_observable.removeSetChangeListener(m_setListener);
m_listenerSupport.dispose();
super.dispose();
}
}