高级自定义 > 业务逻辑自定义 > 产品系列管理自定义 > 创建 GWT 自定义呈现器和编辑器
  
创建 GWT 自定义呈现器和编辑器
本部分提供了有关创建 GWT 自定义属性呈现器和编辑器的详细信息。
创建自定义 GWT 属性呈现器
在树和表格中显示属性值时,将使用 GWT 属性呈现器。
1. 创建一个新呈现器类,以扩展 com.ptc.cat.gxt.client.widget.grid.CustomCellRenderer<M>
2. 覆盖 render(M, String, ColumnData, int, int, ListStore<M>, Grid<M>) 方法,以提供自定义呈现逻辑。
3. 覆盖 getTextValue(M, String, ColumnData, int, int, ListStore<M>, Grid<M>) 方法,以提供简单纯文本值。
4. 在属性的数据实用程序中,覆盖 LogicSeparatedDataUtility 中的 getGWTRendererType() 方法,并返回自定义呈现器类名称。
5. 在属性的数据实用程序中,覆盖 getPlainDataValue(String, Object, ModelContext) 方法,并返回呈现器需要使用的任何信息。通常,此值用于确定呈现器将要显示的内容。
创建自定义 GWT 属性编辑器
1. 创建一个新编辑器类,以扩展 com.ptc.cat.gxt.client.widget.grid.CustomTreeCellEditor
2. 如果要使用自定义小组件显示属性,则需将此小组件添加到已传递到编辑器构造函数的字段中,如“示例”部分所示。
3. 在用户单击属性字段时,覆盖 startEdit(Element, Object) 方法以提供要执行的任何自定义逻辑。
4. 在保存新值之前,覆盖 completeEdit(boolean) 方法以提供要执行的任何自定义逻辑。
5. 如果取消编辑,则覆盖 cancelEdit() 方法以提供要执行的任何自定义逻辑。
6. 覆盖 preProcessValue(Object) 方法以提供要在 startEdit(Element, Object) 期间执行的任何自定义逻辑,由此设置初始值。
7. 在保存该值之前,覆盖 postProcessValue(Object) 方法以提供要执行的任何自定义逻辑。此方法返回的值即要保存在数据库中的值。
8. 根据您是否希望在“属性筛选器”“高级查找条件”窗口中对此属性使用编辑器,覆盖 UseEditorForAttributeFilterUI() 方法以返回 true 或 false。
9. 如果您的编辑器依赖于数据实用程序来提供用户友好的显示值,则覆盖 shouldRefreshAfterEdit() 方法以返回 true。
为可编辑性添加自定义验证
对于客户端验证,覆盖自定义编辑器类中的 isEditable(int, int, EditorTreeGridWidget)isEditable(int, int, EditorGridWidget) 方法。isEditable(int, int, EditorTreeGridWidget) 方法用于处理何时在树上下文中进行编辑,而 isEditable(int, int, EditorGridWidget) 方法用于处理何时在表上下文中进行编辑。客户端验证可用于快速 (无服务器调用) 验证当前对象是否有子项,或是否检出当前对象。
对于服务器端验证,覆盖自定义编辑器类中的 verifyEditablityAsync(int, int, EditorTreeGridWidget, AsyncCallback)verifyEditablityAsync(int, int, EditorGridWidget, AsyncCallback) 方法。verifyEditablityAsync(int, int, EditorTreeGridWidget, AsyncCallback) 方法用于处理何时在树上下文中进行编辑,而 verifyEditablityAsync(int, int, EditorGridWidget, AsyncCallback) 方法用于处理何时在表上下文中进行编辑。服务器端验证比客户端验证慢 (因为您进行的是服务器调用),但其功能更强大。在服务器端操作 (从 verifyEditablityAsync() 中执行) 中,您可以获得给定对象所需的属性信息,从而实现更高级的验证用例。有关在 GWT 中创建和执行服务器端操作的信息,请参阅下面的自定义示例。
在创建服务器端验证操作时,请确保客户端操作和服务器端操作采用相同的命名,并将其包括在相同的包位置,而只有服务器和客户端不同。
示例
StructureModel 表示对象 (使用关系链接 ID、版本 ID 和主控 ID) 的特定用法,可以在客户端和服务器之间来回传递。同一对象 (具有相同使用关系链接) 的所有重用情况均由相同的 StructureModel 表示。因此,您必须使用 TreeModel 来获取树中特定行的父项对象。
使用 StructureModel 执行客户端验证
测试对象是否具有子项:
smodel != null && smodel.isFlagEnabled(StructureModel.F_HAS_CHILDREN)
测试对象是否已检出:
structureModel.isFlagEnabled(StructureModel.F_CHECKEDOUT_COPY) &&
structureModel.isFlagEnabled(StructureModel.F_CHECKEDOUT_TO_ME))
测试对象是否为模块变型:
bomStructureModel.isModuleVariant()
树中的每一行都以仅存在于客户端上的唯一 TreeModel 来表示。TreeModel 用于指示该特定行的父项和子项。它还保留对此行所表示对象的 StructureModel 的引用。
获取父项对象:
tm.getParentModel()
获取子对象:
model.getChildModels()
获取结构模型:
parent.getStructure()
获取变型规范 (本示例中的 pvproductVariant 为变型规范对象):
获取变型基线成员链接信息:
可将用户选取器字段设置为编辑器构造函数中的字段: