/*
* #%~
* org.overture.ide.ui
* %%
* Copyright (C) 2008 - 2014 Overture
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #~%
*/
package org.overture.ide.ui.internal.viewsupport;
import java.util.ArrayList;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.overture.ide.ui.VdmUIPlugin;
public class VdmUILabelProvider implements ILabelProvider, IColorProvider,
IStyledLabelProvider
{
// private List<Image> images = new Vector<Image>();
protected ListenerList fListeners = new ListenerList();
protected VdmElementImageProvider fImageLabelProvider;
// protected StorageLabelProvider fStorageLabelProvider;
private ArrayList<ILabelDecorator> fLabelDecorators;
private int fImageFlags;
private long fTextFlags;
/**
* Creates a new label provider with default flags.
*/
public VdmUILabelProvider()
{
this(VdmElementLabels.ALL_DEFAULT, VdmElementImageProvider.OVERLAY_ICONS);
}
/**
* @param textFlags
* Flags defined in <code>JavaElementLabels</code>.
* @param imageFlags
* Flags defined in <code>JavaElementImageProvider</code>.
*/
public VdmUILabelProvider(long textFlags, int imageFlags)
{
fImageLabelProvider = new VdmElementImageProvider();
fLabelDecorators = null;
// fStorageLabelProvider= new StorageLabelProvider();
fImageFlags = imageFlags;
fTextFlags = textFlags;
}
/**
* Adds a decorator to the label provider
*
* @param decorator
* the decorator to add
*/
public void addLabelDecorator(ILabelDecorator decorator)
{
if (fLabelDecorators == null)
{
fLabelDecorators = new ArrayList<ILabelDecorator>(2);
}
fLabelDecorators.add(decorator);
}
/**
* Sets the textFlags.
*
* @param textFlags
* The textFlags to set
*/
public final void setTextFlags(long textFlags)
{
fTextFlags = textFlags;
}
/**
* Sets the imageFlags
*
* @param imageFlags
* The imageFlags to set
*/
public final void setImageFlags(int imageFlags)
{
fImageFlags = imageFlags;
}
/**
* Gets the image flags. Can be overwritten by super classes.
*
* @return Returns a int
*/
public final int getImageFlags()
{
return fImageFlags;
}
/**
* Gets the text flags.
*
* @return Returns a int
*/
public final long getTextFlags()
{
return fTextFlags;
}
/**
* Evaluates the image flags for a element. Can be overwritten by super classes.
*
* @param element
* the element to compute the image flags for
* @return Returns a int
*/
protected int evaluateImageFlags(Object element)
{
return getImageFlags();
}
/**
* Evaluates the text flags for a element. Can be overwritten by super classes.
*
* @param element
* the element to compute the text flags for
* @return Returns a int
*/
protected long evaluateTextFlags(Object element)
{
return getTextFlags();
}
protected Image decorateImage(Image image, Object element)
{
if (fLabelDecorators != null && image != null)
{
for (int i = 0; i < fLabelDecorators.size(); i++)
{
ILabelDecorator decorator = (ILabelDecorator) fLabelDecorators.get(i);
image = decorator.decorateImage(image, element);
}
}
return image;
}
/*
* (non-Javadoc)
* @see ILabelProvider#getImage
*/
public Image getImage(Object element)
{
try
{
Image resultB = fImageLabelProvider.getImageLabel(element, evaluateImageFlags(element));
// if (result == null && (element instanceof IStorage)) {
// result= fStorageLabelProvider.getImage(element);
// }
Image result = decorateImage(resultB, element);
return result;
} catch (Exception e)
{
VdmUIPlugin.log(e);
return null;
}
}
protected String decorateText(String text, Object element)
{
if (fLabelDecorators != null && text.length() > 0)
{
for (int i = 0; i < fLabelDecorators.size(); i++)
{
ILabelDecorator decorator = (ILabelDecorator) fLabelDecorators.get(i);
String decorated = decorator.decorateText(text, element);
if (decorated != null)
{
text = decorated;
}
}
}
return text;
}
/*
* (non-Javadoc)
* @see ILabelProvider#getText
*/
public String getText(Object element)
{
String result = VdmElementLabels.getTextLabel(element, evaluateTextFlags(element));
// if (result.length() == 0 && (element instanceof IStorage)) {
// result= fStorageLabelProvider.getText(element);
// }
return decorateText(result, element);
}
public StyledString getStyledText(Object element)
{
StyledString string = VdmElementLabels.getStyledTextLabel(element, (evaluateTextFlags(element) | VdmElementLabels.COLORIZE));
// if (string.length() == 0 && (element instanceof IStorage)) {
// string= new StyledString(fStorageLabelProvider.getText(element));
// }
String decorated = (string!=null?decorateText(string.getString(), element):null);
if (decorated != null)
{
return StyledCellLabelProvider.styleDecoratedString(decorated, StyledString.DECORATIONS_STYLER, string);
}
return string;
}
/*
* (non-Javadoc)
* @see IBaseLabelProvider#dispose
*/
public void dispose()
{
if (fLabelDecorators != null)
{
for (int i = 0; i < fLabelDecorators.size(); i++)
{
ILabelDecorator decorator = (ILabelDecorator) fLabelDecorators.get(i);
decorator.dispose();
}
fLabelDecorators = null;
}
// fStorageLabelProvider.dispose();
fImageLabelProvider.dispose();
// for (Image img : images)
// {
// if (!img.isDisposed())
// {
// img.dispose();
// }
// }
}
/*
* (non-Javadoc)
* @see IBaseLabelProvider#addListener(ILabelProviderListener)
*/
public void addListener(ILabelProviderListener listener)
{
if (fLabelDecorators != null)
{
for (int i = 0; i < fLabelDecorators.size(); i++)
{
ILabelDecorator decorator = (ILabelDecorator) fLabelDecorators.get(i);
decorator.addListener(listener);
}
}
fListeners.add(listener);
}
/*
* (non-Javadoc)
* @see IBaseLabelProvider#isLabelProperty(Object, String)
*/
public boolean isLabelProperty(Object element, String property)
{
return true;
}
/*
* (non-Javadoc)
* @see IBaseLabelProvider#removeListener(ILabelProviderListener)
*/
public void removeListener(ILabelProviderListener listener)
{
if (fLabelDecorators != null)
{
for (int i = 0; i < fLabelDecorators.size(); i++)
{
ILabelDecorator decorator = (ILabelDecorator) fLabelDecorators.get(i);
decorator.removeListener(listener);
}
}
fListeners.remove(listener);
}
public static ILabelDecorator[] getDecorators(boolean errortick,
ILabelDecorator extra)
{
if (errortick)
{
if (extra == null)
{
return new ILabelDecorator[] {};
} else
{
return new ILabelDecorator[] { extra };
}
}
if (extra != null)
{
return new ILabelDecorator[] { extra };
}
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
*/
public Color getForeground(Object element)
{
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
*/
public Color getBackground(Object element)
{
return null;
}
/**
* Fires a label provider changed event to all registered listeners Only listeners registered at the time this
* method is called are notified.
*
* @param event
* a label provider changed event
* @see ILabelProviderListener#labelProviderChanged
*/
protected void fireLabelProviderChanged(
final LabelProviderChangedEvent event)
{
Object[] listeners = fListeners.getListeners();
for (int i = 0; i < listeners.length; ++i)
{
final ILabelProviderListener l = (ILabelProviderListener) listeners[i];
SafeRunner.run(new SafeRunnable()
{
public void run()
{
l.labelProviderChanged(event);
}
});
}
}
}