/* * This file is part of the OpenSCADA project * Copyright (C) 2006-2010 TH4 SYSTEMS GmbH (http://th4-systems.com) * * OpenSCADA is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenSCADA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenSCADA. If not, see * <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License. */ package org.openscada.ui.databinding; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.databinding.util.Policy; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.LabelProviderChangedEvent; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * NON-API - Generic viewer label provider. * @since 1.1 * */ public class ViewerLabelProvider implements ILabelProvider, IStyledLabelProvider { private final static Logger logger = LoggerFactory.getLogger ( ViewerLabelProvider.class ); private final List<ILabelProviderListener> listeners = new ArrayList<ILabelProviderListener> (); /** * Subclasses should override this method. They should not call the base * class implementation. */ public void updateLabel ( final StyledViewerLabel label, final Object element ) { label.setText ( element.toString () ); } protected final void fireChangeEvent ( final Collection<?> changes ) { final LabelProviderChangedEvent event = new LabelProviderChangedEvent ( ViewerLabelProvider.this, changes.toArray () ); final ILabelProviderListener[] listenerArray = ViewerLabelProvider.this.listeners.toArray ( new ILabelProviderListener[ViewerLabelProvider.this.listeners.size ()] ); final Display display = getDisplay (); if ( !display.isDisposed () ) { display.asyncExec ( new Runnable () { public void run () { for ( final ILabelProviderListener listener : listenerArray ) { try { listener.labelProviderChanged ( event ); } catch ( final Exception e ) { Policy.getLog ().log ( new Status ( IStatus.ERROR, Policy.JFACE_DATABINDING, e.getLocalizedMessage (), e ) ); } } } } ); } } private Display getDisplay () { return Display.getDefault (); } public final Image getImage ( final Object element ) { final StyledViewerLabel label = new StyledViewerLabel ( "", null ); //$NON-NLS-1$ updateLabel ( label, element ); logger.debug ( "Get Image: {} for {}", new Object[] { label.getImage (), element } ); //$NON-NLS-1$ return label.getImage (); } public final String getText ( final Object element ) { final StyledViewerLabel label = new StyledViewerLabel ( "", null ); //$NON-NLS-1$ updateLabel ( label, element ); return label.getText (); } public StyledString getStyledText ( final Object element ) { final StyledViewerLabel label = new StyledViewerLabel ( "", null ); //$NON-NLS-1$ updateLabel ( label, element ); return label.getStyledText (); } public void addListener ( final ILabelProviderListener listener ) { this.listeners.add ( listener ); } public void dispose () { this.listeners.clear (); } public final boolean isLabelProperty ( final Object element, final String property ) { return true; } public void removeListener ( final ILabelProviderListener listener ) { this.listeners.remove ( listener ); } }