天天看點

RCP學習:GEF編輯器的滑鼠的hover policy以及一個預覽視窗效果

GEF編輯器遵循MVC模式。在這裡Controller既是org.eclipse.gef.EditPart。它的行為是可以被一系列的政策(org.eclipse.gef.EditPolicy)确定的,見AbstractEditPolicy的方法:

我們自己定義的Policy可以在這個位置添加。

下面來定義一個滑鼠移動到節點上即可以做某些事情的Policy,該Policy要實作如下功能:

1、滑鼠移動到節點上的時候,繪制handle

2、滑鼠點選任何位置,handle消失

3、滑鼠移動到其他節點,繪制新的handle,之前的handle消失。

先看下效果圖:

1、這是一個普通的GEF節點,紅色和綠色手型标示着連線的端點

RCP學習:GEF編輯器的滑鼠的hover policy以及一個預覽視窗效果

2、當滑鼠移動到節點上,并且停留數秒的時候,繪制一個橙色手型覆寫紅色手型:

RCP學習:GEF編輯器的滑鼠的hover policy以及一個預覽視窗效果

3、當滑鼠點選該橙色手型,則出現可拖拽的連線提示(該部分功能由handle實作,暫不讨論):

RCP學習:GEF編輯器的滑鼠的hover policy以及一個預覽視窗效果

先來看看Policy的實作:

代碼有點多,不熟悉Policy的話,可以先從activate()方法讀起。這個Policy的作用是為hostFigure(就是MVC中的Viewer部分,也是該policy的宿主)添加監聽,通過一個Timer來控制handle的展示和消失。

該類為abstract類型,其實作子類需要提供createHoverHandles()的實作,該方法傳回一個List<Handle>。

如此,就可以把handle的效果和這個Policy結合起來了。

下面再提供一個利用CommonHoverEditPolicy實作預覽效果的例子。

先看效果圖:

1、這是一個普通的GEF編輯器:

RCP學習:GEF編輯器的滑鼠的hover policy以及一個預覽視窗效果

2、其中的每一個節點内容是被另一個表格編輯器所确定的:

RCP學習:GEF編輯器的滑鼠的hover policy以及一個預覽視窗效果

3、當滑鼠移動到節點上,稍作停留,便會彈出一個預覽框:

RCP學習:GEF編輯器的滑鼠的hover policy以及一個預覽視窗效果

該預覽框具備之前的表格編輯器的所有浏覽功能,可以點選,可以切換子頁。

實作方式:

1、重寫CommonHoverEditPolicy的createHoverHandles()方法。

可以看到,這裡并沒有提供可用的Handle(List<Handle>的内容是空的)。但是我們提供了一個Dialog,該Dialog為單例模式,通過對它的close和open控制,來實作handle一樣的效果。使用dialog而非handle的主要原因是,handle是基于draw2d的,内容需要繪制,但是我們需要的内容是一個SWT\Jface構成的表格編輯器。是以使用dialog比較合适。

繼續閱讀