/************************************************************************** * 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$ } }