给eclipse viewer增加拖拽支持

在jface中的viewer体系中(顶层抽象类org.eclipse.jface.viewers.Viewer),继承自org.eclipse.jface.viewers.StructuredViewer类的所有类都支持拖拽。在eclipse插件开发过程经常会有drag and drop的需求,下面通过一个小例子来说明如何给一个viewer增加拖拽支持。

 

其实很简单,只要2步:

1. 实现自己的org.eclipse.swt.dnd.DragSourceAdapter(监听drag动作)

2. 调用Viewer的addDragSupport(int operations, Transfer[] transferTypes, DragSourceListener listener)方法。参数1表示drag and drop的操作类型,参数2表示drag所支持的Transfer类型(Transfer是swt提供的一种java数据和平台相关的数据的相互转换的机制),第三个参数就是DragSrourceAdapter的实现。

DragView是一个简单的eclipse view,主要有一个TreeView构成。

 

public class DragView extends ViewPart {
	
	private TreeViewer viewer;
	@Override
	public void createPartControl(Composite parent) {
		createTreeViewer(parent);
		this.initDragAndDrop();
	}

	@Override
	public void setFocus() {
		// TODO Auto-generated method stub

	}
	private void createTreeViewer(Composite parent) {
		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
		viewer.setContentProvider(new WidgetContentProvider());
		viewer.setLabelProvider(new WidgetLabelProvider());
		viewer.setInput(getViewSite());
		
	}
	protected void initDragAndDrop() {
		int ops = DND.DROP_COPY | DND.DROP_MOVE;
		Transfer[] transfers = new Transfer[] {
			TextTransfer.getInstance()	
		};
		TreeViewer viewer = this.getViewer();
		viewer.addDragSupport(ops, transfers, new WidgetDragAdapter(viewer));
		
	}

	public TreeViewer getViewer() {
		return viewer;
	}
	
	
}

 

initDragAndDrop()方法给TreeView添加了Drag支持。

public class DragAdapter extends DragSourceAdapter {
	private ISelectionProvider selectionProvider;

	public DragAdapter(ISelectionProvider selectionProvider) {
		this.selectionProvider = selectionProvider;
	}

	@Override
	public void dragSetData(DragSourceEvent event) {
		if(TextTransfer.getInstance().isSupportedType(event.dataType)) {
			event.data = getSelectedString();
			return;
		}
	}

		
}

 

DragAdapter非常简单,只要重写dragSetData方法将要传递的数据赋给event.data就可以了(还可以更复杂,这里只实现最基本的drag,可以参考Elcipse projects explore的实现)。

 

上面两个类实现了对一个Viewer的Drag支持,当然只有drag是不够的,需要有一个drop target来接受drag。上面的TreeView支持TextTransfer,其实任何一个支持接受TextTransfer的目标的view或者编辑器都可以作为drop target,比如wst的xml编辑器支持TextTransfer,因此可以直接从上面的viewer中向wst xml编辑器托文本。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值