blob: c8b059105ea397b2f43eda05701ab7eaee8052d4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.details.providers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Item;
/**
* A TableProvider allows clients to register a label provider and an optional
* ICellModifier for each property they will display in the table. The TableProvider
* will delegate ITableLabelProvider and ICellModifier behaviour to the registered
* providers.
*
* Grouping related behaviours by column type (instead of grouping them by the
* behaviour type) will hopefully make maintenance of table code easier.
*
* IMPORTANT: The dispose() method of each registered label provider will be called
* when the TableProvider is disposed. If this is undesirable, clients can avoid it by
* unregistering the property before the TableProvider is disposed.
*/
public class TableProvider implements ITableLabelProvider, ICellModifier {
protected HashMap propertyToLabelProvider;
protected HashMap propertyToCellModifier;
protected ArrayList labelProviderListeners;
// NOTE: do not use columnProperties directly! Subclasses may change its
// semantics. Use getColumnProperty() or getColumnProperties().
protected String[] columnProperties;
public TableProvider() {
this.propertyToLabelProvider = new HashMap();
this.propertyToCellModifier = new HashMap();
labelProviderListeners = new ArrayList();
}
/**
* This method should be called with the properties being used for each column of
* the Table. If a TableViewer is used, these are the same values passed to the
* TableViewer's setColumnProperties() method. However, you must still call both
* methods because TableProvider doesn't know about the table viewer.
*
* TableProvider needs the columnProperties in order to delegate label provider
* behaviour to the correct registered label provider.
*/
public void setColumnProperties(String[] columnProperties) {
this.columnProperties = columnProperties;
}
/**
* Returns the columnProperties of this TableProvider.
*/
public String[] getColumnProperties() {
return columnProperties;
}
/**
* Returns a particular column's property. For some subclasses, this may be more
* efficient than using getColumnProperties().
*/
public String getColumnProperty(int index) {
return columnProperties[index];
}
/**
* Unregister the old label provider and cell modifier for the given property.
*
* @param property property to unregister.
*/
public void unregister(String property) {
IBaseLabelProvider oldLp = (IBaseLabelProvider)propertyToLabelProvider.remove(property);
propertyToCellModifier.remove(property);
if (oldLp != null) {
// remove all active listeners from the label provider.
for (Iterator it = labelProviderListeners.iterator(); it.hasNext(); ) {
oldLp.removeListener((ILabelProviderListener)it.next());
}
}
}
/**
* Unregister the old label provider and cell modifier for the given property.
*
* @param property property to register.
* @param lp label provider to use for the property. Must be an ILabelProvider or IBaseLabelProvider.
* @param cm ICellModifier to use for the property. May be null.
*/
public void register(String property, IBaseLabelProvider lp, ICellModifier cm) {
unregister(property);
// add all active listeners to the label provider.
for (Iterator it = labelProviderListeners.iterator(); it.hasNext(); ) {
lp.addListener((ILabelProviderListener)it.next());
}
propertyToLabelProvider.put(property, lp);
propertyToCellModifier.put(property, cm);
}
/* ITableLabelProvider */
public Image getColumnImage(Object element, int columnIndex) {
// delegate to the appropriate label provider.
Object lp = propertyToLabelProvider.get(columnProperties[columnIndex]);
if (lp instanceof ITableLabelProvider) {
return ((ITableLabelProvider)lp).getColumnImage(element, columnIndex);
}
if (lp instanceof ILabelProvider) {
return ((ILabelProvider)lp).getImage(element);
}
// no label provider found.
return null;
}
public String getColumnText(Object element, int columnIndex) {
// delegate to the appropriate label provider.
Object lp = propertyToLabelProvider.get(columnProperties[columnIndex]);
if (lp instanceof ITableLabelProvider) {
return ((ITableLabelProvider)lp).getColumnText(element, columnIndex);
}
if (lp instanceof ILabelProvider) {
return ((ILabelProvider)lp).getText(element);
}
// no label provider found.
return null;
}
/* IBaseLabelProvider */
public void addListener(ILabelProviderListener listener) {
labelProviderListeners.add(listener);
// add the listener to all label providers.
for (Iterator it = propertyToLabelProvider.values().iterator(); it.hasNext(); ) {
((IBaseLabelProvider)it.next()).addListener(listener);
}
}
public void removeListener(ILabelProviderListener listener) {
labelProviderListeners.add(listener);
// remove the listener from all label providers.
for (Iterator it = propertyToLabelProvider.values().iterator(); it.hasNext(); ) {
((IBaseLabelProvider)it.next()).removeListener(listener);
}
}
public void dispose() {
// dispose all registered label providers.
for (Iterator it = propertyToLabelProvider.values().iterator(); it.hasNext(); ) {
((IBaseLabelProvider)it.next()).dispose();
}
}
public boolean isLabelProperty(Object element, String property) {
// TODO: simplify this by just always returning true?
// return true if any registered label provider returns true.
for (Iterator it = propertyToLabelProvider.values().iterator(); it.hasNext(); ) {
if (((IBaseLabelProvider)it.next()).isLabelProperty(element, property)) return true;
}
return false;
}
/* ICellModifier */
public boolean canModify(Object element, String property) {
// delegate to the appropriate cell modifier.
ICellModifier cm = (ICellModifier)propertyToCellModifier.get(property);
if (cm != null) return cm.canModify(element, property);
// no cell modifier found.
return false;
}
public Object getValue(Object element, String property) {
// delegate to the appropriate cell modifier.
ICellModifier cm = (ICellModifier)propertyToCellModifier.get(property);
if (cm != null) return cm.getValue(element, property);
// no cell modifier found.
return null;
}
public void modify(Object element, String property, Object value) {
if (element instanceof Item) element = ((Item)element).getData();
// delegate to the appropriate cell modifier.
ICellModifier cm = (ICellModifier)propertyToCellModifier.get(property);
if (cm != null) { cm.modify(element, property, value); return; }
// no cell modifier found.
// do nothing
}
}