快速业务通道

拖放Eclipse Workbench标签 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
oid dragStart(DragSourceEvent dsEvent) { }     public void dragSetData(DragSourceEvent dsEvent)     {      //code to perform operation-1 and operation-2     }     public void dragFinished(DragSourceEvent dsEvent)     {      dragSource.dispose();     }    });   } });

现在我们主要关心的是在开始拖放操作之后创建了一个新的拖放源。在开始拖放操作之后创建一个拖放源,这样做是否能够确保这个新的拖放源可以接收现在发生的拖放操作的通知?

为了寻找答案,首先让我们来了解一下 Eclipse 的事件分发行为。

当控件上产生某种类型的事件时,首先将是那些为相同事件类型注册的 Display 的所有过滤器 收到发生该事件的通知(使用 Display.addFilter() 方法添加的监听器),接收顺序是过滤器在 Display 上的注册顺序。然后发生该事件的通知会发送给控件中为该事件类型注册的所有监听器,发送顺序是这些监听器在控件上的注册顺序。

例如,假设 Listener 1 是在某个控件上为 t1 类型的事件注册的第一个监听器,而 Listener 2 是在这个控件上为相同的 t1 类型的事件注册的第二个监听器。另外假设 Filter 1 是在 Display 上为相同的 t1 类型的事件注册的过滤器。现在,当这个控件上产生一个 t1 类型的事件时,第一个接收到发生该事件的通知的是 Filter 1,然后是 Listener 1,最后是 Listener 2。

在这种新方法中,我们给 Display 为 SWT.DragDetect 类型的事件添加了一个 filter。默认拖放行为与编辑器标签有关,这意味着要对编辑器重新进行排列和平铺,说明 CTabFolder 存在多个拖放检测监听器。因此,我们有一个 filter 和多个与 CTabFolder 有关的 default-listeners,它们都要监听 SWT.DragDetect 事件。

当我们拖动一个编辑器标签时,filter 会第一个接收到这种拖动操作。在 filter 的 handleEvent() 方法中,我们正在创建一个 drag source,并为这个 drag-source 添加了一个 DragSourceListener。然后,它会向父 CTabFolder 容器注册了另外一个拖放检测监听器,我们称之为 drag-listener-x。因此,当程序控制返回 filter 的 handleEvent() 方法时,就会有一组 default-listeners 和 drag-listener-x 在等待接收拖动事件的通知。在通知 default set of listeners 之后,新注册的 drag-listener-x 也会接收到拖放事件的通知,这样就可以实现我们的目的了。

下图以图形方式显示了这些操作:

图 3. 拖放编辑器标签的序列图

拖放Eclipse Workbench标签 - 编程入门网

拖放Eclipse Workbench标签(4)

时间:2011-01-11 IBM Shiva Kumar

注意,在 dragFinished() 方法中(参见上面的 清单 3),我们对在 CTabFolder 容器上创建的 drag-source 进行了处理。实际上这是因为为每次拖放操作都创建了一个 drag-source,我们并没有对原来的 drag-source 进行处理,这会使问题变得更加复杂。对 drag-source 的处理还从 CTabFolder 的事件监听器表中删除了 drag-listener-x(它是在创建 drag-source 时添加的),如上面的 图 3 所示。

如何捕获所拖放编辑器的 IEditorInput 和 Editor ID?

下面让我们来看一下怎样在 dragSetData() 方法中实现 操作 1 和 操作 2。

由于编辑器与包含它的 CTabFolder 之间的映射并没有公开,因此可以依靠 IWorkbenchPage.getActivePart() 来获得正在拖放的工作台部分,从中可以很容易地提取出所需的信息,如下面的代码所示:

清单 4. 捕获所拖放编辑器的 editor-input 和 editor-id

public void dragSetData(DragSourceEvent dsEvent) {   IWorkbenchWindow workbenchWindow =    PlatformUI.getWorkbench().getActiveWorkbenchWindow();   IWorkbenchPart workbenchPartBeingDragged =  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号