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

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

vue2 组件通信

props + emits props:用于接收父组件传递给子组件的数据。可以定义期望从父组件接收的数据结构和类型。‘子组件不可更改该数据’emits:用于定义组件可以向父组件发出的事件。这允许父组件监听子组件的事件并作出响应。(比如数据更新) props检查属性 属性名类型描述默认值typeFunction指定 prop 应该是什么类型,如 String, Number, Boolean,

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

火语言RPA流程组件介绍--浏览网页

🚩【组件功能】:浏览器打开指定网址或本地html文件 配置预览 配置说明 网址URL 支持T或# 默认FLOW输入项 输入需要打开的网址URL 超时时间 支持T或# 打开网页超时时间 执行后后等待时间(ms) 支持T或# 当前组件执行完成后继续等待的时间 UserAgent 支持T或# User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

JavaEE应用的组件

1、表现层组件:主要负责收集用户输入数据,或者向客户显示系统状态。最常用的表现层技术是JSP,但JSP并不是唯一的表现层技术。 2、控制器组件:对于JavaEE的MVC框架而言,框架提供一个前端核心控制器,而核心控制器负责拦截用户请求,并将用户请求转发给用户实现的控制器组件。而这些用户实现的控制器则负责处理调用业务逻辑方法,处理用户请求。 3、业务逻辑组件:是系统的核心组件,实现系统的业务逻辑