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

 

 

你可能感兴趣的:(EditingSupport的应用)