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

RCP 视图交互 ISelectionProvider和ISelectionListener,只响应鼠标左键

阅读更多

 

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

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

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

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

调停者模式
Blabla...

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

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() 方法就会被调用。

 

 

 

以上是网上搜索出来的,确实是正确的,但是本人在使用过程中发现,鼠标右键点击也会触发视图的交互,所以我改进了:

 

protected void hookControl(Control control) {

tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){

public void selectionChanged(SelectionChangedEvent event) {

ISelection selection2 = event.getSelection();

setSelection(selection2);

}

});

}

 替换为:

viewer.getTree().addMouseListener(new MouseAdapter() {

			@Override
			public void mouseDown(MouseEvent e) {
				super.mouseDown(e);
				//鼠标右键不执行读取视图表格内容的操作
				if (e.button == 3) {
					return;
				}else
				{
					ISelection selection2 = viewer.getSelection();
					setSelection(selection2);
				}
			}
		});
 

 

分享到:
评论

相关推荐

    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 提供捷径的实用 Eclipse 系统类

    如 SafeRunner 提供了异常记入日志的功能、BusyIndicator 可以屏蔽鼠标事件,使得当前程序专注于处理一件事,而不使程序出现死的状态,鼠标变为漏斗状。本文尽可能详细的介绍这些类,用示例代码展示它们的用法,相信...

    RCP,RCP开发

    RCP&OSGI;

    RCP在线升级,RCP在线升级

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

    RCP与GEF课件,介绍RCP和GEF各组成部分和工作原理

    RCP与GEF的课件,简单的介绍了RCP和GEF中的各组件的功能,已经工作流程

    使用EclipseRCP进行桌面程序开发(三):视图和透视图

    火龙果软件工程技术中心 EclipseRCP开发中,和用户进行交互最多的界面,应该是视图了,而透视图就是将已有的视图、菜单、工具栏、编辑器等等进行组合和布局。看完这一节,我们就可以建立如下图这样的程序界面了。...

    eclipse 3.6 rcp 开发

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

    RCP的VIEWER和EDITOR

    RCP的VIEWER和EDITOR做成的压缩包,可以下载了看看,是转载了别人的,不过忘了哪弄的了

    eclipse rcp 自学教程

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

    RCP项目导出exe 步骤

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

    RCP 插件项目自学的教程

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

    Eclipse RCP详细教程

    1.2.Eclipse RCP 建设风格——插件,扩展和扩展点 1 2.创建你的第一个RCP程序 1 2.1.创建一个RCP程序 2 2.2.启动你的RCP程序 5 2.3.应用程序VS 产品 6 3.应用程序里的插件ID 7 4.Actions的用法(菜单和...

    RCP 界面布局实例

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

    RCP 常见的扩展点指南

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

    RCP弹出日期控件

    RCP系统使用的弹出式日期控件,可切换上月下月,前一年后一年,可选择年、月

    RCP程序设计自学RCP的教程

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

Global site tag (gtag.js) - Google Analytics