`
qq123zhz
  • 浏览: 525110 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

RCP 视图间的交互机制

阅读更多

有时候一个视图(View)希望得到另外一个视图显示的内容,或者选择的内容。在Eclipse中,比较标准的做法是通过ISelectionProviderISelectionListener来完成的。不过因为视图往往是独立的,他们之间并不太方便进行直接的事件监听,而且往往一个视图需要对诸多试图进行选择事件的监听,因此在这种情况下对每一个视图的事件进行注册,比较繁琐,有时候也不可能(比如在需要被监听的试图尚未激活的情况下)。

比较典型的例子就是Eclipse本身所提供的PropertySheetOutline这两个视图,他们都是对其它试图或者Editor中的选择进行监听,并更具选择的内容作相应的处理,显示其Outline或者属性页。

 Eclipse为了解决这个问题,提供了所谓的Site,以及ISelectionService机制,来处理试图之间的简单的交互。简单的说,ViewSite提供了一个交互的中心点,其它ViewViewSite提供选择事件,或者向其注册监听器,而事件的触发与转发则由ViewSite()来完成。

这应该也是一个设计模式,不过我还没想到比较接近的设计模式的名字。如果勉强要使用一个的话,我认为“Mediator”(调停者模式)可能比较适合(欢迎发表见解)。 

调停者模式Blabla...

为了在这个机制中扮演角色,视图通常需要实现两类接口,或者Adapter。首先是作为被监听方的视图,需要实现ISelectionProvider接口。ISelectionProviderJface中引入的接口。

       public interface ISelectionProvider {

           public void addSelectionChangedListener(ISelectionChangedListener listener);

           public ISelection getSelection();

           public void removeSelectionChangedListener(

                   ISelectionChangedListener listener);

           public void setSelection(ISelection selection);

       }

方法都比较简单,不做一一阐述。具体实现时,可能需要进行所谓的hookControl,也就是将View中具体控件的事件,关联到这个View所提供的ISelectionProvider上,简单的一个例子,如果View中控件是一个TableViewer的话,那么可以做如下的操作:

       protected void hookControl(Control control) {

       tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){

              public void selectionChanged(SelectionChangedEvent event) {

                     ISelection selection2 = event.getSelection();

                     setSelection(selection2);

              }

       });

       }

 

然后再setSelection()中对事件进行扩散(propagate

       public void setSelection(ISelection selection) {

              this.selection = selection;

              SelectionChangedEvent event2 = new SelectionChangedEvent(

                            OntIndividualEditor.this, selection);

              for (Iterator i = selectionChangeListeners.iterator(); i.hasNext();) {

                     ISelectionChangedListener object = (ISelectionChangedListener) i

                                   .next();

                     object.selectionChanged(event2);

              }

       }

 

一个ISelectionProvider如果希望被别的View进行监听的话,则应该向其Site()进行注册:

       this.getSite().setSelectionProvider(this);

如果事件比较简单,比如上面的例子,只是对TableViewer的选择进行监听,因为TableViewer本身就是一个ISelectionProvider,因此可以直接这样做:

       this.getSite().setSelectionProvider(tableViewer);

这样View本身就不必实现ISelectionProvider接口了,但是实现的效果同上面的方式实现的是一样的。

 作为事件监听的另一端,则更为简单一些。只需要实现ISelectionListener接口,并注册在Site中:

       site.getPage().addSelectionListener(this);

然后实现public void selectionChanged(IWorkbenchPart part, ISelection selection) {}方法即可。这样,当SelectionProvider中的选择发生改变时,这个视图中的selectionChanged()方法就会被调用。

 注意SelectionProviderSelectionListener并不直接对应。这个地方有一点容易混淆,就是Eclipse实际上提供有两套与Selection相关的事件与接口:

ISelectionChangedListener <--> ISelectionProvider

这个是JFace中的选择监听机制,对试图或者控件而言,它提供对原始的选择事件的通知与响应。ISelectionProvider需要注册在Site上,以供ISelectionSerivce使用,将选择事件扩散到其他的ISelectionListener中。

ISelectionListener <--> ISelectionService

这个是在Site中使用的,ISelectionService不需要自己实现,已经实现好了,ISelectionListener则需要注册到ISelectionService上,以对其它SelectionProvider的事件响应进行监听。

 Eclipse本身的实现中,PropertySheetOutline都使用了这种机制。不过需要注意的是,缺省的PropertyShee需要接受一个IStructuredSelection,而不仅仅是一个ISelection。因此,如果ISeletionProvider需要提供一个能够让PropertySheet进行显示的对象的话,除了除了要实现ISelection接口外,还需要对其进行封装成一个IStructuredSelection。这个比较简单,直接调用StructuredSelection构造函数即可。

 

分享到:
评论

相关推荐

    RCP 视图显示GEF图

    用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);

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

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

    RCP 打开视图的不同实例,并设置不同的值,工程代码可运行

    RCP 打开视图的不同实例,并设置不同的值 ,创建一个视图,里面布局用了个tableviewer,通过一个Action,按钮打开该视图,每次打开的视图的内容可设置不同。 说明文档为 ...

    RCP中adapter实现属性视图

    RCP中使用adapter扩展模型为IPropertySource,达到显示属性视图的目的;详细介绍了各种适配器方式。

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

    基于适配器模式的RCP应用属性视图实现,在做RCP或者Eclipse插件开发的朋友可以用到的,关于如何自定义属性栏信息

    RCP,RCP开发

    RCP&OSGI;

    RCP在线升级,RCP在线升级

    RCP在线升级RCP在线升级RCP在线升级RCP在线升级RCP在线升级

    EclipseRCPWizrdPage动态实现方法

    针对Eclip se RCPWizardPage的静态实现难以解决各输入页间数据关联的功能局限性问题,分析WizardPage 的运行机理和动态实现的技术难点,提出一种基于观察者模式的Eclip se RCPWizardPage动态实现方法,使业务对象低耦 ...

    RCP 界面布局实例

    RCP 界面布局实例 主要描述视图布局

    RCP 插件项目自学的教程

    有关rcp项目创建,视图创建。 开发插件项目基础

    论文研究-Eclipse RCP的扩展点与扩展机制研究 .pdf

    Eclipse RCP的扩展点与扩展机制研究,金星善,库少平,RCP (Rich Client Platform) 是基于Eclipse开发平台而推出的一套用来开发富客户端程序的应用框架。Eclipse的插件机制,使得我们可以通过扩展Ecli

    RCP项目导出exe 步骤

    RCP导出EXE 老大难问题。 RCp 程序导出步骤,保证能够导出~

    eclipse 3.6 rcp 开发

    Eclipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作. ...

    eclipse rcp 自学教程

    clipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作 ...

    rcp日期控件

    nebula项目的日期控件,提供rcp视图内嵌功能

    Eclipse RCP详细教程

    7.1.向程序中添加视图模板 31 7.2.向应用程序添加VIEW 36 7.3.向VIEW里添加action 40 8.和编辑器一起工作 51 8.1.概述 51 8.2.创建工程 51 8.3.创建并准备domain 模型 51 8.4.在视口中使用domain模型...

    RCP程序设计自学RCP的教程

    有关rcp的内容 是rcp入门的好帮手,rcp自学的好帮手

    RCP 常见的扩展点指南

    RCP 常见的扩展点指南 RCP最精华的部分之一,详细分析了RCP如何建立扩展点的。

    Eclipse RCP开发教程

    Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT

    RCP项目的登录窗体 RCP项目的登录窗体

    RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体

Global site tag (gtag.js) - Google Analytics