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 一. ...
随机推荐
- windows10上安装 .NET Framework 3.5
在安装一些软件时,需要 .NET Framework3.5.按照windows给的提示下载不了.在官方网站上给了解决方案: 运行 DISM 工具 从屏幕右边缘向中间轻扫,然后点击“搜索”.(如果使用的 ...
- 使用post方式提交数据
post提交代码 public class MainActivity extends Activity { @Override protected void onCreate(Bundle saved ...
- [设计模式] .NET设计模式笔记 - 有多少种设计模式
.NET下的23中设计模式. ※创建型模式篇 ●单件模式(Single Pattern) ●抽象工厂模式(Abstract Factory) ●建造者模式(Builder Pattern) ●工厂方法 ...
- 【Shell脚本学习20】Shell until循环
until 循环执行一系列命令直至条件为 true 时停止.until 循环与 while 循环在处理方式上刚好相反.一般while循环优于until循环,但在某些时候,也只是极少数情况下,until ...
- 利用Android手机里的摄像头进行拍照
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 1.在API Guides中找到Camera,里面讲解了如何使用系统自带的摄像头进行工作,之后我会试着翻 ...
- unity中UI界面显示FPS
直接上代码 using UnityEngine; using System.Collections; public class HUDFPS : MonoBehaviour { ...
- jq使用手册
jq 使用手册 翻译整理:Young.J 官方网站:http://jquery.com jQuery是一款同prototype一样优秀js开发库类,特别是对css和XPath的支持,使我们写 ...
- React Native视频播放(iOS)
网站链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/learn-react-native-video/ React Nativ ...
- codeforces 678C C. Joty and Chocolate(水题)
题目链接: C. Joty and Chocolate time limit per test 1 second memory limit per test 256 megabytes input s ...
- Linux之apt-get无sudo权限安装软件
apt-get source package cd package ./configure --prefix=$HOME make make install