Enhanced RCP: How views can communicate – The e4 way | Tomsondev Blog
Some weeks ago I published how views can communicate using the EventAdmin-Service. To get things working in an 3.x application one has to write some glue code but more importantly one has to know about all those nifty things about event publishing, getting access to OSGi-Services, … .
One of the main topics of the Eclipse 4 Application Platform was to make easy things easy by removing the need to know about all the concepts by hiding them using DI. The service responsible to deliver events in application built on top the Eclipse 4 Application Platform is the EventBroker-Service:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package org.eclipse.e4.core.services.events;public interface IEventBroker { public String DATA = "org.eclipse.e4.data"; //$NON-NLS-1$ public boolean send(String topic, Object data); public boolean post(String topic, Object data); public boolean subscribe(String topic, EventHandler eventHandler); public boolean subscribe(String topic, String filter, EventHandler eventHandler, boolean headless); public boolean unsubscribe(EventHandler eventHandler);} |
This is all we need to know (assuming we have already understood how DI-works) to implement our sender and receiver views:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class SenderView { @Inject private IEventBroker eventBroker; private Button b; @PostConstruct void init(Composte parent) { parent.setLayout(new GridLayout()); b = new Button(parent, SWT.PUSH); b.setText("Send Event"); b.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Date d = new Date(); eventBroker.send("viewcommunication/syncEvent",d); eventBroker.post("viewcommunication/asyncEvent", d); } }); } @Focus void focus() { b.setFocus(); }} |
These are some fewer lines of code which is good but IMHO the more important fact is that you are independent from OSGi running now so the code you have there is much easier testable by simply mocking IEventBroker!
Let’s look now at the receiver side of the story. If you take a look at the IEventBroker you see the subscribe methods which allows us to subscribe to various topics so we could as a first step implement it like this:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
public class ReceiverView { @Inject private IEventBroker eventBroker; private TableViewer viewer; @PostConstruct public void init(final Composite parent) { parent.setLayout(new FillLayout()); viewer = new TableViewer(parent); viewer.getTable().setHeaderVisible(true); viewer.getTable().setLinesVisible(true); viewer.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return DateFormat.getDateTimeInstance().format(element); } }); EventHandler handler = new EventHandler() { public void handleEvent(final Event event) { if( parent.getDisplay().getThread() == Thread.currentThread() ) { viewer.add(event.getProperty(IEventBroker.DATA)); } else { parent.getDisplay().syncExec(new Runnable() { public void run() { viewer.add(event.getProperty(IEventBroker.DATA)); } }); } } }; eventBroker.subscribe("viewcommunication/*",handler); } @Focus void focus() { viewer.getTable().setFocus(); }} |
This is once more making your code looser coupled because you are independent from OSGi running but we can do even better by fully leveraging the Eclipse DI-Framework. By default Eclipse DI injects data it has stored in its IEclipseContext (you can think of the IEclipseContext as a Map where the value is thing that gets injected into you “POJO”).
The important thing for us is that one can extend Eclipse DI to consult other resources like e.g. Preferences (@Preference) and e.g. Event-Data (@EventTopic) – a blog post explaining how this works will follow hopefully soon.
So we can rewrite our receiver code like this:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public class ReceiverView { private TableViewer viewer; @PostConstruct public void init(final Composite parent) { parent.setLayout(new FillLayout()); viewer = new TableViewer(parent); viewer.getTable().setHeaderVisible(true); viewer.getTable().setLinesVisible(true); viewer.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return DateFormat.getDateTimeInstance().format(element); } }); } @Inject void eventReceived(@EventTopic("viewcommunication/*") Date date) { Display d = viewer.getControl().getDisplay(); if( d.getThread() == Thread.currentThread() ) { viewer.add(date); } else { parent.getDisplay().syncExec(new Runnable() { public void run() { viewer.add(date); } }); } } @Focus void focus() { viewer.getTable().setFocus(); }} |
[Update 2011-02-07] – Start
But we can do even better so that we don’t need to take of the UI-Thread syncing all we need to do is use another annotation:
|
1
2
3
4
|
@Inject void eventReceived(@UIEventTopic("viewcommunication/*") Date date) { viewer.add(date); } |
Now the DI-Framework takes care of the Event loop syncing. Thanks to Brian de Alwis for pointing this out.
[Update 2011-02-07] – End
If you are interested in how you can use things like this in your Eclipse 3.x applications and you are going to be at EclipseCon you should come to my talk about “Singlesourcing for Eclipse 4.x and Eclipse 3.x”
Enhanced RCP: How views can communicate – The e4 way | Tomsondev Blog的更多相关文章
- django复习笔记3:urls/views/templates三板斧
0.先看看文件结构 mysite/ mysite/ ├── __pycache__ │ └── manage.cpython-.pyc ├── blog │ ├── __init__.py │ ...
- Materialized Views 物化视图 -基础篇
Materialized Views 物化视图 -基础篇 http://blog.csdn.net/elimago/article/details/5404019
- Django+Tastypie作后端,Backbone作前端的TodoMVC
TodoMVC是各种js框架入门的比较经典的例子,详细可查看github地址https://github.com/tastejs/todomvc 接着上篇文章, 1,先在github上把backbon ...
- Tastypie 学习笔记
Tastypie是什么? 运行于Python环境中的 Django web服务器下的 Restful 风格API接口 (python 类库) 1.安装下面环境或者依赖包到python库(安装过程类似 ...
- django 富文本展示 以及 post提交出错
1.富文本转义 使用 {{ content.record.content | safe }} 2.post提交报错 页面表单内追加 <form id="f"action=&q ...
- python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 1. 创建一个 zqxt_tm ...
- 巧用freemarker
使用Freemarker宏进行可扩展式模块化编程 该文是转载而来,并非我本人所写,但是觉得真心不错,所以收藏一下 一.前言 今天的文章聊一下freemarker的一些特性:宏,我们将使用它写出一些模块 ...
- curl operate elasticsearch
export elasticsearchwebaddress=localhost:9200# 1. Add documentcurl -X PUT "$elasticsearchwebadd ...
- 使用Freemarker宏进行可扩展式模块化编程
作者:Chu Lung 原文链接:http://blog.chulung.com/article/13 本文由MetaCLBlog于2016-07-08 14:42:10自动同步至cnblogs 一. ...
随机推荐
- HTML常用标签和属性大全
html标签< <marquee>...</marquee>普通卷动 <marquee behavior=slide>...</marquee>滑 ...
- java 转义字符
\t 相当于tab,缩进\n 回车\r 换行\b 换成 一个黑点
- ASP.NET的票据工具类FormsAuthenticationTicket
票据是asp.net登录验证的一种方式,以前研究过,现在并不使用,今天发现了,记录一下. /*###################票据工具################### * 1.设置< ...
- ajax中的setRequestHeader设置请求头
1.问题引发点: 前不久发现一个问题: 前端并没有设置请求头信息里面的Accept-Encoding:gzip...但是在请求头中可以明显的看到Accept-Encoding:gzip, deflat ...
- java中的CountDownLatch
闭锁是一种同步工具类,可以延迟线程的进度直到其达到终止状态.闭锁的作用相当于一扇门:在闭锁到达结束状态值钱,这扇门一直是关闭的,没有任何线程可以通过,当到大结束状态时,这扇门会打开并允许所有的线程通过 ...
- Differential Geometry之第四章标架与曲面论的基本定理
第四章.标架与曲面论的基本定理 1.活动标架 2.自然标架的运动方程 爱因斯坦求和约定(Einstein summation convention) 3.曲面的结构方程 4.曲面的存在唯一性定理 5. ...
- 用原生js模仿jquery
阅读声明:本文档仅供学习,由于个人能力有限,文档中有错漏的地方还请指出,大家共同学习. 目前在学习怎么样写jquery,模仿阶段,有兴趣的同学可以和我一起学习,共同交流,在学习的路上希望有你做伴. 在 ...
- 9种CSS3炫酷图片展开预览展示动画特效
详细内容请点击 在线预览立即下载 这是一组共9款CSS3炫酷图片预览展示动画特效插件.css的新特性可以让我们制作出各种炫酷的动画效果.该图片预览展示动画特效就是一个很好的例子,该效果开始时图片堆叠在 ...
- Part 5 Select statement in sql server
Select specific or all columns select * from 表名 select * from Student select 列名,列名... from 表名 select ...
- 北大ACM(POJ1013-Counterfeit Dollar)
Question:http://poj.org/problem?id=1013 问题点:排除+验证. Memory: 244K Time: 16MS Language: C++ Result: Acc ...