EditingSupport的应用
Eclipse3.3中提供了一个EditingSupport类,用于支持对TreeViewer或TableViewer等的编辑支持。
在之前,知道的人就会知道,要实现对树或表的编辑其实挺麻烦的,要设置好CellEditor,要定义好ColumnProperties,还要有一个CellModifier等等,而且几乎都是一列就只能有一个类型的CellEditor,而不能有异样。
3.3中提供这个EditingSupport使用起来更简单,而且编辑控件可以根据Cell的不同而有所不同。下面简单介绍一下使用方法。
创建一个TreeViewer或者是TableViewer的方式不变。不同的是创建Column方式现在要有所变化,例如:
private void createTreeColumn(TreeViewer tv) {
String[] titles = { "Name", "Parent", "Read_Only", "Hidden" };
for (int index = 0; index < 4; index++) {
TreeViewerColumn tvc = new TreeViewerColumn(tv, SWT.NONE, index);
tvc.getColumn().setWidth(100);
tvc.getColumn().setMoveable(true);
tvc.getColumn().setResizable(true);
tvc.getColumn().setText(titles[index]);
tvc.setLabelProvider(new FileCellLabelProvider(index));
tvc.setEditingSupport(new FileEditingSupport(tv, index));
}
}
要使用EditingSupport,我们需要使用ViewerColumn对象来创建Column,然后给这个ViewerColumn设置EditingSupport对象。
每个VieweColumn可以设置自己的、与众不同的CellLabelProvider,所以此时整个树或表的LabelProvider可以不设置。
最后就是实现自定义的EditingSupport。这里我给这个EditingSupport传入了column的index,这样到时可以知道具体是哪一列正在编辑。FileEditingSupport实现如下:
class FileEditingSupport extends EditingSupport {
private int index;
public FileEditingSupport(ColumnViewer viewer, int index) {
super(viewer);
this.index = index;
}
@Override
protected boolean canEdit(Object element) {
switch (index) {
case 1:
return false;
default:
break;
}
return true;
}
@Override
protected CellEditor getCellEditor(Object element) {
switch (index) {
case 0:
return new TextCellEditor((Composite) getViewer().getControl(),
SWT.NONE);
case 2:
case 3:
return new ComboBoxCellEditor((Composite) getViewer().getControl(),
new String[] { "true", "false" }, SWT.NONE);
default:
break;
}
return null;
}
@Override
protected Object getValue(Object element) {
switch (index) {
case 0:
return ((File) element).getName();
case 1:
return ((File) element).getParent();
case 2:
return ((File) element).canWrite()?new Integer(0):new Integer(1);
case 3:
return ((File) element).isHidden()?new Integer(0):new Integer(1);
default:
break;
}
return null;
}
@Override
protected void setValue(Object element, Object value) {
}
}
这些方法理解起来不难,实现当然也很简单。这里看起来还是一整列只有一种编辑方式,不过可以很容易的改成根据不同对象的不同列实现不同的编辑方式,例如如果对象是一个File,实现可以选择父对象,如果是一个Folder,可以改名等等!
上一篇: 条形码生成
下一篇: parameterMap的应用