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,可以改名等等!