gef中拖动拽动原理以及实现
方案一:
创建拖拽对象的工厂
package com.easyway.plugin.gef.diagram.dev.model;
import org.eclipse.gef.requests.CreationFactory;
/**
* 创建对象工厂
* @author longgangbai
*
*/
publicclass ElementFactory implements CreationFactory {
private Object template;
public ElementFactory(Object template) {
this.template = template;
}
/**
* 创建对象
* @see org.eclipse.gef.requests.CreationFactory#getNewObject()
*/
@Override
public Object getNewObject() {
try {
return ((Class) template).newInstance();
}
catch (Exception e) {
returnnull;
}
}
/**
* 创建对象工厂
* @see org.eclipse.gef.requests.CreationFactory#getObjectType()
*/
@Override
public Object getObjectType() {
returntemplate;
}
}
创建一个相关的拖动的类:用于实现拖动的功能。
package com.easyway.plugin.gef.diagram.dev.dnd;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
import org.eclipse.gef.requests.CreationFactory;
import com.easyway.plugin.gef.diagram.dev.model.ElementFactory;
/**
* 设置相关的拖动转换模板为监听器
* @author longgangbai
*
*/
publicclass DiagramTemplateTransferDropTargetListener extends TemplateTransferDropTargetListener {
/**
*
* @param viewer
*/
public DiagramTemplateTransferDropTargetListener(EditPartViewer viewer) {
super(viewer);
}
//------------------------------------------------------------------------
// Abstract methods from TemplateTransferDropTargetListener
/**
* 注入相关的工厂的信息
*/
protected CreationFactory getFactory(Object template) {
returnnew ElementFactory(template);
}
}
使用如下:
在相关的GraphicalEditorWithPalette类中使用代码如下:
//------------------------------------------
// Abstract methods from GraphicalEditor
protectedvoid initializeGraphicalViewer() {
// this uses the PartFactory set in configureGraphicalViewer
// to create an EditPart for the diagram and sets it as the
// content for the viewer
getGraphicalViewer().setContents(this.diagram);
getGraphicalViewer().addDropTargetListener(new DiagramTemplateTransferDropTargetListener(getGraphicalViewer()));
}
// Overridden methods from GraphicalEditorWithPalette
protectedvoid initializePaletteViewer() {
super.initializePaletteViewer();
getPaletteViewer().addDragSourceListener(
new TemplateTransferDragSourceListener(getPaletteViewer()));
}