http://www.ibm.com/developerworks/cn/opensource/os-ecllink/
?
1:IPartListener 对每个part的监听,如:关闭、隐藏。。。等。 所以 每个part的状态你的可以检测到。
?
很有用的:
1:你可以在每个窗口关闭后,删除 对应工具栏 ,打开时 在添加对应工具栏。
2: 在每个窗口关闭后,另外窗口作出相应变化。
?
?
?
注册方式: this.getSite().getPage().addPartListener(listener)
2:ISelectionListener 这个与ISelectionProvider 配合使用,对选择的内容进行实时监听。
?
注册监听:this.getSite().getPage().addSelectionListener(listener)
注册选择提供者:this.getSite().setSelectionProvider(provider)
?
- 在RCP编程时,我们经常要取得IWorkbenchPage,如果是从视图中得到,可以用下面的方法:
在RCP编程时,我们经常要取得IWorkbenchPage,如果是从视图中得到,可以用下面的方法:
- IWorkbenchPage workbenchPage = getViewSite().getPage();
IWorkbenchPage workbenchPage = getViewSite().getPage();
- 有时不是从视图,而是要从外部取得IWorkbenchPage,例如从菜单或者工具栏等,这时,可以使用下面的方法:
有时不是从视图,而是要从外部取得IWorkbenchPage,例如从菜单或者工具栏等,这时,可以使用下面的方法:
- IWorkbenchPage workbenchPage = Plugin.getDefault().getWorkbench().
- getActiveWorkbenchWindow().getActivePage();
IWorkbenchPage workbenchPage = Plugin.getDefault().getWorkbench(). getActiveWorkbenchWindow().getActivePage();
- 其中的Plugin是你的RCP最初建立时一般由Eclipse生成的,其父类为AbstractUIPlugin,当然,你也可以自己写。
- 一般申明为:
其中的Plugin是你的RCP最初建立时一般由Eclipse生成的,其父类为AbstractUIPlugin,当然,你也可以自己写。 一般申明为:
- /* The activator class controls the plug-in life cycle */
/* The activator class controls the plug-in life cycle */
- public class AuditPlugin extends AbstractUIPlugin {
public class AuditPlugin extends AbstractUIPlugin {
- 还有一种方法也可以得到:
还有一种方法也可以得到:
- IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().
- etActiveWorkbenchWindow().getActivePage();
IWorkbenchPage workbenchPage = PlatformUI.getWorkbench(). getActiveWorkbenchWindow().getActivePage();
- 在程序中的实例: //得到IworkbenchPage对象,找到com.raul.views.ShootViewPart这个视图,
- 然后执行视图里面的射门方法
在程序中的实例: //得到IworkbenchPage对象,找到com.raul.views.ShootViewPart这个视图,然后执行视图里面的射门方法
- update.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- IWorkbenchPage workbenchPage = Activator.getDefault().
- getWorkbench().getActiveWorkbenchWindow().getActivePage();
- ShootViewPart shootView = (ShootViewPart)
- workbenchPage.findView("com.raul.views.ShootViewPart");
- shootView.shoot(); } });
update.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IWorkbenchPage workbenchPage = Activator.getDefault(). getWorkbench().getActiveWorkbenchWindow().getActivePage(); ShootViewPart shootView = (ShootViewPart) workbenchPage.findView("com.raul.views.ShootViewPart"); shootView.shoot(); } });
- 有的时候,我们需要获取目标视图中当前选择的元素,可以直接这样做:
有的时候,我们需要获取目标视图中当前选择的元素,可以直接这样做:
- IViewPart viewPart = AuditPlugin.getDefault().getWorkbench() .getActiveWorkbenchWindow().
- getActivePage().findView("org.eclipse.ui.navigator.ProjectExplorer");
- StructuredSelection sl = (StructuredSelection) viewPart.getSite().getSelectionProvider().
- getSelection(); Object obj = sl.getFirstElement();
IViewPart viewPart = AuditPlugin.getDefault().getWorkbench() .getActiveWorkbenchWindow(). getActivePage().findView("org.eclipse.ui.navigator.ProjectExplorer"); StructuredSelection sl = (StructuredSelection) viewPart.getSite().getSelectionProvider(). getSelection(); Object obj = sl.getFirstElement();
- //然后对obj进行各种操作这样就只用知道视图的id即可,不需要转换该视图类。
有时候一个视图(View)希望得到另外一个视图显示的内容,或者选择的内容。在Eclipse中,比较标准的做法是通过ISelectionProvider和ISelectionListener来完成的。不过因为视图往往是独立的,他们之间并不太方便进行直接的事件监听,而且往往一个视图需要对诸多试图进行选择事件的监听,因此在这种情况下对每一个视图的事件进行注册,比较繁琐,有时候也不可能(比如在需要被监听的试图尚未激活的情况下)。 比较典型的例子就是Eclipse本身所提供的PropertySheet和Outline这两个视图,他们都是对其它试图或者Editor中的选择进行监听,并更具选择的内容作相应的处理,显示其Outline或者属性页。 Eclipse为了解决这个问题,提供了所谓的Site,以及ISelectionService机制,来处理试图之间的简单的交互。简单的说,ViewSite提供了一个交互的中心点,其它View向ViewSite提供选择事件,或者向其注册监听器,而事件的触发与转发则由ViewSite()来完成。 这应该也是一个设计模式,不过我还没想到比较接近的设计模式的名字。如果勉强要使用一个的话,我认为“Mediator”(调停者模式)可能比较适合(欢迎发表见解)。 为了在这个机制中扮演角色,视图通常需要实现两类接口,或者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()方法就会被调用。 注意SelectionProvider和SelectionListener并不直接对应。这个地方有一点容易混淆,就是Eclipse实际上提供有两套与Selection相关的事件与接口: ISelectionChangedListener <--> ISelectionProvider 这个是JFace中的选择监听机制,对试图或者控件而言,它提供对原始的选择事件的通知与响应。ISelectionProvider需要注册在Site上,以供ISelectionSerivce使用,将选择事件扩散到其他的ISelectionListener中。 ISelectionListener <--> ISelectionService 这个是在Site中使用的,ISelectionService不需要自己实现,已经实现好了,ISelectionListener则需要注册到ISelectionService上,以对其它SelectionProvider的事件响应进行监听。 在Eclipse本身的实现中,PropertySheet和Outline都使用了这种机制。不过需要注意的是,缺省的PropertyShee需要接受一个IStructuredSelection,而不仅仅是一个ISelection。因此,如果ISeletionProvider需要提供一个能够让PropertySheet进行显示的对象的话,除了除了要实现ISelection接口外,还需要对其进行封装成一个IStructuredSelection。这个比较简单,直接调用StructuredSelection构造函数即可。
调停者模式Blabla...