欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EditingSupport的应用

程序员文章站 2024-03-24 12:03:22
...

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