【发布时间】:2017-07-30 06:00:18
【问题描述】:
我正在寻找表格字段的树状表示组件。
我正在寻找的是带有列的表格,但可以选择像树一样折叠单元格。
【问题讨论】:
-
Scout 模型中没有开箱即用的树表。一些项目已经设法滥用表格小部件(展开和折叠行,就像在树表中一样)。我会花时间分享解决方案(因为问题一次又一次)
标签: tree eclipse-scout
我正在寻找表格字段的树状表示组件。
我正在寻找的是带有列的表格,但可以选择像树一样折叠单元格。
【问题讨论】:
标签: tree eclipse-scout
Scout 中没有内置的树表,但可以滥用表使其看起来像树表。我刚刚在this Gist 中提出了一个实现。
AbstractTreeTable是表格模板,在表格中增加了2列:
KeyColumn:表的主键ParentKeyColumn:父行的键,如果行在树根,则为 null。AbstractTreeTable 处理每个节点行的折叠状态。它还装饰了第一列(节点上的缩进和[+] &[-] 标记)。它处理行操作 (execRowAction(..))。
如果您在表格页面中使用它,建议使用TablePageData 而不是Object[][]。如果您在表字段中使用它,它仅在表字段使用bean based table data 时才有效。
我的原型可以改进:
@Order(10.0)
@FormData(value = AbstractTableFieldBeanData.class, sdkCommand = SdkCommand.USE, defaultSubtypeSdkCommand = DefaultSubtypeSdkCommand.CREATE)
public class CarsTableField extends AbstractTableField<CarsTableField.Table> {
@Override
protected int getConfiguredGridH() {
return 8;
}
@Override
protected int getConfiguredGridW() {
return 2;
}
@Override
protected String getConfiguredLabel() {
return TEXTS.get("Cars");
}
@Order(10.0)
public class Table extends AbstractTreeTable {
/**
* @return the PriceFromColumn
*/
public PriceFromColumn getPriceFromColumn() {
return getColumnSet().getColumnByClass(PriceFromColumn.class);
}
/**
* @return the NameColumn
*/
public NameColumn getNameColumn() {
return getColumnSet().getColumnByClass(NameColumn.class);
}
@Override
protected boolean execIsNode(ITableRow row) {
return getParentKeyColumn().getValue(row) == null;
}
@Override
protected void execDecorateRow(ITableRow row) throws ProcessingException {
if (execIsNode(row)) {
row.setFont(FontSpec.parse("BOLD"));
}
}
@Override
public void importFromTableBeanData(AbstractTableFieldBeanData source) throws ProcessingException {
super.importFromTableBeanData(source);
toggleExpandedState(getRows());
}
@Order(10.0)
public class NameColumn extends AbstractStringColumn {
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("CarModel");
}
}
@Order(20.0)
public class PriceFromColumn extends AbstractIntegerColumn {
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("PriceFrom");
}
}
}
}
@Order(10.0)
@FormData(value = AbstractTableFieldBeanData.class, sdkCommand = SdkCommand.USE, defaultSubtypeSdkCommand = DefaultSubtypeSdkCommand.CREATE)
public class FilesTableField extends AbstractTableField<FilesTableField.Table> {
@Override
protected int getConfiguredGridH() {
return 8;
}
@Override
protected int getConfiguredGridW() {
return 2;
}
@Override
protected String getConfiguredLabel() {
return TEXTS.get("Files");
}
@Order(10.0)
public class Table extends AbstractTreeTable {
@Override
protected boolean execIsNode(ITableRow row) {
Long type = getTypeColumn().getValue(row);
return FileTypeCodeType.FolderCode.ID.equals(type);
}
@Override
public void importFromTableBeanData(AbstractTableFieldBeanData source) throws ProcessingException {
super.importFromTableBeanData(source);
toggleExpandedState(getRows());
}
@Override
protected void execDecorateRow(ITableRow row) throws ProcessingException {
Long type = getTypeColumn().getValue(row);
if (FileTypeCodeType.FolderCode.ID.equals(type)) {
row.setIconId(Icons.FOLDER);
}
else if (FileTypeCodeType.FileCode.ID.equals(type)) {
row.setIconId(Icons.DOCUMENT);
}
else if (FileTypeCodeType.EmailCode.ID.equals(type)) {
row.setIconId(Icons.EMAIL);
}
else if (FileTypeCodeType.VCardCode.ID.equals(type)) {
row.setIconId(Icons.VCARD);
}
}
/**
* @return the TypeColumn
*/
public TypeColumn getTypeColumn() {
return getColumnSet().getColumnByClass(TypeColumn.class);
}
/**
* @return the ModifiedDateColumn
*/
public ModifiedDateColumn getModifiedDateColumn() {
return getColumnSet().getColumnByClass(ModifiedDateColumn.class);
}
/**
* @return the NameColumn
*/
public NameColumn getNameColumn() {
return getColumnSet().getColumnByClass(NameColumn.class);
}
@Order(20.0)
public class NameColumn extends AbstractStringColumn {
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("Name");
}
@Override
protected int getConfiguredWidth() {
return 400;
}
}
@Order(30.0)
public class ModifiedDateColumn extends AbstractDateColumn {
@Override
protected String getConfiguredFormat() {
return "dd.MM.yyyy hh:mm";
}
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("DateModified");
}
@Override
protected int getConfiguredWidth() {
return 200;
}
}
@Order(40.0)
public class TypeColumn extends AbstractSmartColumn<Long> {
@Override
protected Class<? extends ICodeType<?, Long>> getConfiguredCodeType() {
return FileTypeCodeType.class;
}
@Override
protected String getConfiguredHeaderText() {
return TEXTS.get("Type");
}
@Override
protected int getConfiguredWidth() {
return 200;
}
}
}
}
当然,这只是解决实际问题的一种解决方法:scout 缺少模型级别的树表表示。如果有类似的东西,就可以在不同的 UI 中使用真正的树表小部件。
【讨论】:
@FormData 注释始终用于TableField 类(可以在每个层次结构级别定义某些内容)。第一级是AbstractTableField(在侦察罐中)。您表单中的 TableField 直接扩展了此类,或者您在类继承图中有另一个抽象类(也称为模板)。 Table 类上不需要有 @FormData; SDK不要读它。根据您的情况,注释的参数不一样。 wiki 页面上提供了几个示例。随意提出其他问题来详细讨论。