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="se开发者_运维百科rnet.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?
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
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);
}
}
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.
Your decorator needs to implement org.eclipse.jface.viewers.IColorDecorator if it needs to provide various colors
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
- IFontProvider
- IColorProvider
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 theLableProvider
sWorkbenchLabelProvider
manages the system resources likeColor
s for you. So don't forget to dispose theWorkbenchLabelProvider
.
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());
精彩评论