GEF 外部组件到GEF编辑器的拖动支持

2024-01-24 03:32

本文主要是介绍GEF 外部组件到GEF编辑器的拖动支持,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在项目中,需要完成从资源管理器(navigator)向GEF编辑器中拖放结点的功能。

现总结个人体会如下(具体的实现流程,请参考http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html):

GEF封装了底层的SWT拖放。无需自己定义DragSource和DropTarget。

GEF的拖拽功能需要

(1).一个可以注册在GEF 中上的监听器,该监听器需实现TransferDropTargetListener接口,
一般来讲,直接继承AbstractTransferDropTargetListener类会更好些。
public class FileTransferDropTargetListener 
   extends AbstractTransferDropTargetListener { 
//初始化命令所需要的工厂,第二步创建  
private FileLabelFactory factory = new FileLabelFactory(); 
   public FileTransferDropTargetListener(EditPartViewer viewer, Transfer xfer) { 
      super(viewer, xfer); 
   } 
//红色字体应特别注意,这是拖放是否被接受的关键,他是拖放数据的注册类型。  
//应根据需求选择自己的类型,默认为处理文本拖放的TextTransfer   
   public FileTransferDropTargetListener(EditPartViewer viewer) { 
       super(viewer,FileTransfer.getInstance()); 
   } 
/*
*返回GEF中创建模型所需要的request,对request的设置采用工厂模式
*/ 
protected Request createTargetRequest() { 
   CreateRequest request = new CreateRequest(); 
   request.setFactory(factory); 
   return request; 

  
   protected void updateTargetRequest() {} 

public class FileTransferDropTargetListener
   extends AbstractTransferDropTargetListener {
//初始化命令所需要的工厂,第二步创建
private FileLabelFactory factory = new FileLabelFactory();
   public FileTransferDropTargetListener(EditPartViewer viewer, Transfer xfer) {
      super(viewer, xfer);
   }
//红色字体应特别注意,这是拖放是否被接受的关键,他是拖放数据的注册类型。
//应根据需求选择自己的类型,默认为处理文本拖放的TextTransfer
   public FileTransferDropTargetListener(EditPartViewer viewer) {
       super(viewer,FileTransfer.getInstance());
   }
/*
*返回GEF中创建模型所需要的request,对request的设置采用工厂模式
*/
protected Request createTargetRequest() {
   CreateRequest request = new CreateRequest();
   request.setFactory(factory);
   return request;
}
 
   protected void updateTargetRequest() {}
}
(2).一个生成拖放数据的工厂类,该类需实现CreationFactory 接口。
public class FileLabelFactory implements CreationFactory { 
   private String text = ""; 
/*该方法返回拖拽所产生的数据,应根据项目需求进行更改。一个可行的改良建
*议是在该工程类中创建template字段,并在构造函数中初始化,该方法根据
*template返回新的类型
*/ 
   public Object getNewObject() { 
      LogicLabel label = new LogicLabel(); 
      label.setLabelContents(text); 
      return label; 
   } 
/*该方法返回拖拽所产生数据的类型
*GEF中,将该数据的类型,设置到request中。从而帮助在对应的Editpart中完成*操作
*/ 
   public Object getObjectType() { 
      return LogicLabel.class; 
   } 
   public void setText(String s) { 
      text = s; 
   } 

public class FileLabelFactory implements CreationFactory {
   private String text = "";
/*该方法返回拖拽所产生的数据,应根据项目需求进行更改。一个可行的改良建
*议是在该工程类中创建template字段,并在构造函数中初始化,该方法根据
*template返回新的类型
*/
   public Object getNewObject() {
      LogicLabel label = new LogicLabel();
      label.setLabelContents(text);
      return label;
   }
/*该方法返回拖拽所产生数据的类型
*GEF中,将该数据的类型,设置到request中。从而帮助在对应的Editpart中完成*操作
*/
   public Object getObjectType() {
      return LogicLabel.class;
   }
   public void setText(String s) {
      text = s;
   }
}

(3).在GEF编辑器中,为GraphicalViewer注册该监听器,一般在initializeGraphicalViewer()方法中添加 
getGraphicalViewer().addDropTargetListener( new FileTransferDropTargetListener(getGraphicalViewer()));

DND拖放参数

一般在监听器中的处理拖动方法中,对拖动的操作类型进行设置。如:

protected void handleDragOver() {

   getCurrentEvent().detail = DND.DROP_COPY;

   super.handleDragOver();

}

DND.DROP_COPY 拖放创建一个新的copy
DND.DROP_LINK 拖放创建一个链接
DND.DROP_MOVE 拖放创建一个移动

(4).Transfer
Transfer是拖放的关键。不同类型的拖放数据,应在监听器的初始化时,选择合适的。
其中,TextTransfer默认处理文本拖动,FileTransfer默认处理文件拖动,在我的项目中,我采用的是LocalSelectionTransfer。

 

 

这篇关于GEF 外部组件到GEF编辑器的拖动支持的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/638418

相关文章

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

JavaWeb 中的 Filter组件详解

《JavaWeb中的Filter组件详解》本文详细介绍了JavaWeb中的Filter组件,包括其基本概念、工作原理、核心接口和类、配置方式以及常见应用示例,Filter可以实现请求预处理、响应后... 目录JavaWeb 中的 Filter 详解1. Filter 基本概念1.1 什么是 Filter1.

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

前端Visual Studio Code安装配置教程之下载、汉化、常用组件及基本操作

《前端VisualStudioCode安装配置教程之下载、汉化、常用组件及基本操作》VisualStudioCode是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,... 目录一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2

golang实现nacos获取配置和服务注册-支持集群详解

《golang实现nacos获取配置和服务注册-支持集群详解》文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户... 目录golang nacos获取配置和服务注册-支持集群初始化客户端可选参数配置new一个客户端 支

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理