uı6ʎɹnɯ ꞁəıuɐp
uı6ʎɹnɯ ꞁəıuɐp

Reputation: 3481

How to set the color of an Eclipse/RCP decorator?

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

Answers (5)

Ren&#233; Link
Ren&#233; Link

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:

  1. WorkbenchAdapter is easier to use than the LableProviders
  2. WorkbenchLabelProvider manages the system resources like Colors 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

viktorianer
viktorianer

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

R3v3r3nd
R3v3r3nd

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

Prakash G. R.
Prakash G. R.

Reputation: 4892

Your decorator needs to implement org.eclipse.jface.viewers.IColorDecorator if it needs to provide various colors

Upvotes: 1

Michal
Michal

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

Related Questions