Оформление предметов в TreeViewer

У меня следующая проблема: я готовлю редактор в Eclipse, и одна из вкладок содержит TreeViewer для отображения элементов в дереве. Каждый элемент имеет имя и значение, которое можно редактировать. Проблема, в которой мне нужно указать пользователю, что значение неверно (например, превышает заданный диапазон). Моя идея состоит в том, чтобы украсить неправильные ячейки значком предупреждения или ошибки, который будет отображаться также после завершения редактирования.

Кто-нибудь знает, как украсить элементы в дереве? Я экспериментировал с классом ControlDecoration, но безуспешно.

Заранее спасибо,

Марчин

PS. Я ограничен Eclipse 3.4


person Marcin    schedule 07.06.2011    source источник


Ответы (1)


Это можно сделать двумя способами. Если ваш TreeViewer отображает объекты, являющиеся экземплярами EObject (сгенерированные EMF. Если вы не понимаете эту часть, перейдите к следующему абзацу :)), вы можете изменить «XyzItemProvider» этих EObject, чтобы их метод «getImage» возвращал украшенное изображение вместо "простого" изображения... и это все для объектов EMF, больше ничего менять не нужно.

Если вы отображаете «классические» объекты Java, вам придется изменить LabelProvider вашего TreeViewer, чтобы украсить изображение. Это делается с помощью метода TreeViewer#setLabelProvider().

Тогда вам понадобится «как украсить изображение», что делается с помощью такого кода:

public class MyLabelProvider extends DecoratingLabelProvider {
    public Image getImage(Object element) {
        Image image = super.getImage(element);

        List<Object> images = new ArrayList<Object>(2);
        images.add(image);
        images.add(<Image of the decorator>);
        labelImage = new ComposedImage(images); // This will put the second of the "images" list (the decorator) above the first (the element's image)

        return decoratedImage;
    }
    [...]
}

Затем вам нужно предоставить средству просмотра дерева этот поставщик меток:

TreeViewer treeViewer = new TreeViewer(...);
treeViewer.setLabelProvider(new MyLabelProvider(new LabelProvider()); // new LabelProvider()... or your previous label provider if you have one.
person Kellindil    schedule 07.06.2011