/**************************************************************************
* ERA - Eclipse Requirements Analysis
* ==============================================
* Copyright (C) 2009-2013 by Georg Blaschke, Christoph P. Neumann
* and Bernd Haberstumpf (http://era.origo.ethz.ch)
**************************************************************************
* Licensed under the Eclipse Public License - v 1.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.eclipse.org/org/documents/epl-v10.html
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**************************************************************************
*/
package era.foss.ui.contrib;
import java.util.Set;
import org.eclipse.core.databinding.observable.map.IMapChangeListener;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.map.MapChangeEvent;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.ViewerCell;
/**
* The Class EmfObservableMapVaildatingStyledCellLabelProvider.
*/
public class EmfObservableMapVaildatingStyledCellLabelProvider extends StyledCellLabelProvider {
/**
* Observable maps typically mapping from viewer elements to label values. Subclasses may use these maps to provide
* custom labels.
*/
protected IObservableMap[] attributeMaps;
/** The map change listener. */
private IMapChangeListener mapChangeListener = new IMapChangeListener() {
public void handleMapChange( MapChangeEvent event ) {
Set<?> affectedElements = event.diff.getChangedKeys();
LabelProviderChangedEvent newEvent = new LabelProviderChangedEvent(
EmfObservableMapVaildatingStyledCellLabelProvider.this,
affectedElements.toArray() );
fireLabelProviderChanged( newEvent );
}
};
/**
* Creates a new label provider that tracks changes to one attribute.
*
* @param attributeMap the attribute map
*/
public EmfObservableMapVaildatingStyledCellLabelProvider( IObservableMap attributeMap ) {
this( new IObservableMap[]{attributeMap} );
}
/**
* Creates a new label provider that tracks changes to more than one attribute. This constructor should be used by
* subclasses that override {@link #update(ViewerCell)} and make use of more than one attribute.
*
* @param attributeMaps the attribute maps
*/
protected EmfObservableMapVaildatingStyledCellLabelProvider( IObservableMap[] attributeMaps ) {
System.arraycopy( attributeMaps,
0,
this.attributeMaps = new IObservableMap[attributeMaps.length],
0,
attributeMaps.length );
for( int i = 0; i < attributeMaps.length; i++ ) {
attributeMaps[i].addMapChangeListener( mapChangeListener );
}
}
public void dispose() {
for( int i = 0; i < attributeMaps.length; i++ ) {
attributeMaps[i].removeMapChangeListener( mapChangeListener );
}
super.dispose();
this.attributeMaps = null;
this.mapChangeListener = null;
}
public void update( ViewerCell cell ) {
Object element = cell.getElement();
Object value = attributeMaps[0].get( element );
cell.setText( value == null ? "" : value.toString() ); //$NON-NLS-1$
}
}