ViewerSupport и ITableColorProvider или ITableFontProvider
Я пишу RCP-приложение и пытаюсь использовать привязку данных, чтобы связать элементы управления GUI с моделью. Это включает в себя, например, привязку данных к таблице.
Насколько я понял, org.eclipse.jface.databinding.viewers.ViewerSupport является рекомендуемым методом для привязки модели к программе просмотра таблиц. Это, однако, только позволит мне поместить данные в виде текста в таблицу. Я также хотел бы изменить цвет переднего плана и фона, а также шрифт некоторых ячеек, в зависимости от других наблюдаемых. Я также был бы счастлив, если бы мог каким-то образом получить ITableFontProvider или ITableColorProvider в том, что производит ViewerSupport.bind (...).
До сих пор я не нашел хороший способ сделать это. Я мог бы скопировать содержимое ViewerSupport.bind() и переопределить LabelProvider своим собственным классом. Это кажется немного грязным.
Я мог бы также после вызова ViewerSupport.bind получить LabelProvider и заменить его делегирующим LabelProvider, который также реализует ITableFontProvider и ITableColorProvider. Это оставляет мне создание множества методов, которые ничего не делают, кроме как делегируют вещи другому объекту. Не очень элегантно.
Все это не кажется таким хорошим. Есть идеи, как сделать это элегантно? Я пропускаю какой-то заводской класс, чтобы сделать это?
1 ответ
ViewerSupport
просто предоставляет упрощенные методы, основанные на различных источниках привязки данных и поставщиках меток. Вполне допустимо использовать эти поставщики контента и ярлыков напрямую, когда ViewerSupport
не предоставляет то, что вы хотите.
Например, ViewerSupport.bind(StructuredViewer viewer, IObservableList input,
IValueProperty[] labelProperties)
просто:
ObservableListContentProvider contentProvider = new ObservableListContentProvider();
if (viewer.getInput() != null)
viewer.setInput(null);
viewer.setContentProvider(contentProvider);
viewer.setLabelProvider(new ObservableMapLabelProvider(Properties
.observeEach(contentProvider.getKnownElements(),
labelProperties)));
if (input != null)
viewer.setInput(input);
Таким образом, вы можете просто использовать этот код, но с подклассом ObservableMapLabelProvider
с вашими поставщиками шрифтов и цветов.