`
javababy1
  • 浏览: 1220258 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

在RCP中实现用托拽打开Editor

阅读更多
工作台窗口的Editor区域默认是显示的,而且它支持拖拽操作。在Eclipse里面,把一个文件拖到Editor区域,就会自动打开该文件的Editor。该特性是在IWorkbenchWindowConfigurer 中设置。
在Password Gate中,当拖动Password Gate View中的一个Group 或者 Service到Editor区域,会在Editor显示该项的属性。
要实现此特性,有四部分是必须的。
1 实现必要的Transfer类型,而且定义Editor要支持哪些类型。在Password Gate中,Transfer是LocalSelectionTransfer。Transfer用来进行数据的序列化,它可以支持在同一个程序,或不同程序间拖拽。
2 因为在拖拽传递的过程中Editor Input 要实现序列化,所以要实现IPersistableElement接口。
3 加入一个释放适配器,当一个元素被扔到Editor区域,它可以知道如何进行操作,其实就是打开该元素的Editor。
4 使Password View能够进行拖操作,它要提供供拖的元素。
下面进行代码实现。

在RCP的WorkbenchWindowAdvisor. preWindowOpen中定义要求Editor Area支持的拖入对象的类型,以及打开相应Editor的事件。

ApplicationWorkbenchWindowAdvisor.preWindowOpen()

<!--CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt--><style type="text/css"> <!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--> </style> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- = Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard markus@jave.de = --><!-- = Further information: http://www.java2html.de = -->
<!-- start source code --> <!-- end source code -->
01publicvoidpreWindowOpen(){
02 ......
03configurer.addEditorAreaTransfer(LocalSelectionTransfer.getInstance());
04configurer.configureEditorAreaDropListener(newEditorAreaDropAdapter(
05configurer.getWindow()));
06}

Row 03定义了Editor Area支持的Transfer为LocalSelectionTransfer, LocalSelectionTransfer为自己实现的传输介质类。Row 04定义了对拖入Editor Area的对象的处理方法。EditorAreaDropAdapter实现了DropTargetListener接口,用来监听Editor Area中的Drop事件,它会打开拖入Editor Area的对象所对应的Editor,如果同时拖入多个对象,它会打开每个对象对应的Editor.

<!--CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt--><style type="text/css"> <!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--> </style> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- = Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard markus@jave.de = --><!-- = Further information: http://www.java2html.de = -->
<!-- start headline --> <!-- end headline --><!-- start source code --> <!-- end source code -->
EditorAreaDropAdapter.java
01publicclassEditorAreaDropAdapterextendsDropTargetAdapter{
02privateIWorkbenchWindowwindow;
03
04publicEditorAreaDropAdapter(IWorkbenchWindowwindow){
05this.window=window;
06}
07
08publicvoiddragEnter(DropTargetEventevent){
09//alwaysindicateacopy
10event.detail=DND.DROP_COPY;
11}
12
13publicvoiddragOperationChanged(DropTargetEventevent){
14//alwaysindicateacopy
15event.detail=DND.DROP_COPY;
16}
17
18publicvoiddrop(finalDropTargetEventevent){
19Displayd=window.getShell().getDisplay();
20finalIWorkbenchPagepage=window.getActivePage();
21if(page!=null){
22d.asyncExec(newRunnable(){
23publicvoidrun(){
24asyncDrop(event,page);
25}
26});
27}
28}
29
30privatevoidasyncDrop(DropTargetEventevent,IWorkbenchPagepage){
31if(LocalSelectionTransfer.getInstance().isSupportedType(
32event.currentDataType)){
33StructuredSelectionselection=(StructuredSelection)event.data;
34for(Iteratoriter=selection.iterator();iter.hasNext();){
35Objecto=iter.next();
36if(oinstanceofRecord){
37IEditorInputinput=newRecordEditorInput((Record)o);
38try{
39page.openEditor(input,RecordEditor.ID);
40}catch(Exceptione){
41PwdgatePlugin.log("openediotrRecordEditor",e);
42}
43}elseif(oinstanceofGroup){
44IEditorInputinput=newGroupEditorInput((Group)o);
45try{
46page.openEditor(input,GroupEditor.ID);
47}catch(PartInitExceptione){
48PwdgatePlugin.log("openediotrGroupEditor",e);
49}
50}
51}
52}
53}
54}

Row 18,用来处理Drop事件,Row 30的asyncDrop()方法用来打来相应对象的Editor.

现在Editor Area已经可以接收拖入对象了。下一步要使一个View支持拖出对象的功能。下面的例子是在Pass Gate View中的createPartControl()方法中为一个TreeViewer添加拖出功能。
<!--CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt--><style type="text/css"> <!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--> </style> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- = Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard markus@jave.de = --><!-- = Further information: http://www.java2html.de = -->
<!-- start headline --> <!-- end headline --><!-- start source code --> <!-- end source code -->
PassGateView.java
01privatevoidinitDragAndDrop(){
02Transfer[]transfer=newTransfer[]{LocalSelectionTransfer
03.getInstance()};
04LocalSelectionDragAdapteradapter=newLocalSelectionDragAdapter(
05viewer);
06viewer.addDragSupport(DND.DROP_MOVE|DND.DROP_COPY,transfer,adapter);
07
08LocalSelectionDropAdapterdropAdapter=newLocalSelectionDropAdapter(
09viewer);
10viewer.addDropSupport(DND.DROP_MOVE|DND.DROP_COPY,transfer,
11dropAdapter);
12}
Row 06 为TreeViewer添加了监听拖动的事件,当在TreeViewer中有拖动时,LocalSelectionDragAdapter把拖动的对象放入LocalSelectionTransfer中,通过其传到 Editor Area中。
<!--CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt--><style type="text/css"> <!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--> </style> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- = Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard markus@jave.de = --><!-- = Further information: http://www.java2html.de = -->
<!-- start headline --> <!-- end headline --><!-- start source code --> <!-- end source code -->
LocalSelectionDragAdapter.java
01publicclassLocalSelectionDragAdapterextendsDragSourceAdapter{
02
03ISelectionProviderselectionProvider;
04
05publicLocalSelectionDragAdapter(ISelectionProviderprovider){
06selectionProvider=provider;
07}
08
09publicvoiddragFinished(DragSourceEventevent){
10//TODOAuto-generatedmethodstub
11super.dragFinished(event);
12System.out
13.println("DragSourceListener.dragFinished(DragSourceEventevent)");
14}
15
16publicvoiddragSetData(DragSourceEventevent){
17System.out
18.println("DragSourceListener.dragSetData(DragSourceEventevent)");
19DragSourcedragSource=(DragSource)event.widget;
20Controlcontrol=dragSource.getControl();
21if(control!=control.getDisplay().getFocusControl()){
22event.doit=false;
23return;
24}
25
26IStructuredSelectionselection=(IStructuredSelection)selectionProvider
27.getSelection();
28
29if(selection.isEmpty()){
30event.doit=false;
31return;
32}
33LocalSelectionTransfer.getInstance().setSelection(selection);
34event.doit=true;
35}
36
37publicvoiddragStart(DragSourceEventevent){
38System.out
39.println("DragSourceListener.dragStart(DragSourceEventevent)");
40}
41}

<!-- = END of automatically generated HTML code = --><!-- ======================================================== --> Row 33 ,将拖动的对象放入LocalSelectionTransfer中。Row 44 设置拖动有效,设为false的话,拖动无效。下面是LocalSelectionTransfer的实现。很容易理解。

<!--CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt--><style type="text/css"> <!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--> </style> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- = Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard markus@jave.de = --><!-- = Further information: http://www.java2html.de = -->
<!-- start headline --> <!-- end headline --><!-- start source code --> <!-- end source code -->
LocalSelectionTransfer.java
001publicclassLocalSelectionTransferextendsByteArrayTransfer{
002
003privatestaticfinalStringTYPE_NAME="local-selection-transfer-format"+(newLong(System.currentTimeMillis())).toString();//$NON-NLS-1$;
004
005privatestaticfinalintTYPEID=registerType(TYPE_NAME);
006
007privatestaticfinalLocalSelectionTransferINSTANCE=newLocalSelectionTransfer();
008
009privateISelectionselection;
010
011privatelongselectionSetTime;
012
013/**
014*Onlythesingletoninstanceofthisclassmaybeused.
015*/
016privateLocalSelectionTransfer(){
017}
018
019/**
020*Returnsthesingleton.
021*
022*@returnLocalSelectionTransfer
023*/
024publicstaticLocalSelectionTransfergetInstance(){
025returnINSTANCE;
026}
027
028/**
029*Returnsthelocaltransferdata.
030*
031*@returnthelocaltransferdata
032*/
033publicISelectiongetSelection(){
034returnselection;
035}
036
037/**
038*Testswhethernativedropdatamatchesthistransfertype.
039*
040*@paramresult
041*resultofconvertingthenativedropdatatoJava
042*@returntrueifthenativedropdatadoesnotmatchthistransfertype.
043*falseotherwise.
044*/
045privatebooleanisInvalidNativeType(Objectresult){
046return!(resultinstanceofbyte[])
047||!TYPE_NAME.equals(newString((byte[])result));
048}
049
050/**
051*Returnsthetypeidusedtoidentifythistransfer.
052*
053*@returnthetypeidusedtoidentifythistransfer.
054*/
055protectedint[]getTypeIds(){
056returnnewint[]{TYPEID};
057}
058
059/**
060*Returnsthetypenameusedtoidentifythistransfer.
061*
062*@returnthetypenameusedtoidentifythistransfer.
063*/
064protectedString[]getTypeNames(){
065returnnewString[]{TYPE_NAME};
066}
067
068/**
069*Overridesorg.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(Object,
070*TransferData).Onlyencodethetransfertypenamesincetheselectionis
071*readandwritteninthesameprocess.
072*
073*@seeorg.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(java.lang.Object,
074*org.eclipse.swt.dnd.TransferData)
075*/
076publicvoidjavaToNative(Objectobject,TransferDatatransferData){
077byte[]check=TYPE_NAME.getBytes();
078super.javaToNative(check,transferData);
079}
080
081/**
082*Overrides
083*org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData).Testif
084*thenativedropdatamatchesthistransfertype.
085*
086*@seeorg.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData)
087*/
088publicObjectnativeToJava(TransferDatatransferData){
089Objectresult=super.nativeToJava(transferData);
090if(isInvalidNativeType(result)){
091PwdgatePlugin.log("invalidnattivetype",newException(
092"invalidnattivetype"));
093}
094returnselection;
095}
096
097/**
098*Setsthetransferdataforlocaluse.
099*
100*@params
101*thetransferdata
102*/
103publicvoidsetSelection(ISelections){
104selection=s;
105}
106
107/**
108*Returnsthetimewhentheselectionoperationthistransferisassociated
109*withwasstarted.
110*
111*@returnthetimewhentheselectionoperationhasstarted
112*
113*@seeorg.eclipse.swt.events.TypedEvent#time
114*/
115publiclonggetSelectionSetTime(){
116returnselectionSetTime;
117}
118
119/**
120*Setsthetimewhentheselectionoperationthistransferisassociated
121*withwasstarted.IfassigningthisfromanSWTevent,besuretouse
122*<code>setSelectionTime(event.time&0xFFFF)</code>
123*
124*@paramtime
125*thetimewhentheselectionoperationwasstarted
126*
127*@seeorg.eclipse.swt.events.TypedEvent#time
128*/
129publicvoidsetSelectionSetTime(longtime){
130selectionSetTime=time;
131}
132}
其实不光是拖到Area Editor,以上例子稍加改造,也可以实现拖到别的控件中,任何Control都可以添加托拽功能,例如可以从一个表格拖到另一个表格中,或拖到一个面板中。托拽功能让软件的可用性又提高了一个档次。
分享到:
评论

相关推荐

    RCP的VIEWER和EDITOR

    在Eclipse IDE中,当我们打开一个文件进行编辑时,就是在使用EDITOR。EDITOR提供了丰富的功能,如撤销/重做、查找替换、格式化等,以支持高效的编辑操作。 RCP中,VIEWER和EDITOR可以通过Part和Composite设计模式...

    rcp editor实例的项目代码

    这个类会实现打开、保存、关闭编辑器等基本操作,并定义编辑器的UI视图。 2. **编辑器输入**:编辑器需要处理的输入通常由`IEditorInput`接口表示。这可以是文件、数据库记录或其他任何数据源。在项目代码中,你...

    eclipse rcp demo例子 view editor 图表

    本示例是一个Eclipse RCP的实战演示,展示了如何在Eclipse RCP应用中实现View和Editor,以及可能涉及图表的展示。 在Eclipse RCP中,View和Editor是两种主要的用户界面组件。View通常用于显示辅助信息或工具,而...

    RCP入门 View Editor

    RCP允许开发者专注于业务逻辑的实现,而不必过于关注用户界面的设计,因为RCP已经提供了一系列预定义的界面元素,如菜单、工具栏、视图(View)和编辑器(Editor)。 **1. 菜单栏(Menu Bar)和工具栏(Tool Bar)*...

    rcp editor实例的项目代码2

    本项目"rcp editor实例的项目代码2"是针对Eclipse插件开发的一个实战案例,旨在帮助开发者了解和掌握如何在Eclipse RCP环境中实现自定义编辑器。 首先,我们需要理解Eclipse插件开发的基本概念。Eclipse是一个开放...

    RCP中adapter实现属性视图

    在实现中,你需要根据实际的模型数据来提供属性的描述符、值和设置逻辑。 3. **注册适配器**:在RCP应用中,适配器不能自动工作,需要通过适配器工厂(AdapterFactory)进行注册。你需要在插件的元数据文件(plugin...

    rcp的文本编辑器的实例

    在这个实例中,我们将深入探讨如何在RCP环境中实现一个基本的文本编辑器,帮助初学者更好地理解这一过程。 首先,我们需要了解Eclipse RCP的基本结构。RCP应用通常由多个插件组成,每个插件都有特定的功能。在这个...

    Eclipse RCP中使用第三方包

    然而,在实际开发中,我们经常需要使用第三方包来实现某些功能,这篇文章将介绍如何在Eclipse RCP中使用第三方包。 首先,我们需要新建一个Eclipse RCP应用程序,然后创建一个lib目录作为存放第三方库的目录。在这...

    RCP中文入门教程.rar

    在“RCP中文入门教程.pdf”中,你可能会学习到如何创建一个新的RCP项目,编写插件,定义扩展点,创建视图和编辑器,以及如何管理和配置用户的首选项。教程还可能涵盖如何调试和打包RCP应用,以及如何利用Eclipse的...

    在RCP中显示JFreeChart报表

    在本文中,我们将深入探讨如何在Eclipse Rich Client Platform (RCP)应用程序中集成和显示JFreeChart报表。JFreeChart是一个强大的Java库,用于创建各种图表类型,如折线图、柱状图、饼图等,而RCP是Eclipse框架的一...

    java中RCP中使用JNI

    在Java RCP中使用JNI,主要是为了访问特定于平台的功能,提升性能,或者调用已有的本地库。 1. **JNI简介** JNI是一种接口,允许Java代码与其他语言编写的代码进行通信。它定义了一套规范,使得Java虚拟机(JVM)...

    在Eclipse RCP中实现控制反转(IoC).doc

    在Eclipse RCP环境中,为了实现IoC而不改动其基础结构,可以使用动态字节码操作(如ObjectWeb ASM库)、Java类加载器代理和Java注解技术。这样可以在不影响平台其他部分的情况下,透明地添加IoC框架。 在具体应用中...

    基于适配器模式的RCP应用属性视图实现

    本文将深入探讨如何在基于Eclipse RCP(Rich Client Platform)的应用中,利用适配器模式实现自定义的属性视图。Eclipse RCP是一个强大的框架,用于构建桌面应用程序,而属性视图则是展示对象属性的一种可视化组件。...

    Eclipse RCP程序ViewPart占位功能的实现

    本教程将深入探讨如何在Eclipse RCP程序中实现ViewPart的占位功能,这对于构建具有多视图的工作环境至关重要。 首先,我们需要理解ViewPart的基本概念。在Eclipse RCP中,ViewPart是用户界面中的一个组件,它通常...

    RCP程序中集成其他插件的配置方法

    在IT行业中,RCP(Rich Client Platform)是Eclipse框架提供的一种用于构建桌面应用程序的平台。它允许开发者基于已有的框架构建复杂、可扩展的应用,而无需从零开始编写所有基础架构。本篇文章将深入探讨如何在RCP...

    实现 RCP 应用程序的步骤

    在RCP应用中,业务逻辑通常由命令(Command)和控制器(Handler)实现。命令定义了用户可以执行的操作,而控制器则负责执行这些操作。在`plugin.xml`中定义命令,并创建对应的控制器类。 7. **事件监听与通信** ...

    RCP,RCP开发

    在RCP中,OSGI作为底层的模块化框架,为RCP提供了动态加载和管理插件的能力。开发者可以通过创建OSGI Bundle来构建RCP插件,这些插件可以在运行时被RCP框架动态加载和卸载。这种结合使得RCP应用具备了高度的灵活性和...

    rcp视图中嵌套eclipse使用内部浏览器加载echarts

    eclipse使用内部浏览器加载echarts,过程中可能存在鼠标移动事件不响应,这个是eclipse浏览器中与echarts.js内兼容问题,该问题可通过修改echarts.js解决,如果找不到可以私信我

Global site tag (gtag.js) - Google Analytics