Предметы украшений в TreeViewer - PullRequest
4 голосов
/ 07 июня 2011

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

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

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

Marcin

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

1 Ответ

8 голосов
/ 07 июня 2011

Есть два способа сделать это.Если ваш 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.
...