Reputation: 3481
I added a decorator in a Eclipse/RCP application to my tree viewer items by plugin.xml:
<extension point="org.eclipse.ui.decorators">
<decorator
adaptable="true"
class="sernet.verinice.samt.rcp.TopicDecorator"
id="sernet.verinice.samt.rcp.TopicDecorator"
label="ISA Topic decorator"
lightweight="true"
location="BOTTOM_LEFT"
state="true">
<enablement>
<objectClass name="sernet.verinice.model.samt.SamtTopic"/>
</enablement>
</decorator>
In the decorator class i set the decoration suffix which works fine:
public class TopicDecorator extends LabelProvider implements ILightweightLabelDecorator, {
ControlMaturityService maturityService = new ControlMaturityService();
@Override
public void decorate(Object element, IDecoration decoration) {
decoration.addSuffix( new StringBuilder().append(" [")
.append(maturityService.getWeightedMaturity((IControl)element))
.append("]").toString() );
decoration.setForegroundColor(new Color(Display.getCurrent(), 150,90,90));
}
As you can see i also tried to set the foreground color of the suffic which has no effect. Suffix has the same color as the label in the tree: black.
How can i set the color of the decoration suffix?
Upvotes: 5
Views: 4211
Reputation: 51483
You just have to implement org.eclipse.jface.viewers.IColorProvider
in your LabelProvider
public class MyLabelProvider extends LabelProvider implements IColorProvider {
public String getText(Object element){
return String.valueOf(element)
}
public Color getForeground(Object element){
Display display = Display.getDefault();
return display.getSystemColor(SWT.COLOR_GRAY);
}
public Color getBackground(Object element){
return null;
}
}
Then you can create a DecoratingLabelProvider
. Usually you use the workbench's decorator, because it detects the decorator registered by the extension-point org.eclipse.ui.decorators
. See The Java Developer's Guide to Eclipse.
ILabelProvider baseLabelProvider = new MyLabelProvider();
IDecoratorManager decoratorManager = PlatformUI.getWorkbench().getDecoratorManager();
ILabelDecorator decorator = decoratorManager.getLabelDecorator();
DecoratingLabelProvider decoratingLabelProvider = new DecoratingLabelProvider(baseLabelProvider, decorator);
and use it as normal
TableViewer viewer = ...;
viewer.setLabelProvider(decoratingLabelProvider);
The DecoratingLabelProvider
automatically detects if the LabelProvider
it uses is an
For more sophisticated decorations take a look at WorkbenchLabelProvider
.
I often use the WorkbenchLabelProvider
in combination with the DelegatingStyledCellLabelProvider
, because they perfectly integrate with the workbench.
I see two benefits with this approach:
WorkbenchAdapter
is easier to use than the LableProvider
s WorkbenchLabelProvider
manages the system resources like Color
s for you.
So don't forget to dispose the WorkbenchLabelProvider
.Here is a code snippet that I often use:
ILabelDecorator labelDecorator = PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator();
DecoratingStyledCellLabelProvider labelProvider = new DecoratingStyledCellLabelProvider(
new WorkbenchLabelProvider(), labelDecorator, null);
tableViewer.setLabelProvider(labelProvider);
tableViewer.getTable().addDisposeListener((e) -> labelProvider.dispose());
Upvotes: 1
Reputation: 102
I have just had success getting a different coloured text decoration using a wrapper class TreeElementDecoratingLabelProvider
for org.eclipse.jface.viewers.DecoratingLabelProvider
:
public class TreeElementDecoratingLabelProvider extends DecoratingLabelProvider {
public TreeElementDecoratingLabelProvider(ILabelProvider provider, ILabelDecorator decorator) {
super(provider, decorator);
}
@Override
public Color getForeground(Object element) {
//return your color for element...
return Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
}
}
Upvotes: 1
Reputation: 31
I have just had success getting a different coloured text decoration using a org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider that wrapps an IStyledLabelProvider
, and an ILabelDecorator
.
I think the key is the getStyledText
method of the LabelProvider
, that allows custom styling of the text
Upvotes: 3
Reputation: 4892
Your decorator needs to implement org.eclipse.jface.viewers.IColorDecorator if it needs to provide various colors
Upvotes: 1
Reputation: 631
I guess you should try to change the order - set setForegroundColor() first and then add a suffix.
Hint: to not initialize any colour by yourself, you may use Display.getDefault().getSystemColor(SWT.COLOR_GREEN); Then you need to care about disposing of this colour - it's freed by the system.
Upvotes: 1