基于Eclipse RCP平台开发的RCP应用中,两种重要的UI组成部分是视图(ViewPart)、编辑器(EditorPart)。视图一般有一个或几个Viewer组成,如TreeViewer、TableViewer等;编辑器一般有一个或几个Page组成。编辑器子类实现一般继承FormEditor,增加必要的编辑页面(Page),编辑页面子类一般继承FormPage。
以下两个类图,说明了其继承关系。
RCP平台提供了很好的视图、编辑器实现基础,能够组合使用现有的类完成视图、编辑器的定制开发,但是需要指出的是当前编辑器及编辑页面(Page)设计(类、接口层次架构及接口方法设计,可以使用Eclipse浏览以上类图中类、接口的方法),比较适合渐进式的编辑处理,缺乏必要的保存之前校验处理,比如:保存之前的输入域验证、唯一性验证、非空验证,这些对于界面录入应用都是常见的,特别是存储形式为数据库存储,数据库具有唯一性、非空等约束条件。也就是说我们需要一种有效的验证机制,在保存时进行验证,验证通过保存成功,验证不能通过给予用户提示信息,让用户修正错误。由于不同编辑器页面,实现不同的方面职责处理,因此,验证机制应该实现在编辑器页面中。
从FormPage的类图中查看其超类和实现的接口,没有一个接口和方法是专门用来完成这个任务的,相关的接口有ISaveablePart、IFormPage,但是ISaveablePart接口是建模save,saveAs的,并没有校验接口方法;IFormPage的接口方法canLeaveThePage,是用来测试是否允许切换到多页编辑器的其他页面的。
综合上述情况,有必要设计一个新的接口,完成相关的校验任务。接口及其方法定义如下:
interface ICanSaveable {
public boolean canSave() throws WorkbenchException;
}
如果不能满足约束条件,则返回异常,异常信息中包含需满足的约束条件,返回true,表明可以保存该页,返回false,表明不用保存该页。
编辑器页面Page类实现该接口有两种方式,方式一是直接实现该接口,方式二是使用内部类、辅助类实现该接口,并通过Page类实现的接口IAdaptable的接口方法查询得到接口ICanSaveable。辅助类适合在能够共享使用情形下,多个Page类共享使用一个校验类。
实现接口后,可以在编辑器的doSave方法中得到编辑器页面的这个接口,调用canSave方法,测试是否满足约束,能够保存。可以根据返回值及是否出现异常做相应的处理。