RCP学习笔记(一) Viewer合作类的模式
Viewer是逻辑对象(或叫做领域模型)和显示对象之间的一个桥梁。他的主要的任务就是根据逻辑对象来填充窗体组件。一般需要三个类来完成Business Object 在窗体组件中的显示。我们这里同过使用TableView来演示这部分的功能。
TableViewer的责任是用特定的对象填充到Table窗体组件中。是我们最终在窗体要看到的对象。如下图所示的一部分:

而IStructuredContentProvider和ITableLabelProvider的实现类是用来帮助TableViewer来完成这个任务的。
1、 IStructuredContentProvider的任务是“根据给定的对象,返回一个对应的领域对象”1。是通过:public Object[] getElements(Object arg0)2方法实现的。
2、 ITableLabelProvider 的任务是“返回展现领域对象的所需的图标和文字”。这两个任务分别是通过public Image getColumnImage(Object element, int columnIndex);和
public String
getColumnText(Object element, int columnIndex);这两个方法实现的。他们的传入参数都是:Object element, int columnIndex。Element表示当前行所要展现的数据对象,columnIndex表示的当前处理的列号,他是从零开始记的。
知道了他们之间分配的职能后,我们就可以看看他们是怎么协作的了。在TableView的需要显示的输入对象改变了(调用了setInput方法可以触发待显示领域对象的改变),这就会触发TableView的InputChange事件,这时候TableView就会去调用他本身的refresh3方法。最终会在getRawChildren方法中调用IStructuredContentProvider实现类中的getElements方法或的一个Object[]。供以后创建Item时使用。整个调用过程可以用下面的strack图来表示:

通过调用IStructuredContentProvider获的了一个对象数组后,就会根据对象数组来创建显示的Item。我们可以先看一下ITableLabelProvider(TableLabelProvider是ITableLabelProvider的一个实现类)。
在更新Item的时候提供每个TableView需要的Text和Image就好了。他们最终在TableViewer的doUpdateItem方法中调用ITableLabelProvider的getColumnText和getColumnImage方法。
要实现一个在TableView中显示特定对象只需要实现IStructuredContentProvider实现类的getElements方法。和ITableLabelProvider的getColumnText方法。
下面是我示例中的代码:
TableLabelPrivate:
TableContentPrivate:

Viewer也都是采用ContentProvide和LabelProvide的协作方式来工作。
其他的
参考文献:
1、 Contributing to Eclipse 中文版 Page 290
2、 org.eclipse.jface.viewers. IStructuredContentProvider.java
3、 这个方法继承自StructuredViewer。可参考StructuredViewer.java