创建 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()
• 获取变型规范 (本示例中的 pv 或 productVariant 为变型规范对象):
• 获取变型基线成员链接信息:
可将用户选取器字段设置为编辑器构造函数中的字段: