开发者

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

开发者 https://www.devze.com 2023-02-08 07:31 出处:网络
I added a decorator in a Eclipse/RCP application to my tree viewer items by plugin.xml: <extension point=\"org.eclipse.ui.decorators\">

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:

  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());
0

精彩评论

暂无评论...
验证码 换一张
取 消