快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
c void dragFinished(DragSourceEvent dsEvent) { } });

此处另外一个非常重要的假设是:CTabFolder 容器并没有已经创建好的拖放源。否则,代码 DragSource dragSource = new DragSource(tabFolder, operations); 就会触发一个 SWTError 错误,这是因为我们不能为同一个控件创建多个拖放源。

要查看这种假设是否有效(这也是 清单 1 的一个可能用途),让我们来看一下与这个编辑器标签有关的默认拖放行为。默认的行为提示说存放这个编辑器标签的 CTabFolder 容器可能早已为其创建了一个拖放源。然而,快速查看 org.eclipse.swt.custom.CTabFolder.java 的代码可以看到,CTabFolder 的默认拖放操作都不是通过创建一个拖放源来实现的,而是通过为 SWT.DragDetect、SWT.MouseMove 和 SWT.MouseUp 类型的事件添加监听程序来实现的。CTabFolder 容器还没有创建拖放源的假设仍然有效,正如我们可以看到的一样,这是基于查看非 API 内部类获得的信息而作出的假设。因此,如果这种假设在将来的版本中无效,也不用感到惊奇;不过我认为这种可能性非常小。

下面让我们来看一下如何捕获存放编辑器的 CTabFolder 容器。通过对编辑器平铺行为的观察,我们注意到不管在何时平铺显示编辑器,都会创建一个新的 Tab 文件夹。另外,当一个标签组中的所有编辑器全部关闭或被移动到一个不同的 Tab 文件夹上时,原来的 Tab 文件夹就会被销毁。这意味着 CTabFolder 容器的创建和销毁都是动态的,因此 CTabFolder 容器的拖放源的创建也应该是动态完成的。

要实现这种功能,需要能够对 CTabFolder 容器的创建进行控制。但是 Eclipse 并没有提供任何可以在创建 CTabFolder 容器时进行回调的功能。另外一种方法是对 CTabFolders 进行特殊化 (specialize) 处理(继承),继承这些 specialized CTabFolders(继承类,而不是基类 CTabFolder),并在这些 specialized CTabFolders 的 constructors 中创建拖放源。然而,在 Eclipse 中实例化这些 specialized CTabFolders 是一项非常繁杂的任务,因此我们需要寻找一种新的解决方案。

拖放Eclipse Workbench标签(3)

时间:2011-01-11 IBM Shiva Kumar

一种创建拖放源的新方法

下面让我们为 Display 添加一个拖放检测监听器(用来监听 SWT.DragDetect 类型的事件),如下所示:

清单 2. 为 Display 添加拖放监听器

PlatformUI.getWorkbench().getDisplay().addFilter(SWT.DragDetect, new Listener() {   public void handleEvent(Event event)   {   } });

不论何时发生拖放操作时,都会调用这个监听器的 handleEvent() 方法,其中 event.widget 指向产生这个事件的控件。在拖动编辑器标签时,event.widget 指向存放这个拖放编辑器标签的 CTabFolder 容器。这样我们现在就可以为这个 CTabFolder 容器创建一个拖放源,如下所示:

清单 3. 捕获存放编辑器的 Tab 文件夹

PlatformUI.getWorkbench().getDisplay().addFilter(SWT.DragDetect, new Listener() {   public void handleEvent(Event event)   {    //ignore drag of widgets other than tab-folders (which host editor and view tabs)    if(!(event.widget instanceof CTabFolder))     return;    CTabFolder draggedFolder = (CTabFolder)event.widget;    int operations = DND.DROP_COPY | DND.DROP_DEFAULT;    final DragSource dragSource = new DragSource(draggedFolder, operations);    Transfer[] transferTypes = new Transfer[] {EditorInputTransfer.getInstance()};    dragSource.setTransfer(transferTypes);    dragSource.addDragListener(new DragSourceListener()    {     public v

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号